VirtualBox

Ignore:
Timestamp:
May 19, 2015 2:27:00 PM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
100431
Message:

CSAM,PATM: Changed csamRCCodePageWritePfHandler to store the pvFault address in pvDirtyFaultPage and made csamR3FlushDirtyPages make it instead of pvDirtyBasePage read-only (+ tell REM about it). Preparing ring-3 access handlers for raw-mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMRC/CSAMRC.cpp

    r55900 r55937  
    7272    PPATMGCSTATE pPATMGCState;
    7373    bool         fPatchCode = PATMIsPatchGCAddr(pVM, pRegFrame->eip);
    74     int          rc;
    7574    NOREF(uErrorCode);
    7675
     
    9695         * Make this particular page R/W.
    9796         */
    98         rc = PGMShwMakePageWritable(pVCpu, pvFault, PGM_MK_PG_IS_WRITE_FAULT);
     97        int rc = PGMShwMakePageWritable(pVCpu, pvFault, PGM_MK_PG_IS_WRITE_FAULT);
    9998        AssertMsgRC(rc, ("PGMShwModifyPage -> rc=%Rrc\n", rc));
    10099        ASMInvalidatePage((void *)(uintptr_t)pvFault);
     
    114113    if (cpl != 3)
    115114    {
    116         rc = PATMRCHandleWriteToPatchPage(pVM, pRegFrame, (RTRCPTR)((RTRCUINTPTR)pvRange + offRange), 4 /** @todo */);
    117         if (rc == VINF_SUCCESS)
    118             return rc;
    119         if (rc == VINF_EM_RAW_EMULATE_INSTR)
     115        VBOXSTRICTRC rcStrict = PATMRCHandleWriteToPatchPage(pVM, pRegFrame, (RTRCPTR)((RTRCUINTPTR)pvRange + offRange),
     116                                                             4 /** @todo */);
     117        if (rcStrict == VINF_SUCCESS)
     118            return rcStrict;
     119        if (rcStrict == VINF_EM_RAW_EMULATE_INSTR)
    120120        {
    121121            STAM_COUNTER_INC(&pVM->csam.s.StatDangerousWrite);
    122122            return VINF_EM_RAW_EMULATE_INSTR;
    123123        }
    124         Assert(rc == VERR_PATCH_NOT_FOUND);
     124        Assert(rcStrict == VERR_PATCH_NOT_FOUND);
    125125    }
    126126
     
    129129    /* Note that pvFault might be a different address in case of aliases. So use pvRange + offset instead!. */
    130130    pVM->csam.s.pvDirtyBasePage[pVM->csam.s.cDirtyPages] = (RTRCPTR)((RTRCUINTPTR)pvRange + offRange);
    131     pVM->csam.s.pvDirtyFaultPage[pVM->csam.s.cDirtyPages] = (RTRCPTR)((RTRCUINTPTR)pvRange + offRange);
     131    pVM->csam.s.pvDirtyFaultPage[pVM->csam.s.cDirtyPages] = (RTRCPTR)pvFault;
    132132    if (++pVM->csam.s.cDirtyPages == CSAM_MAX_DIRTY_PAGES)
    133133        return VINF_CSAM_PENDING_ACTION;
     
    137137     */
    138138    Log(("csamRCCodePageWriteHandler: enabled r/w for page %RGv\n", pvFault));
    139     rc = PGMShwMakePageWritable(pVCpu, pvFault, PGM_MK_PG_IS_WRITE_FAULT);
     139    int rc = PGMShwMakePageWritable(pVCpu, pvFault, PGM_MK_PG_IS_WRITE_FAULT);
    140140    AssertMsgRC(rc, ("PGMShwModifyPage -> rc=%Rrc\n", rc));
    141141    ASMInvalidatePage((void *)(uintptr_t)pvFault);
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