improved debug prints in MOV to/from CR

SVM bugfix
remove redundant TLB flush call from SVM and VMX code
This commit is contained in:
Stanislav Shwartsman 2012-04-04 19:31:02 +00:00
parent 56cce60be8
commit 72a00ce9dd
3 changed files with 8 additions and 13 deletions

View File

@ -543,7 +543,7 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_RdCR2(bxInstruction_c *i)
{
// CPL is always 0 in real mode
if (/* !real_mode() && */ CPL!=0) {
BX_ERROR(("MOV_RdCd: CPL!=0 not in real mode"));
BX_ERROR(("MOV_RdCR2: CPL!=0 not in real mode"));
exception(BX_GP_EXCEPTION, 0);
}
@ -562,7 +562,7 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_RdCR3(bxInstruction_c *i)
{
// CPL is always 0 in real mode
if (/* !real_mode() && */ CPL!=0) {
BX_ERROR(("MOV_RdCd: CPL!=0 not in real mode"));
BX_ERROR(("MOV_RdCR3: CPL!=0 not in real mode"));
exception(BX_GP_EXCEPTION, 0);
}
@ -589,7 +589,7 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_RdCR4(bxInstruction_c *i)
#if BX_CPU_LEVEL >= 5
// CPL is always 0 in real mode
if (/* !real_mode() && */ CPL!=0) {
BX_ERROR(("MOV_RdCd: CPL!=0 not in real mode"));
BX_ERROR(("MOV_RdCR4: CPL!=0 not in real mode"));
exception(BX_GP_EXCEPTION, 0);
}
@ -703,7 +703,6 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_CR4Rq(bxInstruction_c *i)
if (BX_CPU_THIS_PTR in_vmx_guest)
val_64 = VMexit_CR4_Write(i, val_64);
#endif
BX_DEBUG(("MOV_CqRq: write to CR4 of %08x:%08x", GET32H(val_64), GET32L(val_64)));
if (! SetCR4(val_64))
exception(BX_GP_EXCEPTION, 0);
@ -715,7 +714,7 @@ BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_CR4Rq(bxInstruction_c *i)
BX_INSF_TYPE BX_CPP_AttrRegparmN(1) BX_CPU_C::MOV_RqCR0(bxInstruction_c *i)
{
if (CPL!=0) {
BX_ERROR(("MOV_RqCq: #GP(0) if CPL is not 0"));
BX_ERROR(("MOV_RqCR0: #GP(0) if CPL is not 0"));
exception(BX_GP_EXCEPTION, 0);
}

View File

@ -415,6 +415,10 @@ bx_bool BX_CPU_C::SvmEnterLoadCheckGuestState(void)
return 0;
}
// always assign EFER.LMA := EFER.LME & CR0.PG
if (guest.cr0.get_PG() & guest.efer.get_LME())
guest.efer.set_LMA(1);
guest.cr2 = vmcb_read64(SVM_GUEST_CR2);
guest.cr3 = vmcb_read64(SVM_GUEST_CR3);
@ -526,8 +530,6 @@ bx_bool BX_CPU_C::SvmEnterLoadCheckGuestState(void)
BX_CPU_THIS_PTR dr6.set32(guest.dr6);
BX_CPU_THIS_PTR dr7.set32(guest.dr7 | 0x400);
TLB_flush(); // CR0/CR4 updated
for (n=0;n < 4; n++) {
BX_CPU_THIS_PTR sregs[n] = guest.sregs[n];
}

View File

@ -1535,10 +1535,6 @@ Bit32u BX_CPU_C::VMenterLoadCheckGuestState(Bit64u *qualification)
BX_CPU_THIS_PTR cr4.set32((Bit32u) guest.cr4);
BX_CPU_THIS_PTR cr3 = guest.cr3;
// flush TLB is always needed to invalidate possible
// APIC ACCESS PAGE caching by host
TLB_flush();
#if BX_SUPPORT_VMX >= 2
if (vm->vmexec_ctrls3 & VMX_VM_EXEC_CTRL3_EPT_ENABLE) {
// load PDPTR only in PAE legacy mode
@ -1926,8 +1922,6 @@ void BX_CPU_C::VMexitLoadHostState(void)
BX_CPU_THIS_PTR cr4.set32((Bit32u) host_state->cr4);
BX_CPU_THIS_PTR cr3 = host_state->cr3;
TLB_flush(); // CR0/CR4 updated
if (! x86_64_host && BX_CPU_THIS_PTR cr4.get_PAE()) {
if (! CheckPDPTR(host_state->cr3)) {
BX_ERROR(("VMABORT: host PDPTRs are corrupted !"));