From 3d7bbf435690bfcfca41dc9b78992401c5393f1c Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Thu, 28 May 2009 08:26:17 +0000 Subject: [PATCH] fixed VMXON pointer concept --- bochs/cpu/cpu.h | 4 ++-- bochs/cpu/init.cc | 4 ++-- bochs/cpu/vmx.cc | 31 ++++++++++++++++--------------- bochs/cpu/vmx.h | 3 +++ 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/bochs/cpu/cpu.h b/bochs/cpu/cpu.h index 30c905e74..d165b430e 100644 --- a/bochs/cpu/cpu.h +++ b/bochs/cpu/cpu.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cpu.h,v 1.598 2009-05-21 13:25:30 sshwarts Exp $ +// $Id: cpu.h,v 1.599 2009-05-28 08:26:17 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -892,6 +892,7 @@ public: // for now... bx_bool vmx_interrupt_window; Bit64u vmcsptr; bx_hostpageaddr_t vmcshostptr; + Bit64u vmxonptr; VMCS_CACHE vmcs; #endif @@ -3333,7 +3334,6 @@ public: // for now... BX_SMF void VMexitSaveGuestMSRs(void); BX_SMF void VMexitLoadHostState(void); BX_SMF void set_VMCSPTR(Bit64u vmxptr); - BX_SMF bx_bool is_VMXON_PTR(Bit64u vmxptr); BX_SMF void init_VMCS(void); BX_SMF void register_vmx_state(bx_param_c *parent); BX_SMF Bit64s VMX_TSC_Offset(void); diff --git a/bochs/cpu/init.cc b/bochs/cpu/init.cc index a7630f040..45724bf40 100644 --- a/bochs/cpu/init.cc +++ b/bochs/cpu/init.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: init.cc,v 1.211 2009-05-21 13:25:30 sshwarts Exp $ +// $Id: init.cc,v 1.212 2009-05-28 08:26:17 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -1007,7 +1007,7 @@ void BX_CPU_C::reset(unsigned source) BX_CPU_THIS_PTR in_vmx = BX_CPU_THIS_PTR in_vmx_guest = 0; BX_CPU_THIS_PTR in_event = 0; BX_CPU_THIS_PTR vmx_interrupt_window = 0; - BX_CPU_THIS_PTR vmcsptr = BX_CONST64(0xFFFFFFFFFFFFFFFF); + BX_CPU_THIS_PTR vmcsptr = BX_CPU_THIS_PTR vmxonptr = BX_INVALID_VMCSPTR; BX_CPU_THIS_PTR vmcshostptr = 0; #endif diff --git a/bochs/cpu/vmx.cc b/bochs/cpu/vmx.cc index d9102d58a..518cb649e 100755 --- a/bochs/cpu/vmx.cc +++ b/bochs/cpu/vmx.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: vmx.cc,v 1.16 2009-05-21 10:39:40 sshwarts Exp $ +// $Id: vmx.cc,v 1.17 2009-05-28 08:26:17 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (c) 2009 Stanislav Shwartsman @@ -35,9 +35,6 @@ #if BX_SUPPORT_VMX -// VMCSPTR is always 64-bit variable -#define BX_INVALID_VMCSPTR BX_CONST64(0xFFFFFFFFFFFFFFFF) - #define VMCSPTR_VALID() (BX_CPU_THIS_PTR vmcsptr != BX_INVALID_VMCSPTR) //////////////////////////////////////////////////////////// @@ -1688,17 +1685,12 @@ void BX_CPU_C::VMexit(bxInstruction_c *i, Bit32u reason, Bit64u qualification) longjmp(BX_CPU_THIS_PTR jmp_buf_env, 1); // go back to main decode loop } +#endif // BX_SUPPORT_VMX + //////////////////////////////////////////////////////////// // VMX instructions //////////////////////////////////////////////////////////// -bx_bool BX_CPU_C::is_VMXON_PTR(Bit64u vmxptr) -{ - return 0; -} - -#endif // BX_SUPPORT_VMX - void BX_CPU_C::VMXON(bxInstruction_c *i) { #if BX_SUPPORT_VMX @@ -1733,6 +1725,7 @@ void BX_CPU_C::VMXON(bxInstruction_c *i) BX_CPU_THIS_PTR vmcsptr = BX_INVALID_VMCSPTR; BX_CPU_THIS_PTR vmcshostptr = 0; + BX_CPU_THIS_PTR vmxonptr = pAddr; BX_CPU_THIS_PTR in_vmx = 1; BX_CPU_THIS_PTR disable_INIT = 1; // INIT is disabled in VMX root mode // block and disable A20M; @@ -1782,6 +1775,7 @@ void BX_CPU_C::VMXOFF(bxInstruction_c *i) else */ { + BX_CPU_THIS_PTR vmxonptr = BX_INVALID_VMCSPTR; BX_CPU_THIS_PTR in_vmx = 0; // leave VMX operation mode BX_CPU_THIS_PTR disable_INIT = 0; // unblock and enable A20M; @@ -1826,6 +1820,7 @@ void BX_CPU_C::VMCALL(bxInstruction_c *i) of the IntelR 64 and IA-32 Architectures Software Developer's Manual, Volume 3B); */ if (! VMCSPTR_VALID()) { + BX_ERROR(("VMFAIL: VMCALL with invalid VMCS ptr")); VMfailInvalid(); return; } @@ -1836,6 +1831,7 @@ void BX_CPU_C::VMCALL(bxInstruction_c *i) BX_READ, (Bit8u*)(&launch_state)); if (launch_state != VMCS_STATE_CLEAR) { + BX_ERROR(("VMFAIL: VMCALL with launched VMCS")); VMfail(VMXERR_VMCALL_NON_CLEAR_VMCS); return; } @@ -1892,7 +1888,7 @@ void BX_CPU_C::VMLAUNCH(bxInstruction_c *i) exception(BX_GP_EXCEPTION, 0, 0); if (! VMCSPTR_VALID()) { - BX_ERROR(("VMFAIL: VMLAUNCH invalid VMCS ptr !")); + BX_ERROR(("VMFAIL: VMLAUNCH with invalid VMCS ptr !")); VMfailInvalid(); return; } @@ -2050,7 +2046,8 @@ void BX_CPU_C::VMPTRLD(bxInstruction_c *i) return; } - if (is_VMXON_PTR(pAddr)) { + if (pAddr == BX_CPU_THIS_PTR vmxonptr) { + BX_ERROR(("VMFAIL: VMPTRLD with VMXON ptr !")); VMfail(VMXERR_VMPTRLD_WITH_VMXON_PTR); } else { @@ -2111,6 +2108,7 @@ void BX_CPU_C::VMREAD(bxInstruction_c *i) exception(BX_GP_EXCEPTION, 0, 0); if (! VMCSPTR_VALID()) { + BX_ERROR(("VMFAIL: VMREAD with invalid VMCS ptr !")); VMfailInvalid(); return; } @@ -2388,6 +2386,7 @@ void BX_CPU_C::VMWRITE(bxInstruction_c *i) exception(BX_GP_EXCEPTION, 0, 0); if (! VMCSPTR_VALID()) { + BX_ERROR(("VMFAIL: VMWRITE with invalid VMCS ptr !")); VMfailInvalid(); return; } @@ -2683,7 +2682,8 @@ void BX_CPU_C::VMCLEAR(bxInstruction_c *i) return; } - if (is_VMXON_PTR(pAddr)) { + if (pAddr == BX_CPU_THIS_PTR vmxonptr) { + BX_ERROR(("VMFAIL: VMLEAR with VMXON ptr !")); VMfail(VMXERR_VMCLEAR_WITH_VMXON_VMCS_PTR); } else { @@ -2713,9 +2713,10 @@ void BX_CPU_C::VMCLEAR(bxInstruction_c *i) void BX_CPU_C::register_vmx_state(bx_param_c *parent) { // register VMX state for save/restore param tree - bx_list_c *vmx = new bx_list_c(parent, "VMX", 10); + bx_list_c *vmx = new bx_list_c(parent, "VMX", 6); BXRS_HEX_PARAM_FIELD(vmx, vmcsptr, BX_CPU_THIS_PTR vmcsptr); + BXRS_HEX_PARAM_FIELD(vmx, vmxonptr, BX_CPU_THIS_PTR vmxonptr); BXRS_PARAM_BOOL(vmx, in_vmx, BX_CPU_THIS_PTR in_vmx); BXRS_PARAM_BOOL(vmx, in_vmx_guest, BX_CPU_THIS_PTR in_vmx_guest); BXRS_PARAM_BOOL(vmx, vmx_interrupt_window, BX_CPU_THIS_PTR vmx_interrupt_window); diff --git a/bochs/cpu/vmx.h b/bochs/cpu/vmx.h index 1821bf3fe..7ecc9cfd9 100755 --- a/bochs/cpu/vmx.h +++ b/bochs/cpu/vmx.h @@ -27,6 +27,9 @@ #define VMX_VMCS_AREA_SIZE 4096 #define VMX_VMCS_REVISION_ID 0x10 +// VMCS pointer is always 64-bit variable +#define BX_INVALID_VMCSPTR BX_CONST64(0xFFFFFFFFFFFFFFFF) + // VMX error codes enum VMX_error_code { VMXERR_NO_ERROR = 0,