VirtualBox

Changeset 20046 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 26, 2009 3:44:43 PM (16 years ago)
Author:
vboxsync
Message:

Updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HWSVMR0.cpp

    r20038 r20046  
    13241324        /* Error code present? (redundant) */
    13251325        if (pVMCB->ctrl.ExitIntInfo.n.u1ErrorCodeValid)
    1326         {
    13271326            pVCpu->hwaccm.s.Event.errCode  = pVMCB->ctrl.ExitIntInfo.n.u32ErrorCode;
    1328         }
    13291327        else
    13301328            pVCpu->hwaccm.s.Event.errCode  = 0;
     
    14751473                    if (    rc == VINF_SUCCESS
    14761474                        &&  Cpu.pCurInstr->opcode == OP_MOV
    1477                         &&  cbOp >= 5)
     1475                        &&  (cbOp == 5 || cbOp == 6))
    14781476                    {
     1477                        uint8_t szInstr[15];
    14791478                        if (    (errCode & X86_TRAP_PF_RW)
    1480                             &&  Cpu.param1.disp32 == (uint32_t)uFaultAddress)
     1479                            &&  Cpu.param1.disp32 == (uint32_t)uFaultAddress
     1480                            &&  Cpu.param2.flags == USE_REG_GEN32)
    14811481                        {
     1482                            /* 0xF0, 0x0F, 0x22, 0xC0 = mov cr8, eax */
     1483                            szInstr[0] = 0xF0;
     1484                            szInstr[1] = 0x0F;
     1485                            szInstr[2] = 0x22;
     1486                            szInstr[3] = 0xC0 | Cpu.param2.base.reg_gen;
     1487                            for (unsigned i = 4; i < cbOp; i++)
     1488                                szInstr[i] = 0x90;  /* nop */
     1489
     1490                            rc = PGMPhysSimpleWriteGCPtr(pVCpu, pCtx->rip, szInstr, cbOp);
     1491                            AssertRC(rc);
     1492
    14821493                            pVM->hwaccm.s.svm.fTPRPatching = true;
    14831494                            Log(("Acceptable write candidate!\n"));
     1495                            STAM_PROFILE_ADV_STOP(&pVCpu->hwaccm.s.StatExit1, x);
     1496                            goto ResumeExecution;
    14841497                        }
    14851498                        else
    1486                         if (Cpu.param2.disp32 == (uint32_t)uFaultAddress)
     1499                        if (    Cpu.param2.disp32 == (uint32_t)uFaultAddress
     1500                            &&  Cpu.param1.flags == USE_REG_GEN32)
    14871501                        {
     1502                            /* 0xF0, 0x0F, 0x20, 0xC0 = mov eax, cr8 */
     1503                            szInstr[0] = 0xF0;
     1504                            szInstr[1] = 0x0F;
     1505                            szInstr[2] = 0x20;
     1506                            szInstr[3] = 0xC0 | Cpu.param1.base.reg_gen;
     1507                            for (unsigned i = 4; i < cbOp; i++)
     1508                                szInstr[i] = 0x90;  /* nop */
     1509
     1510                            rc = PGMPhysSimpleWriteGCPtr(pVCpu, pCtx->rip, szInstr, cbOp);
     1511                            AssertRC(rc);
     1512
    14881513                            pVM->hwaccm.s.svm.fTPRPatching = true;
    14891514                            Log(("Acceptable read candidate!\n"));
     1515                            STAM_PROFILE_ADV_STOP(&pVCpu->hwaccm.s.StatExit1, x);
     1516                            goto ResumeExecution;
    14901517                        }
    14911518                    }
     
    18161843
    18171844            /* Must be set by PGMSyncCR3 */
    1818             AssertMsg(rc == VINF_SUCCESS || PGMGetGuestMode(pVCpu) <= PGMMODE_PROTECTED || pVCpu->hwaccm.s.fForceTLBFlush,
     1845            AssertMsg(rc == VINF_SUCCESS || rc == VINF_PGM_SYNC_CR3 || PGMGetGuestMode(pVCpu) <= PGMMODE_PROTECTED || pVCpu->hwaccm.s.fForceTLBFlush,
    18191846                      ("rc=%Rrc mode=%d fForceTLBFlush=%RTbool\n", rc, PGMGetGuestMode(pVCpu), pVCpu->hwaccm.s.fForceTLBFlush));
    18201847        }
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