enable Penryn VMX capabilities with VMX=1, VMX=2 is required for EPT and heavier stuff

This commit is contained in:
Stanislav Shwartsman 2011-09-26 19:36:20 +00:00
parent 54d1d8aa55
commit 12ad45395b
10 changed files with 51 additions and 33 deletions

View File

@ -3996,10 +3996,10 @@ public: // for now...
BX_SMF void init_VMCS(void);
BX_SMF bx_bool vmcs_field_supported(Bit32u encoding);
BX_SMF void register_vmx_state(bx_param_c *parent);
#if BX_SUPPORT_VMX >= 2
BX_SMF bx_bool is_virtual_apic_page(bx_phy_address paddr) BX_CPP_AttrRegparmN(1);
BX_SMF void VMX_Virtual_Apic_Read(bx_phy_address paddr, unsigned len, void *data);
BX_SMF void VMX_Virtual_Apic_Write(bx_phy_address paddr, unsigned len, void *data);
#if BX_SUPPORT_VMX >= 2
BX_SMF Bit16u VMX_Get_Current_VPID(void);
#endif
#if BX_SUPPORT_X86_64

View File

@ -40,9 +40,6 @@ core2_penryn_t9600_t::core2_penryn_t9600_t(BX_CPU_C *cpu): bx_cpuid_t(cpu)
if (! BX_SUPPORT_X86_64)
BX_PANIC(("You must enable x86-64 for Intel Mobile Core2 Duo T9600 (Penryn) configuration"));
if (BX_SUPPORT_VMX == 1)
BX_INFO(("You must compile with --enable-vmx=2 for Intel Core2 Duo T9600 (Penryn) VMX configuration"));
}
void core2_penryn_t9600_t::get_cpuid_leaf(Bit32u function, Bit32u subfunction, cpuid_function_t *leaf) const
@ -134,7 +131,7 @@ Bit64u core2_penryn_t9600_t::get_isa_extensions_bitmask(void) const
#if BX_SUPPORT_MONITOR_MWAIT
BX_ISA_MONITOR_MWAIT |
#endif
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
BX_ISA_VMX |
#endif
BX_ISA_SMX |
@ -157,7 +154,7 @@ Bit32u core2_penryn_t9600_t::get_cpu_extensions_bitmask(void) const
BX_CPU_NX;
}
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
//
// MSR 00000480 : 005A0800 0000000D BX_MSR_VMX_BASIC
@ -178,9 +175,9 @@ Bit32u core2_penryn_t9600_t::get_vmx_extensions_bitmask(void) const
{
return BX_VMX_TPR_SHADOW |
BX_VMX_VIRTUAL_NMI |
BX_VMX_PERF_GLOBAL_CTRL | /* not implemented */
BX_VMX_APIC_VIRTUALIZATION |
BX_VMX_WBINVD_VMEXIT |
BX_VMX_PERF_GLOBAL_CTRL;
BX_VMX_WBINVD_VMEXIT;
}
#endif
@ -279,7 +276,7 @@ void core2_penryn_t9600_t::get_std_cpuid_leaf_1(cpuid_function_t *leaf) const
BX_CPUID_EXT_MONITOR_MWAIT |
#endif
BX_CPUID_EXT_DS_CPL |
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
BX_CPUID_EXT_VMX |
#endif
BX_CPUID_EXT_SMX |

View File

@ -38,7 +38,7 @@ public:
virtual Bit64u get_isa_extensions_bitmask(void) const;
virtual Bit32u get_cpu_extensions_bitmask(void) const;
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
virtual Bit32u get_vmx_extensions_bitmask(void) const;
#endif

View File

