VirtualBox

Changeset 5343 in vbox


Ignore:
Timestamp:
Oct 17, 2007 7:32:32 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
25381
Message:

Protect cmpxchg emulation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r4953 r5343  
    11131113                /* Safety check (in theory it could cross a page boundary and fault there though) */
    11141114                AssertMsgReturn(pParam1 == pvFault, ("eip=%VGv pParam1=%VGv pvFault=%VGv\n", pRegFrame->eip, pParam1, pvFault), VERR_EM_INTERPRETER);
    1115 
    1116 #ifdef VBOX_STRICT
    1117                 rc = emRamRead(pVM, &valpar1, pParam1, param1.size);
    1118                 if (VBOX_FAILURE(rc))
    1119                     return VERR_EM_INTERPRETER;
    1120 #endif
    11211115                break;
    11221116
     
    11351129            }
    11361130
    1137 #ifdef VBOX_STRICT
    11381131            LogFlow(("CmpXchg %VGv=%08x eax=%08x %08x\n", pParam1, valpar1, pRegFrame->eax, valpar));
    1139 #endif
     1132
     1133            MMGCRamRegisterTrapHandler(pVM);
    11401134            if (pCpu->prefix & PREFIX_LOCK)
    1141                 eflags = EMGCEmulateLockCmpXchg(pParam1, &pRegFrame->eax, valpar, pCpu->param2.size);
     1135                rc = EMGCEmulateLockCmpXchg(pParam1, &pRegFrame->eax, valpar, pCpu->param2.size, &eflags);
    11421136            else
    1143                 eflags = EMGCEmulateCmpXchg(pParam1, &pRegFrame->eax, valpar, pCpu->param2.size);
    1144 
    1145 #ifdef VBOX_STRICT
    1146             rc = emRamRead(pVM, &valpar1, pParam1, param1.size);
     1137                rc = EMGCEmulateCmpXchg(pParam1, &pRegFrame->eax, valpar, pCpu->param2.size, &eflags);
     1138            MMGCRamDeregisterTrapHandler(pVM);
     1139
     1140            if (VBOX_FAILURE(rc))
     1141            {
     1142                Log(("CmpXchg %VGv=%08x eax=%08x %08x -> emulation failed due to page fault!\n", pParam1, valpar1, pRegFrame->eax, valpar));
     1143                return VERR_EM_INTERPRETER;
     1144            }
     1145
    11471146            LogFlow(("CmpXchg %VGv=%08x eax=%08x %08x ZF=%d\n", pParam1, valpar1, pRegFrame->eax, valpar, !!(eflags & X86_EFL_ZF)));
    1148 #endif
     1147
    11491148            /* Update guest's eflags and finish. */
    11501149            pRegFrame->eflags.u32 = (pRegFrame->eflags.u32 & ~(X86_EFL_CF | X86_EFL_PF | X86_EFL_AF | X86_EFL_ZF | X86_EFL_SF | X86_EFL_OF))
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette