VirtualBox

Ignore:
Timestamp:
Jun 20, 2018 4:08:42 PM (6 years ago)
Author:
vboxsync
Message:

EM[R3]: Use pVCpu->cpum.GstCtx and stop keeping and passing pCtx around.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/EMRaw.cpp

    r72488 r72634  
    6161*   Internal Functions                                                                                                           *
    6262*********************************************************************************************************************************/
    63 static int      emR3RawForcedActions(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx);
     63static int      emR3RawHandleRC(PVM pVM, PVMCPU pVCpu, int rc);
     64static int      emR3RawForcedActions(PVM pVM, PVMCPU pVCpu);
    6465DECLINLINE(int) emR3RawExecuteInstruction(PVM pVM, PVMCPU pVCpu, const char *pszPrefix, int rcGC = VINF_SUCCESS);
    6566static int      emR3RawGuestTrap(PVM pVM, PVMCPU pVCpu);
    66 static int      emR3RawPatchTrap(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, int gcret);
     67static int      emR3RawPatchTrap(PVM pVM, PVMCPU pVCpu, int gcret);
    6768static int      emR3RawPrivileged(PVM pVM, PVMCPU pVCpu);
    6869static int      emR3RawExecuteIOInstruction(PVM pVM, PVMCPU pVCpu);
    6970static int      emR3RawRingSwitch(PVM pVM, PVMCPU pVCpu);
     71static int      emR3RawUpdateForceFlag(PVM pVM, PVMCPU pVCpu, int rc);
    7072
    7173#define EMHANDLERC_WITH_PATM
     
    124126{
    125127    int         rc;
    126     PCPUMCTX    pCtx = pVCpu->em.s.pCtx;
    127128    Assert(pVCpu->em.s.enmState == EMSTATE_DEBUG_HYPER);
    128     Log(("emR3RawResumeHyper: cs:eip=%RTsel:%RGr efl=%RGr\n", pCtx->cs.Sel, pCtx->eip, pCtx->eflags));
     129    Log(("emR3RawResumeHyper: cs:eip=%RTsel:%RGr efl=%RGr\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.eflags));
    129130
    130131    /*
     
    134135    CPUMSetHyperEFlags(pVCpu, CPUMGetHyperEFlags(pVCpu) | X86_EFL_RF);
    135136    rc = VMMR3ResumeHyper(pVM, pVCpu);
    136     Log(("emR3RawResumeHyper: cs:eip=%RTsel:%RGr efl=%RGr - returned from GC with rc=%Rrc\n", pCtx->cs.Sel, pCtx->eip, pCtx->eflags, rc));
     137    Log(("emR3RawResumeHyper: cs:eip=%RTsel:%RGr efl=%RGr - returned from GC with rc=%Rrc\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.eflags, rc));
    137138    rc = CPUMRawLeave(pVCpu, rc);
    138139    VMCPU_FF_CLEAR(pVCpu, VMCPU_FF_RESUME_GUEST_MASK);
     
    142143     */
    143144    rc = VBOXSTRICTRC_TODO(emR3HighPriorityPostForcedActions(pVM, pVCpu, rc));
    144     rc = emR3RawHandleRC(pVM, pVCpu, pCtx, rc);
    145     rc = emR3RawUpdateForceFlag(pVM, pVCpu, pCtx, rc);
     145    rc = emR3RawHandleRC(pVM, pVCpu, rc);
     146    rc = emR3RawUpdateForceFlag(pVM, pVCpu, rc);
    146147    return rc;
    147148}
     
    161162           || pVCpu->em.s.enmState == EMSTATE_DEBUG_GUEST_REM);
    162163    int         rc;
    163     PCPUMCTX    pCtx   = pVCpu->em.s.pCtx;
    164164    bool        fGuest = pVCpu->em.s.enmState != EMSTATE_DEBUG_HYPER;
    165165#ifndef DEBUG_sander
     
    175175            ||  VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
    176176        {
    177             rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
     177            rc = emR3RawForcedActions(pVM, pVCpu);
    178178            VBOXVMM_EM_FF_RAW_RET(pVCpu, rc);
    179179            if (rc != VINF_SUCCESS)
     
    222222     */
    223223    rc = VBOXSTRICTRC_TODO(emR3HighPriorityPostForcedActions(pVM, pVCpu, rc));
    224     rc = emR3RawHandleRC(pVM, pVCpu, pCtx, rc);
    225     rc = emR3RawUpdateForceFlag(pVM, pVCpu, pCtx, rc);
     224    rc = emR3RawHandleRC(pVM, pVCpu, rc);
     225    rc = emR3RawUpdateForceFlag(pVM, pVCpu, rc);
    226226    return rc;
    227227}
     
    273273#endif
    274274{
    275     PCPUMCTX pCtx = pVCpu->em.s.pCtx;
    276275    int      rc;
    277276
     
    293292     * to allow us execute the code in REM.
    294293     */
    295     if (PATMIsPatchGCAddr(pVM, pCtx->eip))
    296     {
    297         Log(("emR3RawExecuteInstruction: In patch block. eip=%RRv\n", (RTRCPTR)pCtx->eip));
     294    if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
     295    {
     296        Log(("emR3RawExecuteInstruction: In patch block. eip=%RRv\n", (RTRCPTR)pVCpu->cpum.GstCtx.eip));
    298297
    299298        RTGCPTR uNewEip;
    300         rc = PATMR3HandleTrap(pVM, pCtx, pCtx->eip, &uNewEip);
     299        rc = PATMR3HandleTrap(pVM, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.eip, &uNewEip);
    301300        switch (rc)
    302301        {
     
    307306            case VINF_SUCCESS:
    308307                Log(("emR3RawExecuteInstruction: Executing instruction starting at new address %RGv IF=%d VMIF=%x\n",
    309                      uNewEip, pCtx->eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
    310                 pCtx->eip = uNewEip;
    311                 Assert(pCtx->eip);
    312 
    313                 if (pCtx->eflags.Bits.u1IF)
     308                     uNewEip, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
     309                pVCpu->cpum.GstCtx.eip = uNewEip;
     310                Assert(pVCpu->cpum.GstCtx.eip);
     311
     312                if (pVCpu->cpum.GstCtx.eflags.Bits.u1IF)
    314313                {
    315314                    /*
     
    331330            case VINF_PATCH_EMULATE_INSTR:
    332331                Log(("emR3RawExecuteInstruction: Emulate patched instruction at %RGv IF=%d VMIF=%x\n",
    333                      uNewEip, pCtx->eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
    334                 pCtx->eip = uNewEip;
     332                     uNewEip, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
     333                pVCpu->cpum.GstCtx.eip = uNewEip;
    335334                return emR3RawExecuteInstruction(pVM, pVCpu, "PATCHIR");
    336335
     
    340339            case VERR_PATCH_DISABLED:
    341340                Log(("emR3RawExecuteInstruction: Disabled patch -> new eip %RGv IF=%d VMIF=%x\n",
    342                      uNewEip, pCtx->eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
    343                 pCtx->eip = uNewEip;
    344                 if (pCtx->eflags.Bits.u1IF)
     341                     uNewEip, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
     342                pVCpu->cpum.GstCtx.eip = uNewEip;
     343                if (pVCpu->cpum.GstCtx.eflags.Bits.u1IF)
    345344                {
    346345                    /*
     
    369368#define VBOX_WITH_FIRST_IEM_STEP_B
    370369#if defined(VBOX_WITH_FIRST_IEM_STEP_B) || !defined(VBOX_WITH_REM)
    371     Log(("EMINS: %04x:%RGv RSP=%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp));
     370    Log(("EMINS: %04x:%RGv RSP=%RGv\n", pVCpu->cpum.GstCtx.cs.Sel, (RTGCPTR)pVCpu->cpum.GstCtx.rip, (RTGCPTR)pVCpu->cpum.GstCtx.rsp));
    372371    STAM_PROFILE_START(&pVCpu->em.s.StatIEMEmu, a);
    373372    rc = VBOXSTRICTRC_TODO(IEMExecOne(pVCpu));
     
    385384        STAM_PROFILE_START(&pVCpu->em.s.StatREMEmu, b);
    386385# ifndef VBOX_WITH_FIRST_IEM_STEP_B
    387         Log(("EMINS[rem]: %04x:%RGv RSP=%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp));
     386        Log(("EMINS[rem]: %04x:%RGv RSP=%RGv\n", pVCpu->cpum.GstCtx.cs.Sel, (RTGCPTR)pVCpu->cpum.GstCtx.rip, (RTGCPTR)pVCpu->cpum.GstCtx.rsp));
    388387//# elif defined(DEBUG_bird)
    389388//        AssertFailed();
     
    457456static int emR3RawGuestTrap(PVM pVM, PVMCPU pVCpu)
    458457{
    459     PCPUMCTX pCtx = pVCpu->em.s.pCtx;
    460 
    461458    /*
    462459     * Get the trap info.
     
    484481    uint32_t uCpl = CPUMGetGuestCPL(pVCpu);
    485482    if (    uCpl == 0
    486         &&  PATMIsPatchGCAddr(pVM, pCtx->eip))
    487     {
    488         LogFlow(("emR3RawGuestTrap: trap %#x in patch code; eip=%08x\n", u8TrapNo, pCtx->eip));
    489         return emR3RawPatchTrap(pVM, pVCpu, pCtx, rc);
     483        &&  PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
     484    {
     485        LogFlow(("emR3RawGuestTrap: trap %#x in patch code; eip=%08x\n", u8TrapNo, pVCpu->cpum.GstCtx.eip));
     486        return emR3RawPatchTrap(pVM, pVCpu, rc);
    490487    }
    491488#endif
     
    512509                                   ? TRPM_TRAP_HAS_ERRORCODE
    513510                                   : TRPM_TRAP_NO_ERRORCODE;
    514             rc = TRPMForwardTrap(pVCpu, CPUMCTX2CORE(pCtx), u8TrapNo, uErrorCode, enmError, TRPM_TRAP, -1);
     511            rc = TRPMForwardTrap(pVCpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), u8TrapNo, uErrorCode, enmError, TRPM_TRAP, -1);
    515512            if (rc == VINF_SUCCESS /* Don't use RT_SUCCESS */)
    516513            {
     
    526523     */
    527524    /** @todo move this up before the dispatching? */
    528     if (    (pCtx->ss.Sel & X86_SEL_RPL) <= 1
    529         &&  !pCtx->eflags.Bits.u1VM)
    530     {
    531         Assert(!PATMIsPatchGCAddr(pVM, pCtx->eip));
    532         CSAMR3CheckCodeEx(pVM, pCtx, pCtx->eip);
     525    if (    (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) <= 1
     526        &&  !pVCpu->cpum.GstCtx.eflags.Bits.u1VM)
     527    {
     528        Assert(!PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip));
     529        CSAMR3CheckCodeEx(pVM, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.eip);
    533530    }
    534531
     
    542539         */
    543540        DISCPUSTATE cpu;
    544         rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &cpu, "Guest Trap (#UD): ");
     541        rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.rip, &cpu, "Guest Trap (#UD): ");
    545542        if (    RT_SUCCESS(rc)
    546543            && (cpu.pCurInstr->uOpcode == OP_MONITOR || cpu.pCurInstr->uOpcode == OP_MWAIT))
     
    553550                AssertRC(rc);
    554551
    555                 rc = VBOXSTRICTRC_TODO(EMInterpretInstructionDisasState(pVCpu, &cpu, CPUMCTX2CORE(pCtx), 0, EMCODETYPE_SUPERVISOR));
     552                rc = VBOXSTRICTRC_TODO(EMInterpretInstructionDisasState(pVCpu, &cpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx),
     553                                                                        0, EMCODETYPE_SUPERVISOR));
    556554                if (RT_SUCCESS(rc))
    557555                    return rc;
     
    568566         *        I/O access. We can easily handle those in RC.  */
    569567        DISCPUSTATE cpu;
    570         rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &cpu, "Guest Trap: ");
     568        rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.rip, &cpu, "Guest Trap: ");
    571569        if (    RT_SUCCESS(rc)
    572570            &&  (cpu.pCurInstr->fOpType & DISOPTYPE_PORTIO))
     
    591589    int rc2 = PGMGstGetPage(pVCpu, uCR2, &fFlags, &GCPhys);
    592590    Log(("emR3RawGuestTrap: cs:eip=%04x:%08x: trap=%02x err=%08x cr2=%08x cr0=%08x%s: Phys=%RGp fFlags=%08llx %s %s %s%s rc2=%d\n",
    593          pCtx->cs.Sel, pCtx->eip, u8TrapNo, uErrorCode, uCR2, (uint32_t)pCtx->cr0,
     591         pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, u8TrapNo, uErrorCode, uCR2, (uint32_t)pVCpu->cpum.GstCtx.cr0,
    594592         (enmType == TRPM_SOFTWARE_INT) ? " software" : "",  GCPhys, fFlags,
    595593         fFlags & X86_PTE_P  ? "P " : "NP", fFlags & X86_PTE_US ? "U"  : "S",
     
    602600     */
    603601    if (u8TrapNo == 14 /* #PG */)
    604         pCtx->cr2 = uCR2;
     602        pVCpu->cpum.GstCtx.cr2 = uCR2;
    605603
    606604    return VINF_EM_RESCHEDULE_REM;
     
    620618    int         rc;
    621619    DISCPUSTATE Cpu;
    622     PCPUMCTX    pCtx = pVCpu->em.s.pCtx;
    623620
    624621    /*
    625622     * sysenter, syscall & callgate
    626623     */
    627     rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &Cpu, "RSWITCH: ");
     624    rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.rip, &Cpu, "RSWITCH: ");
    628625    if (RT_SUCCESS(rc))
    629626    {
    630627        if (Cpu.pCurInstr->uOpcode == OP_SYSENTER)
    631628        {
    632             if (pCtx->SysEnter.cs != 0)
     629            if (pVCpu->cpum.GstCtx.SysEnter.cs != 0)
    633630            {
    634                 rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip),
     631                rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), pVCpu->cpum.GstCtx.eip),
    635632                                        CPUMGetGuestCodeBits(pVCpu) == 32 ? PATMFL_CODE32 : 0);
    636633                if (RT_SUCCESS(rc))
     
    674671 * @param   pVM     The cross context VM structure.
    675672 * @param   pVCpu   The cross context virtual CPU structure.
    676  * @param   pCtx    Pointer to the guest CPU context.
    677673 * @param   gcret   GC return code.
    678674 */
    679 static int emR3RawPatchTrap(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, int gcret)
     675static int emR3RawPatchTrap(PVM pVM, PVMCPU pVCpu, int gcret)
    680676{
    681677    uint8_t         u8TrapNo;
     
    685681    RTGCUINTPTR     uCR2;
    686682
    687     Assert(PATMIsPatchGCAddr(pVM, pCtx->eip));
     683    Assert(PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip));
    688684
    689685    if (gcret == VINF_PATM_PATCH_INT3)
     
    723719
    724720        DISCPUSTATE Cpu;
    725         rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->eip, &Cpu, "Patch code: ");
     721        rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.eip, &Cpu, "Patch code: ");
    726722        if (    RT_SUCCESS(rc)
    727723            &&  Cpu.pCurInstr->uOpcode == OP_IRET)
     
    730726
    731727            /* Iret crashes are bad as we have already changed the flags on the stack */
    732             rc  = PGMPhysSimpleReadGCPtr(pVCpu, &eip,     pCtx->esp, 4);
    733             rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selCS,   pCtx->esp+4, 4);
    734             rc |= PGMPhysSimpleReadGCPtr(pVCpu, &uEFlags, pCtx->esp+8, 4);
     728            rc  = PGMPhysSimpleReadGCPtr(pVCpu, &eip,     pVCpu->cpum.GstCtx.esp, 4);
     729            rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selCS,   pVCpu->cpum.GstCtx.esp+4, 4);
     730            rc |= PGMPhysSimpleReadGCPtr(pVCpu, &uEFlags, pVCpu->cpum.GstCtx.esp+8, 4);
    735731            if (rc == VINF_SUCCESS)
    736732            {
     
    740736                    uint32_t selSS, esp;
    741737
    742                     rc |= PGMPhysSimpleReadGCPtr(pVCpu, &esp,     pCtx->esp + 12, 4);
    743                     rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selSS,   pCtx->esp + 16, 4);
     738                    rc |= PGMPhysSimpleReadGCPtr(pVCpu, &esp,     pVCpu->cpum.GstCtx.esp + 12, 4);
     739                    rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selSS,   pVCpu->cpum.GstCtx.esp + 16, 4);
    744740
    745741                    if (uEFlags & X86_EFL_VM)
    746742                    {
    747743                        uint32_t selDS, selES, selFS, selGS;
    748                         rc  = PGMPhysSimpleReadGCPtr(pVCpu, &selES,   pCtx->esp + 20, 4);
    749                         rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selDS,   pCtx->esp + 24, 4);
    750                         rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selFS,   pCtx->esp + 28, 4);
    751                         rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selGS,   pCtx->esp + 32, 4);
     744                        rc  = PGMPhysSimpleReadGCPtr(pVCpu, &selES,   pVCpu->cpum.GstCtx.esp + 20, 4);
     745                        rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selDS,   pVCpu->cpum.GstCtx.esp + 24, 4);
     746                        rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selFS,   pVCpu->cpum.GstCtx.esp + 28, 4);
     747                        rc |= PGMPhysSimpleReadGCPtr(pVCpu, &selGS,   pVCpu->cpum.GstCtx.esp + 32, 4);
    752748                        if (rc == VINF_SUCCESS)
    753749                        {
     
    765761#endif /* LOG_ENABLED */
    766762        Log(("emR3RawPatchTrap: in patch: eip=%08x: trap=%02x err=%08x cr2=%08x cr0=%08x\n",
    767              pCtx->eip, u8TrapNo, uErrorCode, uCR2, (uint32_t)pCtx->cr0));
     763             pVCpu->cpum.GstCtx.eip, u8TrapNo, uErrorCode, uCR2, (uint32_t)pVCpu->cpum.GstCtx.cr0));
    768764
    769765        RTGCPTR uNewEip;
    770         rc = PATMR3HandleTrap(pVM, pCtx, pCtx->eip, &uNewEip);
     766        rc = PATMR3HandleTrap(pVM, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.eip, &uNewEip);
    771767        switch (rc)
    772768        {
     
    781777                    Log(("emR3RawPatchTrap: Virtual IF flag disabled!!\n"));
    782778
    783                 pCtx->eip = uNewEip;
    784                 AssertRelease(pCtx->eip);
    785 
    786                 if (pCtx->eflags.Bits.u1IF)
     779                pVCpu->cpum.GstCtx.eip = uNewEip;
     780                AssertRelease(pVCpu->cpum.GstCtx.eip);
     781
     782                if (pVCpu->cpum.GstCtx.eflags.Bits.u1IF)
    787783                {
    788784                    /* Windows XP lets irets fault intentionally and then takes action based on the opcode; an
     
    790786                     */
    791787                    if (    u8TrapNo == X86_XCPT_GP
    792                         &&  PATMIsInt3Patch(pVM, pCtx->eip, NULL, NULL))
     788                        &&  PATMIsInt3Patch(pVM, pVCpu->cpum.GstCtx.eip, NULL, NULL))
    793789                    {
    794790                        /** @todo move to PATMR3HandleTrap */
    795                         Log(("Possible Windows XP iret fault at %08RX32\n", pCtx->eip));
    796                         PATMR3RemovePatch(pVM, pCtx->eip);
     791                        Log(("Possible Windows XP iret fault at %08RX32\n", pVCpu->cpum.GstCtx.eip));
     792                        PATMR3RemovePatch(pVM, pVCpu->cpum.GstCtx.eip);
    797793                    }
    798794
     
    812808            case VINF_PATCH_EMULATE_INSTR:
    813809                Log(("emR3RawPatchTrap: Emulate patched instruction at %RGv IF=%d VMIF=%x\n",
    814                      uNewEip, pCtx->eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
    815                 pCtx->eip = uNewEip;
    816                 AssertRelease(pCtx->eip);
     810                     uNewEip, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pVCpu->em.s.pPatmGCState->uVMFlags));
     811                pVCpu->cpum.GstCtx.eip = uNewEip;
     812                AssertRelease(pVCpu->cpum.GstCtx.eip);
    817813                return emR3RawExecuteInstruction(pVM, pVCpu, "PATCHEMUL: ");
    818814
     
    823819                if (!(pVCpu->em.s.pPatmGCState->uVMFlags & X86_EFL_IF))
    824820                    Log(("emR3RawPatchTrap: Virtual IF flag disabled!!\n"));
    825                 pCtx->eip = uNewEip;
    826                 AssertRelease(pCtx->eip);
    827 
    828                 if (pCtx->eflags.Bits.u1IF)
     821                pVCpu->cpum.GstCtx.eip = uNewEip;
     822                AssertRelease(pVCpu->cpum.GstCtx.eip);
     823
     824                if (pVCpu->cpum.GstCtx.eflags.Bits.u1IF)
    829825                {
    830826                    /*
     
    861857static int emR3RawPrivileged(PVM pVM, PVMCPU pVCpu)
    862858{
    863     PCPUMCTX    pCtx = pVCpu->em.s.pCtx;
    864 
    865     Assert(!pCtx->eflags.Bits.u1VM);
     859    Assert(!pVCpu->cpum.GstCtx.eflags.Bits.u1VM);
    866860
    867861    if (PATMIsEnabled(pVM))
     
    870864         * Check if in patch code.
    871865         */
    872         if (PATMR3IsInsidePatchJump(pVM, pCtx->eip, NULL))
     866        if (PATMR3IsInsidePatchJump(pVM, pVCpu->cpum.GstCtx.eip, NULL))
    873867        {
    874868#ifdef LOG_ENABLED
    875869            DBGFR3_INFO_LOG(pVM, pVCpu, "cpumguest", "PRIV");
    876870#endif
    877             AssertMsgFailed(("FATAL ERROR: executing random instruction inside generated patch jump %08x\n", pCtx->eip));
     871            AssertMsgFailed(("FATAL ERROR: executing random instruction inside generated patch jump %08x\n", pVCpu->cpum.GstCtx.eip));
    878872            return VERR_EM_RAW_PATCH_CONFLICT;
    879873        }
    880         if (   (pCtx->ss.Sel & X86_SEL_RPL) == 0
    881             && !pCtx->eflags.Bits.u1VM
    882             && !PATMIsPatchGCAddr(pVM, pCtx->eip))
    883         {
    884             int rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(pCtx), pCtx->eip),
     874        if (   (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 0
     875            && !pVCpu->cpum.GstCtx.eflags.Bits.u1VM
     876            && !PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
     877        {
     878            int rc = PATMR3InstallPatch(pVM, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), pVCpu->cpum.GstCtx.eip),
    885879                                        CPUMGetGuestCodeBits(pVCpu) == 32 ? PATMFL_CODE32 : 0);
    886880            if (RT_SUCCESS(rc))
     
    896890
    897891#ifdef LOG_ENABLED
    898     if (!PATMIsPatchGCAddr(pVM, pCtx->eip))
     892    if (!PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
    899893    {
    900894        DBGFR3_INFO_LOG(pVM, pVCpu, "cpumguest", "PRIV");
     
    909903    int         rc;
    910904
    911     rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &Cpu, "PRIV: ");
     905    rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.rip, &Cpu, "PRIV: ");
    912906    if (RT_SUCCESS(rc))
    913907    {
     
    924918            case OP_CLI:
    925919                STAM_COUNTER_INC(&pStats->StatCli);
    926                 emR3RecordCli(pVM, pVCpu, pCtx->rip);
     920                emR3RecordCli(pVM, pVCpu, pVCpu->cpum.GstCtx.rip);
    927921                break;
    928922            case OP_STI:
     
    988982        }
    989983#endif /* VBOX_WITH_STATISTICS */
    990         if (    (pCtx->ss.Sel & X86_SEL_RPL) == 0
    991             &&  !pCtx->eflags.Bits.u1VM
     984        if (    (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 0
     985            &&  !pVCpu->cpum.GstCtx.eflags.Bits.u1VM
    992986            &&  CPUMGetGuestCodeBits(pVCpu) == 32)
    993987        {
     
    996990            {
    997991                case OP_CLI:
    998                     pCtx->eflags.u32 &= ~X86_EFL_IF;
     992                    pVCpu->cpum.GstCtx.eflags.u32 &= ~X86_EFL_IF;
    999993                    Assert(Cpu.cbInstr == 1);
    1000                     pCtx->rip += Cpu.cbInstr;
     994                    pVCpu->cpum.GstCtx.rip += Cpu.cbInstr;
    1001995                    STAM_PROFILE_STOP(&pVCpu->em.s.StatPrivEmu, a);
    1002996                    return VINF_EM_RESCHEDULE_REM; /* must go to the recompiler now! */
    1003997
    1004998                case OP_STI:
    1005                     pCtx->eflags.u32 |= X86_EFL_IF;
    1006                     EMSetInhibitInterruptsPC(pVCpu, pCtx->rip + Cpu.cbInstr);
     999                    pVCpu->cpum.GstCtx.eflags.u32 |= X86_EFL_IF;
     1000                    EMSetInhibitInterruptsPC(pVCpu, pVCpu->cpum.GstCtx.rip + Cpu.cbInstr);
    10071001                    Assert(Cpu.cbInstr == 1);
    1008                     pCtx->rip += Cpu.cbInstr;
     1002                    pVCpu->cpum.GstCtx.rip += Cpu.cbInstr;
    10091003                    STAM_PROFILE_STOP(&pVCpu->em.s.StatPrivEmu, a);
    10101004                    return VINF_SUCCESS;
    10111005
    10121006                case OP_HLT:
    1013                     if (PATMIsPatchGCAddr(pVM, pCtx->eip))
     1007                    if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
    10141008                    {
    10151009                        PATMTRANSSTATE  enmState;
    1016                         RTGCPTR         pOrgInstrGC = PATMR3PatchToGCPtr(pVM, pCtx->eip, &enmState);
     1010                        RTGCPTR         pOrgInstrGC = PATMR3PatchToGCPtr(pVM, pVCpu->cpum.GstCtx.eip, &enmState);
    10171011
    10181012                        if (enmState == PATMTRANS_OVERWRITTEN)
     
    10211015                            Assert(rc == VERR_PATCH_DISABLED);
    10221016                            /* Conflict detected, patch disabled */
    1023                             Log(("emR3RawPrivileged: detected conflict -> disabled patch at %08RX32\n", pCtx->eip));
     1017                            Log(("emR3RawPrivileged: detected conflict -> disabled patch at %08RX32\n", pVCpu->cpum.GstCtx.eip));
    10241018
    10251019                            enmState = PATMTRANS_SAFE;
     
    10271021
    10281022                        /* The translation had better be successful. Otherwise we can't recover. */
    1029                         AssertReleaseMsg(pOrgInstrGC && enmState != PATMTRANS_OVERWRITTEN, ("Unable to translate instruction address at %08RX32\n", pCtx->eip));
     1023                        AssertReleaseMsg(pOrgInstrGC && enmState != PATMTRANS_OVERWRITTEN, ("Unable to translate instruction address at %08RX32\n", pVCpu->cpum.GstCtx.eip));
    10301024                        if (enmState != PATMTRANS_OVERWRITTEN)
    1031                             pCtx->eip = pOrgInstrGC;
     1025                            pVCpu->cpum.GstCtx.eip = pOrgInstrGC;
    10321026                    }
    10331027                    /* no break; we could just return VINF_EM_HALT here */
     
    10371031                case OP_MOV_DR:
    10381032#ifdef LOG_ENABLED
    1039                     if (PATMIsPatchGCAddr(pVM, pCtx->eip))
     1033                    if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
    10401034                    {
    10411035                        DBGFR3_INFO_LOG(pVM, pVCpu, "cpumguest", "PRIV");
     
    10441038#endif
    10451039
    1046                     rc = VBOXSTRICTRC_TODO(EMInterpretInstructionDisasState(pVCpu, &Cpu, CPUMCTX2CORE(pCtx), 0, EMCODETYPE_SUPERVISOR));
     1040                    rc = VBOXSTRICTRC_TODO(EMInterpretInstructionDisasState(pVCpu, &Cpu, CPUMCTX2CORE(&pVCpu->cpum.GstCtx),
     1041                                                                            0, EMCODETYPE_SUPERVISOR));
    10471042                    if (RT_SUCCESS(rc))
    10481043                    {
     
    10561051                             * us to go to the recompiler.
    10571052                             */
    1058                             if (   PATMIsPatchGCAddr(pVM, pCtx->rip)
    1059                                 && (pCtx->cr0 & (X86_CR0_WP|X86_CR0_PG|X86_CR0_PE)) != (X86_CR0_WP|X86_CR0_PG|X86_CR0_PE))
     1053                            if (   PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.rip)
     1054                                && (pVCpu->cpum.GstCtx.cr0 & (X86_CR0_WP|X86_CR0_PG|X86_CR0_PE)) != (X86_CR0_WP|X86_CR0_PG|X86_CR0_PE))
    10601055                            {
    10611056                                PATMTRANSSTATE  enmState;
    1062                                 RTGCPTR         pOrgInstrGC = PATMR3PatchToGCPtr(pVM, pCtx->rip, &enmState);
    1063 
    1064                                 Log(("Force recompiler switch due to cr0 (%RGp) update rip=%RGv -> %RGv (enmState=%d)\n", pCtx->cr0, pCtx->rip, pOrgInstrGC, enmState));
     1057                                RTGCPTR         pOrgInstrGC = PATMR3PatchToGCPtr(pVM, pVCpu->cpum.GstCtx.rip, &enmState);
     1058
     1059                                Log(("Force recompiler switch due to cr0 (%RGp) update rip=%RGv -> %RGv (enmState=%d)\n", pVCpu->cpum.GstCtx.cr0, pVCpu->cpum.GstCtx.rip, pOrgInstrGC, enmState));
    10651060                                if (enmState == PATMTRANS_OVERWRITTEN)
    10661061                                {
     
    10681063                                    Assert(rc == VERR_PATCH_DISABLED);
    10691064                                    /* Conflict detected, patch disabled */
    1070                                     Log(("emR3RawPrivileged: detected conflict -> disabled patch at %RGv\n", (RTGCPTR)pCtx->rip));
     1065                                    Log(("emR3RawPrivileged: detected conflict -> disabled patch at %RGv\n", (RTGCPTR)pVCpu->cpum.GstCtx.rip));
    10711066                                    enmState = PATMTRANS_SAFE;
    10721067                                }
    10731068                                /* The translation had better be successful. Otherwise we can't recover. */
    1074                                 AssertReleaseMsg(pOrgInstrGC && enmState != PATMTRANS_OVERWRITTEN, ("Unable to translate instruction address at %RGv\n", (RTGCPTR)pCtx->rip));
     1069                                AssertReleaseMsg(pOrgInstrGC && enmState != PATMTRANS_OVERWRITTEN, ("Unable to translate instruction address at %RGv\n", (RTGCPTR)pVCpu->cpum.GstCtx.rip));
    10751070                                if (enmState != PATMTRANS_OVERWRITTEN)
    1076                                     pCtx->rip = pOrgInstrGC;
     1071                                    pVCpu->cpum.GstCtx.rip = pOrgInstrGC;
    10771072                            }
    10781073
     
    10891084    }
    10901085
    1091     if (PATMIsPatchGCAddr(pVM, pCtx->eip))
    1092         return emR3RawPatchTrap(pVM, pVCpu, pCtx, VINF_PATM_PATCH_TRAP_GP);
     1086    if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
     1087        return emR3RawPatchTrap(pVM, pVCpu, VINF_PATM_PATCH_TRAP_GP);
    10931088
    10941089    return emR3RawExecuteInstruction(pVM, pVCpu, "PRIV");
     
    11111106 * @param   pVM     The cross context VM structure.
    11121107 * @param   pVCpu   The cross context virtual CPU structure.
    1113  * @param   pCtx    Pointer to the guest CPU context.
    11141108 * @param   rc      The result code.
    11151109 */
    1116 int emR3RawUpdateForceFlag(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx, int rc)
     1110static int emR3RawUpdateForceFlag(PVM pVM, PVMCPU pVCpu, int rc)
    11171111{
    1118     if (PATMIsPatchGCAddr(pVM, pCtx->eip)) /** @todo check cs selector base/type */
     1112    if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip)) /** @todo check cs selector base/type */
    11191113    {
    11201114        /* ignore reschedule attempts. */
     
    11451139VMMR3_INT_DECL(int) EMR3CheckRawForcedActions(PVM pVM, PVMCPU pVCpu)
    11461140{
    1147     int rc = emR3RawForcedActions(pVM, pVCpu, pVCpu->em.s.pCtx);
     1141    int rc = emR3RawForcedActions(pVM, pVCpu);
    11481142    VBOXVMM_EM_FF_RAW_RET(pVCpu, rc);
    11491143    return rc;
     
    11601154 * @param   pVM         The cross context VM structure.
    11611155 * @param   pVCpu       The cross context virtual CPU structure.
    1162  * @param   pCtx        Pointer to the guest CPU context.
    11631156 */
    1164 static int emR3RawForcedActions(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
     1157static int emR3RawForcedActions(PVM pVM, PVMCPU pVCpu)
    11651158{
    11661159    /*
     
    11931186            && CSAMIsEnabled(pVM))
    11941187        {
    1195             int rc = PGMSyncCR3(pVCpu, pCtx->cr0, pCtx->cr3, pCtx->cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
     1188            int rc = PGMSyncCR3(pVCpu, pVCpu->cpum.GstCtx.cr0, pVCpu->cpum.GstCtx.cr3, pVCpu->cpum.GstCtx.cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
    11961189            if (RT_FAILURE(rc))
    11971190                return rc;
     
    12191212    {
    12201213        Assert(pVCpu->em.s.enmState != EMSTATE_WAIT_SIPI);
    1221         int rc = PGMSyncCR3(pVCpu, pCtx->cr0, pCtx->cr3, pCtx->cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
     1214        int rc = PGMSyncCR3(pVCpu, pVCpu->cpum.GstCtx.cr0, pVCpu->cpum.GstCtx.cr3, pVCpu->cpum.GstCtx.cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
    12221215        if (RT_FAILURE(rc))
    12231216            return rc == VERR_PGM_NO_HYPERVISOR_ADDRESS ? VINF_EM_RESCHEDULE_REM : rc;
     
    12271220        /* Prefetch pages for EIP and ESP. */
    12281221        /** @todo This is rather expensive. Should investigate if it really helps at all. */
    1229         rc = PGMPrefetchPage(pVCpu, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(pCtx), pCtx->rip));
     1222        rc = PGMPrefetchPage(pVCpu, SELMToFlat(pVM, DISSELREG_CS, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), pVCpu->cpum.GstCtx.rip));
    12301223        if (rc == VINF_SUCCESS)
    1231             rc = PGMPrefetchPage(pVCpu, SELMToFlat(pVM, DISSELREG_SS, CPUMCTX2CORE(pCtx), pCtx->rsp));
     1224            rc = PGMPrefetchPage(pVCpu, SELMToFlat(pVM, DISSELREG_SS, CPUMCTX2CORE(&pVCpu->cpum.GstCtx), pVCpu->cpum.GstCtx.rsp));
    12321225        if (rc != VINF_SUCCESS)
    12331226        {
     
    12371230                return rc;
    12381231            }
    1239             rc = PGMSyncCR3(pVCpu, pCtx->cr0, pCtx->cr3, pCtx->cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
     1232            rc = PGMSyncCR3(pVCpu, pVCpu->cpum.GstCtx.cr0, pVCpu->cpum.GstCtx.cr3, pVCpu->cpum.GstCtx.cr4, VMCPU_FF_IS_SET(pVCpu, VMCPU_FF_PGM_SYNC_CR3));
    12401233            if (RT_FAILURE(rc))
    12411234                return rc;
     
    12881281
    12891282    int      rc = VERR_IPE_UNINITIALIZED_STATUS;
    1290     PCPUMCTX pCtx = pVCpu->em.s.pCtx;
    1291     LogFlow(("emR3RawExecute: (cs:eip=%04x:%08x)\n", pCtx->cs.Sel, pCtx->eip));
     1283    LogFlow(("emR3RawExecute: (cs:eip=%04x:%08x)\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip));
    12921284    pVCpu->em.s.fForceRAW = false;
    12931285    *pfFFDone = false;
     
    13081300         */
    13091301#ifdef VBOX_STRICT
    1310         Assert(pCtx->eflags.Bits.u1VM || (pCtx->ss.Sel & X86_SEL_RPL) == 3 || (pCtx->ss.Sel & X86_SEL_RPL) == 0
    1311                || (EMIsRawRing1Enabled(pVM) && (pCtx->ss.Sel & X86_SEL_RPL) == 1));
    1312         AssertMsg(   (pCtx->eflags.u32 & X86_EFL_IF)
    1313                   || PATMShouldUseRawMode(pVM, (RTGCPTR)pCtx->eip),
    1314                   ("Tried to execute code with IF at EIP=%08x!\n", pCtx->eip));
     1302        Assert(pVCpu->cpum.GstCtx.eflags.Bits.u1VM || (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 3 || (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 0
     1303               || (EMIsRawRing1Enabled(pVM) && (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 1));
     1304        AssertMsg(   (pVCpu->cpum.GstCtx.eflags.u32 & X86_EFL_IF)
     1305                  || PATMShouldUseRawMode(pVM, (RTGCPTR)pVCpu->cpum.GstCtx.eip),
     1306                  ("Tried to execute code with IF at EIP=%08x!\n", pVCpu->cpum.GstCtx.eip));
    13151307        if (    !VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_PGM_SYNC_CR3 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL)
    13161308            &&  PGMMapHasConflicts(pVM))
     
    13281320            ||  VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
    13291321        {
    1330             rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
     1322            rc = emR3RawForcedActions(pVM, pVCpu);
    13311323            VBOXVMM_EM_FF_RAW_RET(pVCpu, rc);
    13321324            if (rc != VINF_SUCCESS)
     
    13491341         * Scan code before executing it. Don't bother with user mode or V86 code
    13501342         */
    1351         if (    (pCtx->ss.Sel & X86_SEL_RPL) <= 1
    1352             &&  !pCtx->eflags.Bits.u1VM
    1353             && !PATMIsPatchGCAddr(pVM, pCtx->eip))
     1343        if (    (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) <= 1
     1344            &&  !pVCpu->cpum.GstCtx.eflags.Bits.u1VM
     1345            && !PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip))
    13541346        {
    13551347            STAM_PROFILE_ADV_SUSPEND(&pVCpu->em.s.StatRAWEntry, b);
    1356             CSAMR3CheckCodeEx(pVM, pCtx, pCtx->eip);
     1348            CSAMR3CheckCodeEx(pVM, &pVCpu->cpum.GstCtx, pVCpu->cpum.GstCtx.eip);
    13571349            STAM_PROFILE_ADV_RESUME(&pVCpu->em.s.StatRAWEntry, b);
    13581350            if (    VM_FF_IS_PENDING(pVM, VM_FF_HIGH_PRIORITY_PRE_RAW_MASK)
    13591351                ||  VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
    13601352            {
    1361                 rc = emR3RawForcedActions(pVM, pVCpu, pCtx);
     1353                rc = emR3RawForcedActions(pVM, pVCpu);
    13621354                VBOXVMM_EM_FF_RAW_RET(pVCpu, rc);
    13631355                if (rc != VINF_SUCCESS)
     
    13741366         */
    13751367        PPATMGCSTATE pGCState = PATMR3QueryGCStateHC(pVM);
    1376         if (pCtx->eflags.Bits.u1VM)
    1377             Log(("RV86: %04x:%08x IF=%d VMFlags=%x\n", pCtx->cs.Sel, pCtx->eip, pCtx->eflags.Bits.u1IF, pGCState->uVMFlags));
    1378         else if ((pCtx->ss.Sel & X86_SEL_RPL) == 1)
     1368        if (pVCpu->cpum.GstCtx.eflags.Bits.u1VM)
     1369            Log(("RV86: %04x:%08x IF=%d VMFlags=%x\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pGCState->uVMFlags));
     1370        else if ((pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 1)
    13791371            Log(("RR0: %x:%08x ESP=%x:%08x EFL=%x IF=%d/%d VMFlags=%x PIF=%d CPL=%d (Scanned=%d)\n",
    1380                  pCtx->cs.Sel, pCtx->eip, pCtx->ss.Sel, pCtx->esp, CPUMRawGetEFlags(pVCpu), !!(pGCState->uVMFlags & X86_EFL_IF), pCtx->eflags.Bits.u1IF,
    1381                  pGCState->uVMFlags, pGCState->fPIF, (pCtx->ss.Sel & X86_SEL_RPL), CSAMIsPageScanned(pVM, (RTGCPTR)pCtx->eip)));
     1372                 pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.esp, CPUMRawGetEFlags(pVCpu), !!(pGCState->uVMFlags & X86_EFL_IF), pVCpu->cpum.GstCtx.eflags.Bits.u1IF,
     1373                 pGCState->uVMFlags, pGCState->fPIF, (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL), CSAMIsPageScanned(pVM, (RTGCPTR)pVCpu->cpum.GstCtx.eip)));
    13821374# ifdef VBOX_WITH_RAW_RING1
    1383         else if ((pCtx->ss.Sel & X86_SEL_RPL) == 2)
    1384             Log(("RR1: %x:%08x ESP=%x:%08x IF=%d VMFlags=%x CPL=%x\n", pCtx->cs.Sel, pCtx->eip, pCtx->ss.Sel, pCtx->esp, pCtx->eflags.Bits.u1IF, pGCState->uVMFlags, (pCtx->ss.Sel & X86_SEL_RPL)));
     1375        else if ((pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 2)
     1376            Log(("RR1: %x:%08x ESP=%x:%08x IF=%d VMFlags=%x CPL=%x\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.esp, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pGCState->uVMFlags, (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL)));
    13851377# endif
    1386         else if ((pCtx->ss.Sel & X86_SEL_RPL) == 3)
    1387             Log(("RR3: %x:%08x ESP=%x:%08x IF=%d VMFlags=%x\n", pCtx->cs.Sel, pCtx->eip, pCtx->ss.Sel, pCtx->esp, pCtx->eflags.Bits.u1IF, pGCState->uVMFlags));
     1378        else if ((pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) == 3)
     1379            Log(("RR3: %x:%08x ESP=%x:%08x IF=%d VMFlags=%x\n", pVCpu->cpum.GstCtx.cs.Sel, pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.ss.Sel, pVCpu->cpum.GstCtx.esp, pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pGCState->uVMFlags));
    13881380#endif /* LOG_ENABLED */
    13891381
     
    13971389        {
    13981390            STAM_PROFILE_START(&pVCpu->em.s.StatRAWExec, c);
    1399             VBOXVMM_EM_RAW_RUN_PRE(pVCpu, pCtx);
     1391            VBOXVMM_EM_RAW_RUN_PRE(pVCpu, &pVCpu->cpum.GstCtx);
    14001392            rc = VMMR3RawRunGC(pVM, pVCpu);
    1401             VBOXVMM_EM_RAW_RUN_RET(pVCpu, pCtx, rc);
     1393            VBOXVMM_EM_RAW_RUN_RET(pVCpu, &pVCpu->cpum.GstCtx, rc);
    14021394            STAM_PROFILE_STOP(&pVCpu->em.s.StatRAWExec, c);
    14031395        }
     
    14131405
    14141406        LogFlow(("RR%u-E: %08x ESP=%08x EFL=%x IF=%d/%d VMFlags=%x PIF=%d\n",
    1415                  (pCtx->ss.Sel & X86_SEL_RPL), pCtx->eip, pCtx->esp, CPUMRawGetEFlags(pVCpu),
    1416                  !!(pGCState->uVMFlags & X86_EFL_IF), pCtx->eflags.Bits.u1IF, pGCState->uVMFlags, pGCState->fPIF));
     1407                 (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL), pVCpu->cpum.GstCtx.eip, pVCpu->cpum.GstCtx.esp, CPUMRawGetEFlags(pVCpu),
     1408                 !!(pGCState->uVMFlags & X86_EFL_IF), pVCpu->cpum.GstCtx.eflags.Bits.u1IF, pGCState->uVMFlags, pGCState->fPIF));
    14171409        LogFlow(("VMMR3RawRunGC returned %Rrc\n", rc));
    14181410
     
    14501442
    14511443            default:
    1452                 if (PATMIsPatchGCAddr(pVM, pCtx->eip) && !(pCtx->eflags.u32 & X86_EFL_TF))
     1444                if (PATMIsPatchGCAddr(pVM, pVCpu->cpum.GstCtx.eip) && !(pVCpu->cpum.GstCtx.eflags.u32 & X86_EFL_TF))
    14531445                    LogIt(0, LOG_GROUP_PATM, ("Patch code interrupted at %RRv for reason %Rrc\n", (RTRCPTR)CPUMGetGuestEIP(pVCpu), rc));
    14541446                break;
     
    14741466            break;
    14751467        }
    1476         rc = emR3RawHandleRC(pVM, pVCpu, pCtx, rc);
     1468        rc = emR3RawHandleRC(pVM, pVCpu, rc);
    14771469        if (rc != VINF_SUCCESS)
    14781470        {
    1479             rc = emR3RawUpdateForceFlag(pVM, pVCpu, pCtx, rc);
     1471            rc = emR3RawUpdateForceFlag(pVM, pVCpu, rc);
    14801472            if (rc != VINF_SUCCESS)
    14811473            {
     
    14951487            ||  VMCPU_FF_IS_PENDING(pVCpu, ~VMCPU_FF_HIGH_PRIORITY_PRE_RAW_MASK))
    14961488        {
    1497             Assert(pCtx->eflags.Bits.u1VM || (pCtx->ss.Sel & X86_SEL_RPL) != (EMIsRawRing1Enabled(pVM) ? 2U : 1U));
     1489            Assert(pVCpu->cpum.GstCtx.eflags.Bits.u1VM || (pVCpu->cpum.GstCtx.ss.Sel & X86_SEL_RPL) != (EMIsRawRing1Enabled(pVM) ? 2U : 1U));
    14981490
    14991491            STAM_REL_PROFILE_ADV_SUSPEND(&pVCpu->em.s.StatRAWTotal, a);
     
    15041496                &&  rc != VINF_EM_RESCHEDULE_RAW)
    15051497            {
    1506                 rc = emR3RawUpdateForceFlag(pVM, pVCpu, pCtx, rc);
     1498                rc = emR3RawUpdateForceFlag(pVM, pVCpu, rc);
    15071499                if (rc != VINF_SUCCESS)
    15081500                {
Note: See TracChangeset for help on using the changeset viewer.

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