@ -903,9 +903,11 @@ void bx_generic_cpuid_t::init_vmx_extensions_bitmask(void)
if (x86_64_enabled) {
features_bitmask |= BX_VMX_TPR_SHADOW;
features_bitmask |= BX_VMX_APIC_VIRTUALIZATION |
BX_VMX_WBINVD_VMEXIT;
#if BX_SUPPORT_VMX >= 2
features_bitmask |= BX_VMX_APIC_VIRTUALIZATION |
BX_VMX_PREEMPTION_TIMER |
features_bitmask |= BX_VMX_PREEMPTION_TIMER |
BX_VMX_PAT |
BX_VMX_EFER |
BX_VMX_EPT |
@ -913,11 +915,10 @@ void bx_generic_cpuid_t::init_vmx_extensions_bitmask(void)
BX_VMX_UNRESTRICTED_GUEST |
BX_VMX_DESCRIPTOR_TABLE_EXIT |
BX_VMX_X2APIC_VIRTUALIZATION |
BX_VMX_WBINVD_VMEXIT |
BX_VMX_PAUSE_LOOP_EXITING;
features_bitmask |= BX_VMX_CR3_VMEXIT_DISABLE |
BX_VMX_MONITOR_TRAP_FLAG |
/* BX_VMX_MONITOR_TRAP_FLAG | */
BX_VMX_SAVE_DEBUGCTL_DISABLE |
BX_VMX_PERF_GLOBAL_CTRL;
#endif

View File

@ -1740,7 +1740,7 @@ void BX_CPU_C::access_read_linear(bx_address laddr, unsigned len, unsigned curr_
void BX_CPU_C::access_write_physical(bx_phy_address paddr, unsigned len, void *data)
{
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
if (is_virtual_apic_page(paddr)) {
VMX_Virtual_Apic_Write(paddr, len, data);
return;
@ -1759,7 +1759,7 @@ void BX_CPU_C::access_write_physical(bx_phy_address paddr, unsigned len, void *d
void BX_CPU_C::access_read_physical(bx_phy_address paddr, unsigned len, void *data)
{
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
if (is_virtual_apic_page(paddr)) {
VMX_Virtual_Apic_Read(paddr, len, data);
return;
@ -1778,7 +1778,7 @@ void BX_CPU_C::access_read_physical(bx_phy_address paddr, unsigned len, void *da
bx_hostpageaddr_t BX_CPU_C::getHostMemAddr(bx_phy_address ppf, unsigned rw)
{
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
if (is_virtual_apic_page(ppf))
return 0; // Do not allow direct access to virtual apic page
#endif

View File

@ -196,7 +196,7 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::WBINVD(bxInstruction_c *i)
exception(BX_GP_EXCEPTION, 0);
}
#if BX_SUPPORT_VMX >= 2
#if BX_SUPPORT_VMX
if (BX_CPU_THIS_PTR in_vmx_guest)
VMexit_WBINVD(i);
#endif

View File

@ -91,10 +91,7 @@ bx_bool BX_CPU_C::vmcs_field_supported(Bit32u encoding)
/* VMCS 16-bit control fields */
/* binary 0000_00xx_xxxx_xxx0 */
case VMCS_16BIT_CONTROL_VPID:
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_VPID))
return 1;
else
return 0;
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_VPID);
#endif
/* VMCS 16-bit guest-state fields */
@ -146,10 +143,10 @@ bx_bool BX_CPU_C::vmcs_field_supported(Bit32u encoding)
return 0;
#endif
#if BX_SUPPORT_VMX >= 2
case VMCS_32BIT_CONTROL_SECONDARY_VMEXEC_CONTROLS:
return BX_CPU_THIS_PTR vmx_cap.vmx_vmexec_ctrl2_supported_bits;
#if BX_SUPPORT_VMX >= 2
case VMCS_32BIT_CONTROL_PAUSE_LOOP_EXITING_GAP:
case VMCS_32BIT_CONTROL_PAUSE_LOOP_EXITING_WINDOW:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_PAUSE_LOOP_EXITING);
@ -232,11 +229,11 @@ bx_bool BX_CPU_C::vmcs_field_supported(Bit32u encoding)
return 0;
#endif
#if BX_SUPPORT_VMX >= 2
case VMCS_64BIT_CONTROL_APIC_ACCESS_ADDR:
case VMCS_64BIT_CONTROL_APIC_ACCESS_ADDR_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_APIC_VIRTUALIZATION);
#if BX_SUPPORT_VMX >= 2
case VMCS_64BIT_CONTROL_EPTPTR:
case VMCS_64BIT_CONTROL_EPTPTR_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_EPT);
@ -266,11 +263,13 @@ bx_bool BX_CPU_C::vmcs_field_supported(Bit32u encoding)
case VMCS_64BIT_GUEST_IA32_EFER:
case VMCS_64BIT_GUEST_IA32_EFER_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_EFER);
#endif
case VMCS_64BIT_GUEST_IA32_PERF_GLOBAL_CTRL:
case VMCS_64BIT_GUEST_IA32_PERF_GLOBAL_CTRL_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_PERF_GLOBAL_CTRL);
#if BX_SUPPORT_VMX >= 2
case VMCS_64BIT_GUEST_IA32_PDPTE0:
case VMCS_64BIT_GUEST_IA32_PDPTE0_HI:
case VMCS_64BIT_GUEST_IA32_PDPTE1:
@ -292,11 +291,11 @@ bx_bool BX_CPU_C::vmcs_field_supported(Bit32u encoding)
case VMCS_64BIT_HOST_IA32_EFER:
case VMCS_64BIT_HOST_IA32_EFER_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_EFER);
#endif
case VMCS_64BIT_HOST_IA32_PERF_GLOBAL_CTRL:
case VMCS_64BIT_HOST_IA32_PERF_GLOBAL_CTRL_HI:
return BX_SUPPORT_VMX_EXTENSION(BX_VMX_PERF_GLOBAL_CTRL);
#endif
/* VMCS natural width control fields */
/* binary 0110_00xx_xxxx_xxx0 */
@ -386,8 +385,10 @@ void BX_CPU_C::init_vmx_capabilities(void)
VMX_VM_EXEC_CTRL1_NMI_VMEXIT;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_VIRTUAL_NMI))
cap->vmx_pin_vmexec_ctrl_supported_bits |= VMX_VM_EXEC_CTRL1_VIRTUAL_NMI;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PREEMPTION_TIMER))
cap->vmx_pin_vmexec_ctrl_supported_bits |= VMX_VM_EXEC_CTRL1_VMX_PREEMPTION_TIMER_VMEXIT;
#endif
// proc based vm exec controls
// -----------------------------------------------------------
@ -435,16 +436,20 @@ void BX_CPU_C::init_vmx_capabilities(void)
VMX_VM_EXEC_CTRL2_MSR_BITMAPS |
VMX_VM_EXEC_CTRL2_PAUSE_VMEXIT;
#if BX_SUPPORT_MONITOR_MWAIT
if (BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_MONITOR_MWAIT)) {
cap->vmx_proc_vmexec_ctrl_supported_bits |=
VMX_VM_EXEC_CTRL2_MWAIT_VMEXIT | VMX_VM_EXEC_CTRL2_MONITOR_VMEXIT;
}
#endif
#if BX_SUPPORT_X86_64
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_TPR_SHADOW)) {
cap->vmx_proc_vmexec_ctrl_supported_bits |= VMX_VM_EXEC_CTRL2_TPR_SHADOW;
if (BX_CPUID_SUPPORT_CPU_EXTENSION(BX_CPU_LONG_MODE))
cap->vmx_proc_vmexec_ctrl_supported_bits |=
VMX_VM_EXEC_CTRL2_CR8_WRITE_VMEXIT | VMX_VM_EXEC_CTRL2_CR8_READ_VMEXIT;
}
#endif
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_VIRTUAL_NMI))
cap->vmx_proc_vmexec_ctrl_supported_bits |= VMX_VM_EXEC_CTRL2_NMI_WINDOW_VMEXIT;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_MONITOR_TRAP_FLAG))
@ -469,22 +474,28 @@ void BX_CPU_C::init_vmx_capabilities(void)
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_APIC_VIRTUALIZATION))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_VIRTUALIZE_APIC_ACCESSES;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_EPT))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_EPT_ENABLE;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_DESCRIPTOR_TABLE_EXIT))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_DESCRIPTOR_TABLE_VMEXIT;
#endif
if (BX_CPUID_SUPPORT_ISA_EXTENSION(BX_ISA_RDTSCP))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_RDTSCP;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_X2APIC_VIRTUALIZATION))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_VIRTUALIZE_X2APIC_MODE;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_VPID))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_VPID_ENABLE;
#endif
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_WBINVD_VMEXIT))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_WBINVD_VMEXIT;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_UNRESTRICTED_GUEST))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_UNRESTRICTED_GUEST;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PAUSE_LOOP_EXITING))
cap->vmx_vmexec_ctrl2_supported_bits |= VMX_VM_EXEC_CTRL3_PAUSE_LOOP_VMEXIT;
#endif
// enable secondary vm exec controls if needed
if (cap->vmx_vmexec_ctrl2_supported_bits != 0)
@ -510,10 +521,13 @@ void BX_CPU_C::init_vmx_capabilities(void)
cap->vmx_vmexit_ctrl_supported_bits =
VMX_VMEXIT_CTRL1_INTA_ON_VMEXIT | VMX_VMEXIT_CTRL1_SAVE_DBG_CTRLS;
#if BX_SUPPORT_X86_64
if (BX_CPUID_SUPPORT_CPU_EXTENSION(BX_CPU_LONG_MODE))
cap->vmx_vmexit_ctrl_supported_bits |= VMX_VMEXIT_CTRL1_HOST_ADDR_SPACE_SIZE;
#endif
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PERF_GLOBAL_CTRL))
cap->vmx_vmexit_ctrl_supported_bits |= VMX_VMEXIT_CTRL1_LOAD_PERF_GLOBAL_CTRL_MSR;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PAT)) {
cap->vmx_vmexit_ctrl_supported_bits |=
VMX_VMEXIT_CTRL1_STORE_PAT_MSR | VMX_VMEXIT_CTRL1_LOAD_PAT_MSR;
@ -524,6 +538,7 @@ void BX_CPU_C::init_vmx_capabilities(void)
}
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PREEMPTION_TIMER))
cap->vmx_vmexit_ctrl_supported_bits |= VMX_VMEXIT_CTRL1_STORE_VMX_PREEMPTION_TIMER;
#endif
// vmentry controls
// -----------------------------------------------------------
@ -542,14 +557,18 @@ void BX_CPU_C::init_vmx_capabilities(void)
VMX_VMENTRY_CTRL1_SMM_ENTER |
VMX_VMENTRY_CTRL1_DEACTIVATE_DUAL_MONITOR_TREATMENT;
#if BX_SUPPORT_X86_64
if (BX_CPUID_SUPPORT_CPU_EXTENSION(BX_CPU_LONG_MODE))
cap->vmx_vmentry_ctrl_supported_bits |= VMX_VMENTRY_CTRL1_X86_64_GUEST;
#endif
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PERF_GLOBAL_CTRL))
cap->vmx_vmentry_ctrl_supported_bits |= VMX_VMENTRY_CTRL1_LOAD_PERF_GLOBAL_CTRL_MSR;
#if BX_SUPPORT_VMX >= 2
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_PAT))
cap->vmx_vmentry_ctrl_supported_bits |= VMX_VMENTRY_CTRL1_LOAD_PAT_MSR;
if (BX_SUPPORT_VMX_EXTENSION(BX_VMX_EFER))
cap->vmx_vmentry_ctrl_supported_bits |= VMX_VMENTRY_CTRL1_LOAD_EFER_MSR;
#endif
}
#endif

