STM/Stm/StmPkg/Include/Library/Vmx.h

1007 lines
29 KiB
C

/** @file
VMX header file
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _VMX_H_
#define _VMX_H_
#ifdef __GNUC__
#define MSABI __attribute__((ms_abi))
#else
#define MSABI
#endif
#include "CpuArchSpecific.h"
#define IA32_SMM_MONITOR_CTL_MSR_INDEX 0x9B
#define IA32_SMM_MONITOR_VALID 1u
#define IA32_SMM_MONITOR_SMI_UNBLOCKING_BY_VMX_OFF (1u << 2) // If IA32_VMX_MISC[bit 28])
#define IA32_SMBASE_INDEX 0x9E // if IA32_VMX_MISC[bit 15] = 1
#define IA32_VMX_BASIC_MSR_INDEX 0x480
#define IA32_VMX_PINBASED_CTLS_MSR_INDEX 0x481
#define IA32_VMX_PROCBASED_CTLS_MSR_INDEX 0x482
#define IA32_VMX_EXIT_CTLS_MSR_INDEX 0x483
#define IA32_VMX_ENTRY_CTLS_MSR_INDEX 0x484
#define IA32_VMX_MISC_MSR_INDEX 0x485
#define IA32_VMX_CR0_FIXED0_MSR_INDEX 0x486
#define IA32_VMX_CR0_FIXED1_MSR_INDEX 0x487
#define IA32_VMX_CR4_FIXED0_MSR_INDEX 0x488
#define IA32_VMX_CR4_FIXED1_MSR_INDEX 0x489
#define IA32_VMX_VMCS_ENUM_MSR_INDEX 0x48A
#define IA32_VMX_PROCBASED_CTLS2_MSR_INDEX 0x48B
#define IA32_VMX_EPT_VPID_CAP_MSR_INDEX 0x48C
#define VMCS_16_CONTROL_VPID_INDEX 0x0000
#define VMCS_16_GUEST_ES_INDEX 0x0800
#define VMCS_16_GUEST_CS_INDEX 0x0802
#define VMCS_16_GUEST_SS_INDEX 0x0804
#define VMCS_16_GUEST_DS_INDEX 0x0806
#define VMCS_16_GUEST_FS_INDEX 0x0808
#define VMCS_16_GUEST_GS_INDEX 0x080A
#define VMCS_16_GUEST_LDTR_INDEX 0x080C
#define VMCS_16_GUEST_TR_INDEX 0x080E
#define VMCS_16_HOST_ES_INDEX 0x0C00
#define VMCS_16_HOST_CS_INDEX 0x0C02
#define VMCS_16_HOST_SS_INDEX 0x0C04
#define VMCS_16_HOST_DS_INDEX 0x0C06
#define VMCS_16_HOST_FS_INDEX 0x0C08
#define VMCS_16_HOST_GS_INDEX 0x0C0A
#define VMCS_16_HOST_TR_INDEX 0x0C0C
#define VMCS_64_CONTROL_IO_BITMAP_A_INDEX 0x2000
#define VMCS_64_CONTROL_IO_BITMAP_B_INDEX 0x2002
#define VMCS_64_CONTROL_MSR_BITMAP_INDEX 0x2004
#define VMCS_64_CONTROL_VMEXIT_MSR_STORE_INDEX 0x2006
#define VMCS_64_CONTROL_VMEXIT_MSR_LOAD_INDEX 0x2008
#define VMCS_64_CONTROL_VMENTRY_MSR_LOAD_INDEX 0x200A
#define VMCS_64_CONTROL_EXECUTIVE_VMCS_PTR_INDEX 0x200C
#define VMCS_64_CONTROL_TSC_OFFSET_INDEX 0x2010
#define VMCS_64_CONTROL_VIRTUAL_APIC_ADDR_INDEX 0x2012
#define VMCS_64_CONTROL_APIC_ACCESS_ADDR_INDEX 0x2014
#define VMCS_64_CONTROL_VM_FUNCTION_CONTROLS_INDEX 0x2018
#define VMCS_64_CONTROL_EPT_PTR_INDEX 0x201A
#define VMCS_64_CONTROL_EPTP_LIST_ADDRESS_INDEX 0x2024
#define VMCS_64_RO_GUEST_PHYSICAL_ADDR_INDEX 0x2400
#define VMCS_64_GUEST_VMCS_LINK_PTR_INDEX 0x2800
#define VMCS_64_GUEST_IA32_DEBUGCTL_INDEX 0x2802
#define VMCS_64_GUEST_IA32_PAT_INDEX 0x2804
#define VMCS_64_GUEST_IA32_EFER_INDEX 0x2806
#define VMCS_64_GUEST_IA32_PERF_GLOBAL_CTRL_INDEX 0x2808
#define VMCS_64_GUEST_PDPTE0_INDEX 0x280A
#define VMCS_64_GUEST_PDPTE1_INDEX 0x280C
#define VMCS_64_GUEST_PDPTE2_INDEX 0x280E
#define VMCS_64_GUEST_PDPTE3_INDEX 0x2810
#define VMCS_64_HOST_IA32_PAT_INDEX 0x2C00
#define VMCS_64_HOST_IA32_EFER_INDEX 0x2C02
#define VMCS_64_HOST_IA32_PERF_GLOBAL_CTRL_INDEX 0x2C04
#define VMCS_32_CONTROL_PIN_BASED_VM_EXECUTION_INDEX 0x4000
#define VMCS_32_CONTROL_PROCESSOR_BASED_VM_EXECUTION_INDEX 0x4002
#define VMCS_32_CONTROL_EXCEPTION_BITMAP_INDEX 0x4004
#define VMCS_32_CONTROL_PAGE_FAULT_ERROR_CODE_MASK_INDEX 0x4006
#define VMCS_32_CONTROL_PAGE_FAULT_ERROR_CODE_MATCH_INDEX 0x4008
#define VMCS_32_CONTROL_CR3_TARGET_COUNT_INDEX 0x400A
#define VMCS_32_CONTROL_VMEXIT_CONTROLS_INDEX 0x400C
#define VMCS_32_CONTROL_VMEXIT_MSR_STORE_COUNT_INDEX 0x400E
#define VMCS_32_CONTROL_VMEXIT_MSR_LOAD_COUNT_INDEX 0x4010
#define VMCS_32_CONTROL_VMENTRY_CONTROLS_INDEX 0x4012
#define VMCS_32_CONTROL_VMENTRY_MSR_LOAD_COUNT_INDEX 0x4014
#define VMCS_32_CONTROL_VMENTRY_INTERRUPTION_INFO_INDEX 0x4016
#define VMCS_32_CONTROL_VMENTRY_EXCEPTION_ERROR_CODE_INDEX 0x4018
#define VMCS_32_CONTROL_VMENTRY_INSTRUCTION_LENGTH_INDEX 0x401A
#define VMCS_32_CONTROL_TPR_THRESHOLD_INDEX 0x401C
#define VMCS_32_CONTROL_2ND_PROCESSOR_BASED_VM_EXECUTION_INDEX 0x401E
#define VMCS_32_CONTROL_PLE_GAP_INDEX 0x4020
#define VMCS_32_CONTROL_PLE_WINDOW_INDEX 0x4022
#define VMCS_32_RO_VM_INSTRUCTION_ERROR_INDEX 0x4400
#define VMCS_32_RO_EXIT_REASON_INDEX 0x4402
#define VMCS_32_RO_VMEXIT_INTERRUPTION_INFO_INDEX 0x4404
#define VMCS_32_RO_VMEXIT_INTERRUPTION_ERROR_CODE_INDEX 0x4406
#define VMCS_32_RO_IDT_VECTORING_INFO_INDEX 0x4408
#define VMCS_32_RO_IDT_VECTORING_ERROR_CODE_INDEX 0x440A
#define VMCS_32_RO_VMEXIT_INSTRUCTION_LENGTH_INDEX 0x440C
#define VMCS_32_RO_VMEXIT_INSTRUCTION_INFO_INDEX 0x440E
#define VMCS_32_GUEST_ES_LIMIT_INDEX 0x4800
#define VMCS_32_GUEST_CS_LIMIT_INDEX 0x4802
#define VMCS_32_GUEST_SS_LIMIT_INDEX 0x4804
#define VMCS_32_GUEST_DS_LIMIT_INDEX 0x4806
#define VMCS_32_GUEST_FS_LIMIT_INDEX 0x4808
#define VMCS_32_GUEST_GS_LIMIT_INDEX 0x480A
#define VMCS_32_GUEST_LDTR_LIMIT_INDEX 0x480C
#define VMCS_32_GUEST_TR_LIMIT_INDEX 0x480E
#define VMCS_32_GUEST_GDTR_LIMIT_INDEX 0x4810
#define VMCS_32_GUEST_IDTR_LIMIT_INDEX 0x4812
#define VMCS_32_GUEST_ES_ACCESS_RIGHT_INDEX 0x4814
#define VMCS_32_GUEST_CS_ACCESS_RIGHT_INDEX 0x4816
#define VMCS_32_GUEST_SS_ACCESS_RIGHT_INDEX 0x4818
#define VMCS_32_GUEST_DS_ACCESS_RIGHT_INDEX 0x481A
#define VMCS_32_GUEST_FS_ACCESS_RIGHT_INDEX 0x481C
#define VMCS_32_GUEST_GS_ACCESS_RIGHT_INDEX 0x481E
#define VMCS_32_GUEST_LDTR_ACCESS_RIGHT_INDEX 0x4820
#define VMCS_32_GUEST_TR_ACCESS_RIGHT_INDEX 0x4822
#define VMCS_32_GUEST_INTERRUPTIBILITY_STATE_INDEX 0x4824
#define VMCS_32_GUEST_ACTIVITY_STATE_INDEX 0x4826
#define VMCS_32_GUEST_SMBASE_INDEX 0x4828
#define VMCS_32_GUEST_IA32_SYSENTER_CS_INDEX 0x482A
#define VMCS_32_GUEST_VMX_PREEMPTION_TIMER_VALUE_INDEX 0x482E
#define VMCS_32_HOST_IA32_SYSENTER_CS_INDEX 0x4C00
#define VMCS_N_CONTROL_CR0_GUEST_HOST_MASK_INDEX 0x6000
#define VMCS_N_CONTROL_CR4_GUEST_HOST_MASK_INDEX 0x6002
#define VMCS_N_CONTROL_CR0_READ_SHADOW_INDEX 0x6004
#define VMCS_N_CONTROL_CR4_READ_SHADOW_INDEX 0x6006
#define VMCS_N_CONTROL_CR3_TARGET_VALUE0_INDEX 0x6008
#define VMCS_N_CONTROL_CR3_TARGET_VALUE1_INDEX 0x600A
#define VMCS_N_CONTROL_CR3_TARGET_VALUE2_INDEX 0x600C
#define VMCS_N_CONTROL_CR3_TARGET_VALUE3_INDEX 0x600E
#define VMCS_N_RO_EXIT_QUALIFICATION_INDEX 0x6400
#define VMCS_N_RO_IO_RCX_INDEX 0x6402
#define VMCS_N_RO_IO_RSI_INDEX 0x6404
#define VMCS_N_RO_IO_RDI_INDEX 0x6406
#define VMCS_N_RO_IO_RIP_INDEX 0x6408
#define VMCS_N_RO_GUEST_LINEAR_ADDR_INDEX 0x640A
#define VMCS_N_GUEST_CR0_INDEX 0x6800
#define VMCS_N_GUEST_CR3_INDEX 0x6802
#define VMCS_N_GUEST_CR4_INDEX 0x6804
#define VMCS_N_GUEST_ES_BASE_INDEX 0x6806
#define VMCS_N_GUEST_CS_BASE_INDEX 0x6808
#define VMCS_N_GUEST_SS_BASE_INDEX 0x680A
#define VMCS_N_GUEST_DS_BASE_INDEX 0x680C
#define VMCS_N_GUEST_FS_BASE_INDEX 0x680E
#define VMCS_N_GUEST_GS_BASE_INDEX 0x6810
#define VMCS_N_GUEST_LDTR_BASE_INDEX 0x6812
#define VMCS_N_GUEST_TR_BASE_INDEX 0x6814
#define VMCS_N_GUEST_GDTR_BASE_INDEX 0x6816
#define VMCS_N_GUEST_IDTR_BASE_INDEX 0x6818
#define VMCS_N_GUEST_DR7_INDEX 0x681A
#define VMCS_N_GUEST_RSP_INDEX 0x681C
#define VMCS_N_GUEST_RIP_INDEX 0x681E
#define VMCS_N_GUEST_RFLAGS_INDEX 0x6820
#define VMCS_N_GUEST_PENDING_DEBUG_EXCEPTIONS_INDEX 0x6822
#define VMCS_N_GUEST_IA32_SYSENTER_ESP_INDEX 0x6824
#define VMCS_N_GUEST_IA32_SYSENTER_EIP_INDEX 0x6826
#define VMCS_N_HOST_CR0_INDEX 0x6C00
#define VMCS_N_HOST_CR3_INDEX 0x6C02
#define VMCS_N_HOST_CR4_INDEX 0x6C04
#define VMCS_N_HOST_FS_BASE_INDEX 0x6C06
#define VMCS_N_HOST_GS_BASE_INDEX 0x6C08
#define VMCS_N_HOST_TR_BASE_INDEX 0x6C0A
#define VMCS_N_HOST_GDTR_BASE_INDEX 0x6C0C
#define VMCS_N_HOST_IDTR_BASE_INDEX 0x6C0E
#define VMCS_N_HOST_IA32_SYSENTER_ESP_INDEX 0x6C10
#define VMCS_N_HOST_IA32_SYSENTER_EIP_INDEX 0x6C12
#define VMCS_N_HOST_RSP_INDEX 0x6C14
#define VMCS_N_HOST_RIP_INDEX 0x6C16
typedef enum {
VmExitReasonExceptionNmi,
VmExitReasonExternalInterrupt,
VmExitReasonTripleFault,
VmExitReasonInit,
VmExitReasonSipi,
VmExitReasonIoSmi,
VmExitReasonOtherSmi,
VmExitReasonInterruptWindow,
VmExitReasonNmiWindow,
VmExitReasonTaskSwitch,
VmExitReasonCpuid,
VmExitReasonGetsec,
VmExitReasonHlt,
VmExitReasonInvd,
VmExitReasonInvlpg,
VmExitReasonRdpmc,
VmExitReasonRdtsc,
VmExitReasonRsm,
VmExitReasonVmCall,
VmExitReasonVmClear,
VmExitReasonVmLaunch,
VmExitReasonVmPtrld,
VmExitReasonVmptrst,
VmExitReasonVmRead,
VmExitReasonVmResume,
VmExitReasonVmWrite,
VmExitReasonVmxOff,
VmExitReasonVmxOn,
VmExitReasonCrAccess,
VmExitReasonMovDr,
VmExitReasonIoInstruction,
VmExitReasonRdmsr,
VmExitReasonWrmsr,
VmExitReasonVmEntryFailureDueToInvalidGuestState,
VmExitReasonVmEntryFailureDueToMsrLoading,
VmExitReason35,
VmExitReasonMwait,
VmExitReasonMonitorTrapFlag,
VmExitReason38,
VmExitReasonMonitor,
VmExitReasonPause,
VmExitReasonVmEntryFailureDueToMachineCheck,
VmExitReason42,
VmExitReasonTprBelowThreshold,
VmExitReasonApicAccess,
VmExitReason45,
VmExitReasonAccessGdtrIdtr,
VmExitReasonAccessLdtrTr,
VmExitReasonEptViolation,
VmExitReasonEptMisConfiguration,
VmExitReasonInvEpt,
VmExitReasonRdtscp,
VmExitReasonVmxPreEmptionTimerExpired,
VmExitReasonInvVpid,
VmExitReasonWbinvd,
VmExitReasonXsetbv,
VmExitReason56,
VmExitReasonRdrand,
VmExitReasonInvpcid,
VmExitReasonVmfunc,
VmExitReasonMax,
} VMX_BASIC_EXIT_REASON;
typedef enum {
VmxFailError0,
VmxFailErrorVmCallExecutedInVmxRootOperation,
VmxFailErrorVmClearWithInvalidPhysicalAddress,
VmxFailErrorVmClearWithVmxOnPointer,
VmxFailErrorVmLaunchWithNonClearVmcs,
VmxFailErrorVmResumeWithNonLaunchedVmcs,
VmxFailErrorVmResumeWithCorruptedVmcs,
VmxFailErrorVmEntryWithInvalidControlField,
VmxFailErrorVmEntryWithInvalidHostField,
VmxFailErrorVmPtrldWithInvalidPhysicalAddress,
VmxFailErrorVmPtrldWithVmxOnPointer,
VmxFailErrorVmPtrldWithIncorrectVmcsRevisionIdentifier,
VmxFailErrorVmReadVmWriteFromToUnsupportedVmcsComponent,
VmxFailErrorVmWriteToReadOnlyVmcsComponent,
VmxFailError14,
VmxFailErrorVmxOnExecutedInVmxRootOperation,
VmxFailErrorVmEntryWithInvalidExecutiveVmcsPointer,
VmxFailErrorVmEntryWithNonLaunchedExecutive_VMCS,
VmxFailErrorVmEntryWithExecutiveVmcsPointerNotVmxOnPointer,
VmxFailErrorVmCallWithNonClearVmcs,
VmxFailErrorVmCallWithInvalidVmExitControlFields,
VmxFailError21,
VmxFailErrorVmCallWithIncorrectMsegRevisionIdentifier,
VmxFailErrorVmxOffUnderDualMonitorTreatmentOfSmisAndSmm,
VmxFailErrorVmCallWithInvalidSmmMonitorFeatures,
VmxFailErrorVmEntryWithInvalidVmExectionControlFieldsInExecutiveVmcs,
VmxFailErrorVmEntryWithEventsBlockedByMovSs,
VmxFailError27,
VmxFailErrorInvalidOperandToInvEptInvVpid,
VmxFailError29,
VmxFailErrorMax,
} VMX_FAIL_ERROR_NUMBER;
#pragma pack (push, 1)
#define GUEST_ACTIVITY_STATE_ACTIVE 0
#define GUEST_ACTIVITY_STATE_HLT 1
#define GUEST_ACTIVITY_STATE_SHUTDOWN 2
#define GUEST_ACTIVITY_STATE_WAIT_FOR_SIPI 3
typedef struct {
UINT32 BlockingBySti:1;
UINT32 BlockingByMovSs:1;
UINT32 BlockingBySmi:1;
UINT32 BlockingByNmi:1;
UINT32 Rsvd4To31:28;
} GUEST_INTERRUPTIBILITY_STATE_BITS;
typedef union {
GUEST_INTERRUPTIBILITY_STATE_BITS Bits;
UINT32 Uint32;
} GUEST_INTERRUPTIBILITY_STATE;
typedef struct {
UINT64 Bp0:1;
UINT64 Bp1:1;
UINT64 Bp2:1;
UINT64 Bp3:1;
UINT64 Rsvd4To11:8;
UINT64 EnableBreakpoint:1;
UINT64 Rsvd13:1;
UINT64 Bs:1;
UINT64 Rsvd15To63:49;
} PENDING_DEBUG_EXCEPTION_BITS;
typedef union {
PENDING_DEBUG_EXCEPTION_BITS Bits;
UINT64 Uint64;
} PENDING_DEBUG_EXCEPTION;
typedef struct {
UINT32 ExternalInterrupt:1;
UINT32 Rsvd1To2:2;
UINT32 Nmi:1;
UINT32 Rsvd4:1;
UINT32 VirtualNmi:1;
UINT32 VmxPreemptionTimer:1;
UINT32 Rsvd7To31:25;
} VM_EXEC_PIN_BASES_VMEXIT_CONTROLS_BITS;
typedef union {
VM_EXEC_PIN_BASES_VMEXIT_CONTROLS_BITS Bits;
UINT32 Uint32;
} VM_EXEC_PIN_BASES_VMEXIT_CONTROLS;
typedef struct {
UINT32 Rsvd0To1:2;
UINT32 InterruptWindow:1;
UINT32 TscOffsetting:1;
UINT32 Rsvd4To6:3;
UINT32 Hlt:1;
UINT32 Rsvd8:1;
UINT32 Invlpg:1;
UINT32 Mwait:1;
UINT32 Rdpmc:1;
UINT32 Rdtsc:1;
UINT32 Rsvd13To14:2;
UINT32 Cr3Load:1;
UINT32 Cr3Store:1;
UINT32 Rsvd17To18:2;
UINT32 Cr8Load:1;
UINT32 Cr8Store:1;
UINT32 TprShadow:1;
UINT32 NmiWindow:1;
UINT32 MovDr:1;
UINT32 UnconditionalIo:1;
UINT32 IoBitmap:1;
UINT32 Rsvd26:1;
UINT32 MonitorTrapFlag:1;
UINT32 MsrBitmap:1;
UINT32 Monitor:1;
UINT32 Pause:1;
UINT32 SecondaryControl:1;
} VM_EXEC_PROCESSOR_BASES_VMEXIT_CONTROLS_BITS;
typedef union {
VM_EXEC_PROCESSOR_BASES_VMEXIT_CONTROLS_BITS Bits;
UINT32 Uint32;
} VM_EXEC_PROCESSOR_BASES_VMEXIT_CONTROLS;
typedef struct {
UINT32 VirtualApic:1;
UINT32 Ept:1;
UINT32 DescriptorTable:1;
UINT32 Rdtscp:1;
UINT32 VirtualizeX2Apic:1;
UINT32 Vpid:1;
UINT32 Wbinvd:1;
UINT32 UnrestrictedGuest:1;
UINT32 Rsvd8To9:2;
UINT32 PauseLoop:1;
UINT32 RdrandExit:1;
UINT32 EnableInvpcid:1;
UINT32 EnableVmFunctions:1;
UINT32 Rsvd14To31:18;
} VM_EXEC_2ND_PROCESSOR_BASES_VMEXIT_CONTROLS_BITS;
typedef union {
VM_EXEC_2ND_PROCESSOR_BASES_VMEXIT_CONTROLS_BITS Bits;
UINT32 Uint32;
} VM_EXEC_2ND_PROCESSOR_BASES_VMEXIT_CONTROLS;
#define EPT_GAW_21BIT 0
#define EPT_GAW_30BIT 1
#define EPT_GAW_39BIT 2
#define EPT_GAW_48BIT 3
#define EPT_GAW_57BIT 4
typedef struct {
UINT64 Etmt:3; // EPT Table Memory Type
UINT64 Gaw:3; // Guest Address Width
UINT64 Rsvd6To11:6;
UINT64 Asr:52; // Address space root
} EPT_POINTER_BITS;
typedef struct {
UINT32 Etmt:3; // EPT Table Memory Type
UINT32 Gaw:3; // Guest Address Width
UINT32 Rsvd6To11:6;
UINT32 AsrLo:20;
UINT32 AsrHi;
} EPT_POINTER_BITS32;
typedef union {
EPT_POINTER_BITS Bits;
UINT64 Uint64;
EPT_POINTER_BITS32 Bits32;
} EPT_POINTER;
typedef struct {
UINT64 Ra:1;
UINT64 Wa:1;
UINT64 Xa:1;
UINT64 Emt:3; // EPT Memory Type
UINT64 Igmt:1; // Ignore PAT Memory Type
UINT64 Sp:1; // Super page
UINT64 Avail8To11:4;
UINT64 Addr:40;
UINT64 Avail52To63:12;
} EPT_ENTRY_BITS;
typedef struct {
UINT32 Ra:1;
UINT32 Wa:1;
UINT32 Xa:1;
UINT32 Emt:3; // EPT Memory Type
UINT32 Igmt:1; // Ignore PAT Memory Type
UINT32 Sp:1; // Super page
UINT32 Avail8To11:4;
UINT32 AddrLo:20;
UINT32 AddrHi:20;
UINT32 Avail52To63:12;
} EPT_ENTRY_BITS32;
typedef union {
EPT_ENTRY_BITS Bits;
UINT64 Uint64;
EPT_ENTRY_BITS32 Bits32;
} EPT_ENTRY;
typedef struct {
UINT32 Rsvd0To1:2;
UINT32 SaveDebugControls:1;
UINT32 Rsvd3To8:6;
UINT32 Ia32eHost:1;
UINT32 Rsvd10To11:2;
UINT32 LoadIA32_PERF_GLOBAL_CTRL:1;
UINT32 Rsvd13To14:2;
UINT32 AcknowledgeInterrupt:1;
UINT32 Rsvd16To17:2;
UINT32 SaveIA32_PAT:1;
UINT32 LoadIA32_PAT:1;
UINT32 SaveIA32_EFER:1;
UINT32 LoadIA32_EFER:1;
UINT32 SaveVmxPreemptionTimerValue:1;
UINT32 Rsvd23To31:9;
} VM_EXIT_CONTROLS_BITS;
typedef union {
VM_EXIT_CONTROLS_BITS Bits;
UINT32 Uint32;
} VM_EXIT_CONTROLS;
typedef struct {
UINT32 MsrIndex;
UINT32 Reserved;
UINT64 MsrData;
} VM_EXIT_MSR_ENTRY;
typedef struct {
UINT32 Rsvd0To1:2;
UINT32 LoadDebugControls:1;
UINT32 Rsvd3To8:6;
UINT32 Ia32eGuest:1;
UINT32 EntryToSmm:1;
UINT32 DeactivateDualMonitor:1;
UINT32 Rsvd12:1;
UINT32 LoadIA32_PERF_GLOBAL_CTRL:1;
UINT32 LoadIA32_PAT:1;
UINT32 LoadIA32_EFER:1;
UINT32 Rsvd16To31:16;
} VM_ENTRY_CONTROLS_BITS;
typedef union {
VM_ENTRY_CONTROLS_BITS Bits;
UINT32 Uint32;
} VM_ENTRY_CONTROLS;
typedef struct {
UINT32 Vector:8;
UINT32 InterruptType:3;
UINT32 DeliverErrorCode:1;
UINT32 Rsvd12To30:19;
UINT32 Valid:1;
} VM_ENTRY_CONTROL_INTERRUPT_BITS;
typedef union {
VM_ENTRY_CONTROL_INTERRUPT_BITS Bits;
UINT32 Uint32;
} VM_ENTRY_CONTROL_INTERRUPT;
typedef struct {
UINT32 Reason:16;
UINT32 Rsvd16To27:12;
UINT32 PendingMtf:1;
UINT32 FromVmxRootOperation:1;
UINT32 Rsvd30:1;
UINT32 VmEntryFail:1;
} VM_EXIT_INFO_BASIC_BITS;
typedef union {
VM_EXIT_INFO_BASIC_BITS Bits;
UINT32 Uint32;
} VM_EXIT_INFO_BASIC;
typedef struct {
UINT32 Bp0:1;
UINT32 Bp1:1;
UINT32 Bp2:1;
UINT32 Bp3:1;
UINT32 Rsvd4To12:9;
UINT32 Bd:1;
UINT32 Bs:1;
UINT32 Rsvd15To31:17;
} VM_EXIT_QUALIFICATION_DEBUG_EXCEPTION;
#define TASK_SWITCH_SOURCE_CALL 0
#define TASK_SWITCH_SOURCE_IRET 1
#define TASK_SWITCH_SOURCE_JMP 2
#define TASK_SWITCH_SOURCE_TASK_GATE 3
typedef struct {
UINT32 Tss:16;
UINT32 Rsvd16To29:14;
UINT32 TaskType:2;
} VM_EXIT_QUALIFICATION_TASK_SWITCH;
typedef struct {
UINT32 CrNum:4;
UINT32 AccessType:2;
UINT32 LmswType:1;
UINT32 Rsvd7:1;
UINT32 GpReg:4;
UINT32 Rsvd12To15:4;
UINT32 LmswSource:16;
} VM_EXIT_QUALIFICATION_CR_ACCESS;
typedef struct {
UINT32 DrNum:3;
UINT32 Rsvd3:1;
UINT32 Direction:1;
UINT32 Rsvd5To7:3;
UINT32 GpReg:4;
UINT32 Rsvd12To31:20;
} VM_EXIT_QUALIFICATION_MOV_DR;
typedef struct {
UINT32 Size:3;
UINT32 Direction:1;
UINT32 String:1;
UINT32 Rep:1;
UINT32 Operand:1;
UINT32 Rsvd7To15:9;
UINT32 PortNum:16;
} VM_EXIT_QUALIFICATION_IO_INSTRUCTION;
typedef struct {
UINT32 Offset:12;
UINT32 AccessType:4;
UINT32 Rsvd15To31:16;
} VM_EXIT_QUALIFICATION_APIC_ACCESS;
typedef struct {
UINT32 Ra:1;
UINT32 Wa:1;
UINT32 Xa:1;
UINT32 EptR:1;
UINT32 EptW:1;
UINT32 EptX:1;
UINT32 Rsvd6:1;
UINT32 GlaValid:1;
UINT32 Gpa:1;
UINT32 Rsvd9To11:3;
UINT32 NmiUnblockingDueToIret:1;
UINT32 Rsvd13To31:19;
} VM_EXIT_QUALIFICATION_EPT_VIOLATION;
typedef union {
VM_EXIT_QUALIFICATION_DEBUG_EXCEPTION DebugExceptions;
VM_EXIT_QUALIFICATION_TASK_SWITCH TaskSwitch;
VM_EXIT_QUALIFICATION_CR_ACCESS CrAccess;
VM_EXIT_QUALIFICATION_MOV_DR MovDr;
VM_EXIT_QUALIFICATION_IO_INSTRUCTION IoInstruction;
VM_EXIT_QUALIFICATION_APIC_ACCESS ApicAccess;
VM_EXIT_QUALIFICATION_EPT_VIOLATION EptViolation;
UINTN UintN;
} VM_EXIT_QUALIFICATION;
#define VM_EXIT_INSTRUCTION_ADDRESS_SIZE_16 0
#define VM_EXIT_INSTRUCTION_ADDRESS_SIZE_32 1
#define VM_EXIT_INSTRUCTION_ADDRESS_SIZE_64 2
#define VM_EXIT_INSTRUCTION_SEGMENT_ES 0
#define VM_EXIT_INSTRUCTION_SEGMENT_CS 1
#define VM_EXIT_INSTRUCTION_SEGMENT_SS 2
#define VM_EXIT_INSTRUCTION_SEGMENT_DS 3
#define VM_EXIT_INSTRUCTION_SEGMENT_FS 4
#define VM_EXIT_INSTRUCTION_SEGMENT_GS 5
typedef struct {
UINT32 Rsvd0To6:7;
UINT32 Size:3;
UINT32 Rsvd10To14:5;
UINT32 Segment:3;
UINT32 Rsvd18To31:14;
} VM_EXIT_INSTRUCTION_INFORMATION_BITS;
typedef union {
VM_EXIT_INSTRUCTION_INFORMATION_BITS InOuts;
UINT32 Uint32;
} VM_EXIT_INSTRUCTION_INFORMATION;
#define INTERRUPT_TYPE_EXTERNAL_EXTERNAL_INTERRUPT 0
#define INTERRUPT_TYPE_EXTERNAL_NMI 2
#define INTERRUPT_TYPE_EXTERNAL_HARDWARE_EXCEPTION 3
#define INTERRUPT_TYPE_EXTERNAL_SOFTWARE_INTERRUPT 4
#define INTERRUPT_TYPE_EXTERNAL_PRIVILEDGED_SOFTWARE_EXCEPTION 5
#define INTERRUPT_TYPE_EXTERNAL_SOFTWARE_EXCEPTIONT 6
#define INTERRUPT_TYPE_OTHER_EVENT 7
typedef struct {
UINT32 Vector:8;
UINT32 InterruptType:3;
UINT32 ErrorCodeValid:1;
UINT32 NmiUnblockingDueToIret:1;
UINT32 Rsvd13To30:18;
UINT32 Valid:1;
} VM_EXIT_INFO_INTERRUPTION_BITS;
typedef union {
VM_EXIT_INFO_INTERRUPTION_BITS Bits;
UINT32 Uint32;
} VM_EXIT_INFO_INTERRUPTION;
typedef struct {
UINT32 Vector:8;
UINT32 InterruptType:3;
UINT32 ErrorCodeValid:1;
UINT32 Rsvd12To30:19;
UINT32 Valid:1;
} VM_EXIT_INFO_IDT_VECTORING_BITS;
typedef union {
VM_EXIT_INFO_IDT_VECTORING_BITS Bits;
UINT32 Uint32;
} VM_EXIT_INFO_IDT_VECTORING;
typedef struct {
UINT32 RevisionIdentifier:32;
UINT32 VmcsRegionSize:13;
UINT32 Rsvd45To47:3;
UINT32 VmcsAddrWidth:1;
UINT32 DualMonitorTreatment:1;
UINT32 VmcsMemoryType:4;
UINT32 VmExitInstructionInformation:1;
UINT32 VmxControlDefaultClear:1;
UINT32 Rsvd56To63:8;
} IA32_VMX_BASIC_MSR_BITS;
typedef union {
IA32_VMX_BASIC_MSR_BITS Bits;
UINT64 Uint64;
} IA32_VMX_BASIC_MSR;
typedef struct {
UINT32 VmxPreemptionTimerRate:5;
UINT32 Ia32eToEFER:1;
UINT32 ActivityStateSupportHlt:1;
UINT32 ActivityStateSupportShutdown:1;
UINT32 ActivityStateSupportWaitForSipi:1;
UINT32 Rsvd9To15:7;
UINT32 NumberOfCr3TargetValue:9;
UINT32 MaxNumberOfMsrInStoreList:3;
UINT32 VmxOffUnblockSmiSupport:1;
UINT32 Rsvd29To31:3;
UINT32 MsegRevisionIdentifier:32;
} IA32_VMX_MISC_MSR_BITS;
typedef union {
IA32_VMX_MISC_MSR_BITS Bits;
UINT64 Uint64;
} IA32_VMX_MISC_MSR;
#pragma pack (pop)
/**
This function read UINT16 data from VMCS region.
@param Index VMCS region index
@return VMCS region value
**/
UINT16
VmRead16 (
IN UINT32 Index
);
/**
This function read UINT32 data from VMCS region.
@param Index VMCS region index
@return VMCS region value
**/
UINT32
VmRead32 (
IN UINT32 Index
);
/**
This function read UINT64 data from VMCS region.
@param Index VMCS region index
@return VMCS region value
**/
UINT64
VmRead64 (
IN UINT32 Index
);
/**
This function read UINTN data from VMCS region.
@param Index VMCS region index
@return VMCS region value
**/
UINTN
VmReadN (
IN UINT32 Index
);
/**
This function write UINN16 data to VMCS region.
@param Index VMCS region index
@param Data VMCS region value
**/
VOID
VmWrite16 (
IN UINT32 Index,
IN UINT16 Data
);
/**
This function write UINN32 data to VMCS region.
@param Index VMCS region index
@param Data VMCS region value
**/
VOID
VmWrite32 (
IN UINT32 Index,
IN UINT32 Data
);
/**
This function write UINN64 data to VMCS region.
@param Index VMCS region index
@param Data VMCS region value
**/
VOID
VmWrite64 (
IN UINT32 Index,
IN UINT64 Data
);
/**
This function write UINNN data to VMCS region.
@param Index VMCS region index
@param Data VMCS region value
**/
VOID
VmWriteN (
IN UINT32 Index,
IN UINTN Data
);
/**
This function enter VMX.
@param Vmcs VMCS pointer
@return RFLAGS if VmxOn fail
**/
UINTN
AsmVmxOn (
IN UINT64 *Vmcs
);
/**
This function leave VMX.
@return RFLAGS if VmxOff fail
**/
UINTN
AsmVmxOff (
VOID
);
/**
This function clear VMCS.
@param Vmcs VMCS pointer
@return RFLAGS if VmClear fail
**/
UINTN
AsmVmClear (
IN UINT64 *Vmcs
) MSABI;
/**
This function store VMCS.
@param Vmcs VMCS pointer
@return RFLAGS if VmPtrStore fail
**/
UINTN
AsmVmPtrStore (
IN UINT64 *Vmcs
) MSABI;
/**
This function load VMCS.
@param Vmcs VMCS pointer
@return RFLAGS if VmPtrLoad fail
**/
UINTN
AsmVmPtrLoad (
IN UINT64 *Vmcs
) MSABI;
/**
This function launch VM.
@param Register General purpose register set
@return RFLAGS if VmLaunch fail
**/
UINTN
AsmVmLaunch (
IN X86_REGISTER *Register
) MSABI;
/**
This function resume to VM.
@param Register General purpose register set
@return RFLAGS if VmResume fail
**/
UINTN
AsmVmResume (
IN X86_REGISTER *Register
) MSABI;
/**
This function read VMCS region.
@param Index VMCS region index
@param Data VMCS region value
@return RFLAGS if VmRead fail
**/
UINTN
AsmVmRead (
IN UINT32 Index,
OUT UINTN *Data
) MSABI;
/**
This function write VMCS region.
@param Index VMCS region index
@param Data VMCS region value
@return RFLAGS if VmWrite fail
**/
UINTN
AsmVmWrite (
IN UINT32 Index,
IN UINTN Data
) MSABI;
typedef struct {
UINT64 Lo;
UINT64 Hi;
} UINT_128;
#define INVEPT_TYPE_SINGLE_CONTEXT_INVALIDATION 1
#define INVEPT_TYPE_GLOBAL_INVALIDATION 2
/**
This function invalidate EPT TLB.
@param Type INVEPT type
@param Addr INVEPT desciptor
@return RFLAGS if InvEpt fail
**/
UINTN
AsmInvEpt (
IN UINTN Type,
IN UINT_128 *Addr
) MSABI;
#define INVVPID_TYPE_INDIVIDUAL_ADDRESS_INVALIDATION 1
#define INVVPID_TYPE_SINGLE_CONTEXT_INVALIDATION 2
#define INVVPID_TYPE_ALL_CONTEXTS_INVALIDATION 3
#define INVVPID_TYPE_SINGLE_CONTEXT_INVALIDATION_RETAINING_GLOBAL_TRANSLATION 4
/**
This function invalidate VPID.
@param Type INVVPID type
@param Addr INVVPID desciptor
@return RFLAGS if InvVpid fail
**/
UINTN
AsmInvVpid (
IN UINTN Type,
IN UINT_128 *Addr
) MSABI;
/**
This function invoke VMCALL with context.
@param Eax EAX register
@param Ebx EBX register
@param Ecx ECX register
@param Edx EDX register
@return EAX register
**/
UINT32
AsmVmCall (
IN UINT32 Eax,
IN UINT32 Ebx,
IN UINT32 Ecx,
IN UINT32 Edx
) MSABI;
#endif