View File

@ -732,7 +732,7 @@ void BX_CPU_C::VMX_Write_VTPR(Bit8u vtpr)
}
#endif
#if BX_SUPPORT_VMX >= 2
// apic virtualization
bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::is_virtual_apic_page(bx_phy_address paddr)
{
VMCS_CACHE *vm = &BX_CPU_THIS_PTR vmcs;
@ -744,6 +744,7 @@ bx_bool BX_CPP_AttrRegparmN(1) BX_CPU_C::is_virtual_apic_page(bx_phy_address pad
return 0;
}
// apic virtualization
void BX_CPU_C::VMX_Virtual_Apic_Read(bx_phy_address paddr, unsigned len, void *data)
{
BX_ASSERT(SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_VIRTUALIZE_APIC_ACCESSES));
@ -770,6 +771,7 @@ void BX_CPU_C::VMX_Virtual_Apic_Read(bx_phy_address paddr, unsigned len, void *d
VMexit(0, VMX_VMEXIT_APIC_ACCESS, qualification);
}
// apic virtualization
void BX_CPU_C::VMX_Virtual_Apic_Write(bx_phy_address paddr, unsigned len, void *data)
{
BX_ASSERT(SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_VIRTUALIZE_APIC_ACCESSES));
@ -797,6 +799,7 @@ void BX_CPP_AttrRegparmN(1) BX_CPU_C::VMexit_WBINVD(bxInstruction_c *i)
}
}
#if BX_SUPPORT_VMX >= 2
Bit16u BX_CPU_C::VMX_Get_Current_VPID(void)
{
if (! BX_CPU_THIS_PTR in_vmx_guest || !SECONDARY_VMEXEC_CONTROL(VMX_VM_EXEC_CTRL3_VPID_ENABLE))

View File

@ -317,11 +317,9 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
vm->vmexec_ctrls1 = VMread32(VMCS_32BIT_CONTROL_PIN_BASED_EXEC_CONTROLS);
vm->vmexec_ctrls2 = VMread32(VMCS_32BIT_CONTROL_PROCESSOR_BASED_VMEXEC_CONTROLS);
#if BX_SUPPORT_VMX >= 2
if (VMEXIT(VMX_VM_EXEC_CTRL2_SECONDARY_CONTROLS))
vm->vmexec_ctrls3 = VMread32(VMCS_32BIT_CONTROL_SECONDARY_VMEXEC_CONTROLS);
else
#endif
vm->vmexec_ctrls3 = 0;
vm->vm_exceptions_bitmap = VMread32(VMCS_32BIT_CONTROL_EXECUTION_BITMAP);
vm->vm_pf_mask = VMread32(VMCS_32BIT_CONTROL_PAGE_FAULT_ERR_CODE_MASK);
@ -360,7 +358,6 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
}
#if BX_SUPPORT_VMX >= 2
if (~vm->vmexec_ctrls3 & VMX_MSR_VMX_PROCBASED_CTRLS2_LO) {
BX_ERROR(("VMFAIL: VMCS EXEC CTRL: VMX secondary proc-based controls allowed 0-settings"));
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
@ -369,7 +366,6 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
BX_ERROR(("VMFAIL: VMCS EXEC CTRL: VMX secondary proc-based controls allowed 1-settings"));
return VMXERR_VMENTRY_INVALID_VM_CONTROL_FIELD;
}
#endif
if (vm->vm_cr3_target_cnt > VMX_CR3_TARGET_MAX_CNT) {
BX_ERROR(("VMFAIL: VMCS EXEC CTRL: too may CR3 targets %d", vm->vm_cr3_target_cnt));
@ -433,7 +429,6 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
}
#endif
#if BX_SUPPORT_VMX >= 2
if (vm->vmexec_ctrls3 & VMX_VM_EXEC_CTRL3_VIRTUALIZE_APIC_ACCESSES) {
vm->apic_access_page = (bx_phy_address) VMread64(VMCS_64BIT_CONTROL_APIC_ACCESS_ADDR);
if ((vm->apic_access_page & 0xfff) != 0 || ! IsValidPhyAddr(vm->apic_access_page)) {
@ -442,6 +437,7 @@ VMX_error_code BX_CPU_C::VMenterLoadCheckVmControls(void)
}
}
#if BX_SUPPORT_VMX >= 2
if (vm->vmexec_ctrls3 & VMX_VM_EXEC_CTRL3_VIRTUALIZE_X2APIC_MODE) {
// 'use TPR shadow' must be set and "virtualize APIC accesses" must be clear
if (!(vm->vmexec_ctrls2 & VMX_VM_EXEC_CTRL2_TPR_SHADOW) ||
@ -3146,8 +3142,8 @@ void BX_CPU_C::register_vmx_state(bx_param_c *parent)
BXRS_HEX_PARAM_FIELD(vmexec_ctrls, virtual_apic_page_addr, BX_CPU_THIS_PTR vmcs.virtual_apic_page_addr);
BXRS_HEX_PARAM_FIELD(vmexec_ctrls, vm_tpr_threshold, BX_CPU_THIS_PTR vmcs.vm_tpr_threshold);
#endif
#if BX_SUPPORT_VMX >= 2
BXRS_HEX_PARAM_FIELD(vmexec_ctrls, apic_access_page, BX_CPU_THIS_PTR vmcs.apic_access_page);
#if BX_SUPPORT_VMX >= 2
BXRS_HEX_PARAM_FIELD(vmexec_ctrls, eptptr, BX_CPU_THIS_PTR vmcs.eptptr);
BXRS_HEX_PARAM_FIELD(vmexec_ctrls, vpid, BX_CPU_THIS_PTR vmcs.vpid);
#endif

View File

@ -594,8 +594,10 @@ typedef struct bx_VMCS
bx_phy_address virtual_apic_page_addr;
Bit32u vm_tpr_threshold;
#endif
#if BX_SUPPORT_VMX >= 2
bx_phy_address apic_access_page;
#if BX_SUPPORT_VMX >= 2
Bit64u eptptr;
Bit16u vpid;
#endif