VirtualBox

Changeset 13045 in vbox


Ignore:
Timestamp:
Oct 7, 2008 1:04:43 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37500
Message:

#1865: More PGM changes.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/pgm.h

    r13042 r13045  
    183183
    184184/**
    185  * \#PF Handler callback for virtual access handler ranges.
     185 * \#PF Handler callback for virtual access handler ranges, RC.
    186186 *
    187187 * Important to realize that a physical page in a range can have aliases, and
     
    197197 *                      (If it's a EIP range this's the EIP, if not it's pvFault.)
    198198 */
    199 typedef DECLCALLBACK(int) FNPGMGCVIRTHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
     199typedef DECLCALLBACK(int) FNPGMRCVIRTHANDLER(PVM pVM, RTGCUINT uErrorCode, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, RTGCPTR pvRange, uintptr_t offRange);
    200200/** Pointer to PGM access callback. */
    201 typedef FNPGMGCVIRTHANDLER *PFNPGMGCVIRTHANDLER;
    202 
    203 /**
    204  * \#PF Handler callback for virtual access handler ranges.
     201typedef FNPGMRCVIRTHANDLER *PFNPGMRCVIRTHANDLER;
     202
     203/**
     204 * \#PF Handler callback for virtual access handler ranges, R3.
    205205 *
    206206 * Important to realize that a physical page in a range can have aliases, and
     
    217217 * @param   pvUser          User argument.
    218218 */
    219 typedef DECLCALLBACK(int) FNPGMHCVIRTHANDLER(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
     219typedef DECLCALLBACK(int) FNPGMR3VIRTHANDLER(PVM pVM, RTGCPTR GCPtr, void *pvPtr, void *pvBuf, size_t cbBuf, PGMACCESSTYPE enmAccessType, void *pvUser);
    220220/** Pointer to PGM access callback. */
    221 typedef FNPGMHCVIRTHANDLER *PFNPGMHCVIRTHANDLER;
     221typedef FNPGMR3VIRTHANDLER *PFNPGMR3VIRTHANDLER;
    222222
    223223
     
    228228 * @param   GCPtr           The virtual address the guest has changed.
    229229 */
    230 typedef DECLCALLBACK(int) FNPGMHCVIRTINVALIDATE(PVM pVM, RTGCPTR GCPtr);
     230typedef DECLCALLBACK(int) FNPGMR3VIRTINVALIDATE(PVM pVM, RTGCPTR GCPtr);
    231231/** Pointer to PGM invalidation callback. */
    232 typedef FNPGMHCVIRTINVALIDATE *PFNPGMHCVIRTINVALIDATE;
     232typedef FNPGMR3VIRTINVALIDATE *PFNPGMR3VIRTINVALIDATE;
    233233
    234234/**
     
    532532                                             const char *pszModRC, const char *pszHandlerRC, RTRCPTR pvUserRC, const char *pszDesc);
    533533VMMDECL(int)    PGMHandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
    534                                             PFNPGMHCVIRTINVALIDATE pfnInvalidateHC,
    535                                             PFNPGMHCVIRTHANDLER pfnHandlerHC, RTGCPTR pfnHandlerGC,
     534                                            R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3,
     535                                            R3PTRTYPE(PFNPGMR3VIRTHANDLER) pfnHandlerR3,
     536                                            RCPTRTYPE(PFNPGMRCVIRTHANDLER) pfnHandlerRC,
    536537                                            R3PTRTYPE(const char *) pszDesc);
    537538VMMR3DECL(int)  PGMR3HandlerVirtualRegister(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
    538                                             PFNPGMHCVIRTINVALIDATE pfnInvalidateHC,
    539                                             PFNPGMHCVIRTHANDLER pfnHandlerHC,
    540                                             const char *pszHandlerGC, const char *pszModGC, const char *pszDesc);
    541 VMMDECL(int)    PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, PFNPGMHCVIRTINVALIDATE pfnInvalidateHC);
     539                                            PFNPGMR3VIRTINVALIDATE pfnInvalidateR3,
     540                                            PFNPGMR3VIRTHANDLER pfnHandlerR3,
     541                                            const char *pszHandlerRC, const char *pszModRC, const char *pszDesc);
     542VMMDECL(int)    PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3);
    542543VMMDECL(int)    PGMHandlerVirtualDeregister(PVM pVM, RTGCPTR GCPtr);
    543544VMMR3DECL(int)  PGMR3PoolGrow(PVM pVM);
  • trunk/src/VBox/VMM/PGM.cpp

    r13042 r13045  
    19551955    Assert(     pHandler->enmType == PGMVIRTHANDLERTYPE_ALL
    19561956           ||   pHandler->enmType == PGMVIRTHANDLERTYPE_WRITE);
    1957     Assert(pHandler->pfnHandlerGC);
    1958     pHandler->pfnHandlerGC += offDelta;
     1957    Assert(pHandler->pfnHandlerRC);
     1958    pHandler->pfnHandlerRC += offDelta;
    19591959    return 0;
    19601960}
     
    19741974    RTGCINTPTR      offDelta = *(PRTGCINTPTR)pvUser;
    19751975    Assert(pHandler->enmType == PGMVIRTHANDLERTYPE_HYPERVISOR);
    1976     Assert(pHandler->pfnHandlerGC);
    1977     pHandler->pfnHandlerGC  += offDelta;
     1976    Assert(pHandler->pfnHandlerRC);
     1977    pHandler->pfnHandlerRC  += offDelta;
    19781978    return 0;
    19791979}
  • trunk/src/VBox/VMM/PGMHandler.cpp

    r13042 r13045  
    229229/** @todo rename this function to PGMR3HandlerVirtualRegister */
    230230VMMR3DECL(int) PGMR3HandlerVirtualRegister(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
    231                                            PFNPGMHCVIRTINVALIDATE pfnInvalidateHC,
    232                                            PFNPGMHCVIRTHANDLER pfnHandlerHC,
     231                                           PFNPGMR3VIRTINVALIDATE pfnInvalidateHC,
     232                                           PFNPGMR3VIRTHANDLER pfnHandlerHC,
    233233                                           const char *pszHandlerGC, const char *pszModGC,
    234234                                           const char *pszDesc)
     
    269269 * @param   GCPtr           Start address.
    270270 * @param   GCPtrLast       Last address (inclusive).
    271  * @param   pfnInvalidateHC The HC invalidate callback (can be 0)
    272  * @param   pfnHandlerHC    The HC handler.
    273  * @param   pfnHandlerGC    The GC handler.
     271 * @param   pfnInvalidateR3 The R3 invalidate callback (can be 0)
     272 * @param   pfnHandlerR3    The R3 handler.
     273 * @param   pfnHandlerRC    The RC handler.
    274274 * @param   pszDesc         Pointer to description string. This must not be freed.
    275275 * @thread  EMT
     
    279279 * duplicating the function pointers now. (Or we will once we add the missing callbacks.) */
    280280VMMDECL(int) PGMHandlerVirtualRegisterEx(PVM pVM, PGMVIRTHANDLERTYPE enmType, RTGCPTR GCPtr, RTGCPTR GCPtrLast,
    281                                          PFNPGMHCVIRTINVALIDATE pfnInvalidateHC,
    282                                          PFNPGMHCVIRTHANDLER pfnHandlerHC, RTGCPTR pfnHandlerGC,
     281                                         R3PTRTYPE(PFNPGMR3VIRTINVALIDATE) pfnInvalidateR3,
     282                                         R3PTRTYPE(PFNPGMR3VIRTHANDLER) pfnHandlerR3,
     283                                         RCPTRTYPE(PFNPGMRCVIRTHANDLER) pfnHandlerRC,
    283284                                         R3PTRTYPE(const char *) pszDesc)
    284285{
    285     Log(("PGMR3HandlerVirtualRegister: enmType=%d GCPtr=%RGv GCPtrLast=%RGv pfnHandlerGC=%RGv pszDesc=%s\n", enmType, GCPtr, GCPtrLast, pfnHandlerGC, pszDesc));
     286    Log(("PGMR3HandlerVirtualRegister: enmType=%d GCPtr=%RGv GCPtrLast=%RGv pfnInvalidateR3=%RHv pfnHandlerR3=%RHv pfnHandlerRC=%RGv pszDesc=%s\n",
     287         enmType, GCPtr, GCPtrLast, pfnInvalidateR3, pfnHandlerR3, pfnHandlerRC, pszDesc));
    286288
    287289    /*
     
    292294        case PGMVIRTHANDLERTYPE_ALL:
    293295        case PGMVIRTHANDLERTYPE_WRITE:
    294             if (!pfnHandlerHC)
     296            if (!pfnHandlerR3)
    295297            {
    296298                AssertMsgFailed(("No HC handler specified!!\n"));
     
    300302
    301303        case PGMVIRTHANDLERTYPE_HYPERVISOR:
    302             if (pfnHandlerHC)
     304            if (pfnHandlerR3)
    303305            {
    304                 AssertMsgFailed(("HC handler specified for hypervisor range!?!\n"));
     306                AssertMsgFailed(("R3 handler specified for hypervisor range!?!\n"));
    305307                return VERR_INVALID_PARAMETER;
    306308            }
     
    315317        return VERR_INVALID_PARAMETER;
    316318    }
    317     if (!pfnHandlerGC)
    318     {
    319         AssertMsgFailed(("pfnHandlerGC is missing\n"));
     319    if (!pfnHandlerRC)
     320    {
     321        AssertMsgFailed(("pfnHandlerRC is missing\n"));
    320322        return VERR_INVALID_PARAMETER;
    321323    }
     
    334336
    335337    pNew->enmType       = enmType;
    336     pNew->pfnInvalidateHC = pfnInvalidateHC;
    337     pNew->pfnHandlerGC  = pfnHandlerGC;
    338     pNew->pfnHandlerHC  = pfnHandlerHC;
     338    pNew->pfnInvalidateR3 = pfnInvalidateR3;
     339    pNew->pfnHandlerRC  = pfnHandlerRC;
     340    pNew->pfnHandlerR3  = pfnHandlerR3;
    339341    pNew->pszDesc       = pszDesc;
    340342    pNew->GCPtr         = GCPtr;
     
    416418 * @param   pVM             VM handle.
    417419 * @param   GCPtr           Start address.
    418  * @param   pfnInvalidateHC The HC invalidate callback (can be 0)
     420 * @param   pfnInvalidateR3 The R3 invalidate callback (can be 0)
    419421 * @remarks Doesn't work with the hypervisor access handler type.
    420422 */
    421 VMMDECL(int) PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, PFNPGMHCVIRTINVALIDATE pfnInvalidateHC)
     423VMMDECL(int) PGMHandlerVirtualChangeInvalidateCallback(PVM pVM, RTGCPTR GCPtr, PFNPGMR3VIRTINVALIDATE pfnInvalidateR3)
    422424{
    423425    pgmLock(pVM);
     
    425427    if (pCur)
    426428    {
    427         pCur->pfnInvalidateHC = pfnInvalidateHC;
     429        pCur->pfnInvalidateR3 = pfnInvalidateR3;
    428430        pgmUnlock(pVM);
    429431        return VINF_SUCCESS;
     
    616618        default:                            pszType = "????"; break;
    617619    }
    618     pHlp->pfnPrintf(pHlp, "%VGv - %VGv  %VHv  %VRv  %s  %s\n",
    619         pCur->GCPtr, pCur->GCPtrLast, pCur->pfnHandlerHC, pCur->pfnHandlerGC, pszType, pCur->pszDesc);
     620    pHlp->pfnPrintf(pHlp, "%RGv - %RGv  %RHv  %RRv  %s  %s\n",
     621        pCur->GCPtr, pCur->GCPtrLast, pCur->pfnHandlerR3, pCur->pfnHandlerRC, pszType, pCur->pszDesc);
    620622#ifdef VBOX_WITH_STATISTICS
    621623    if (pArgs->fStats)
  • trunk/src/VBox/VMM/PGMInternal.h

    r13042 r13045  
    444444    /** Core node for the tree based on virtual ranges. */
    445445    AVLROGCPTRNODECORE                  Core;
    446     /** Number of cache pages. */
     446#if GC_ARCH_BITS == 32
     447    /** Alignment padding. */
    447448    uint32_t                            u32Padding;
     449#endif
    448450    /** Access type. */
    449451    PGMVIRTHANDLERTYPE                  enmType;
    450452    /** Number of cache pages. */
    451453    uint32_t                            cPages;
    452 #if GC_ARCH_BITS == 64
    453     uint32_t                            padding0;
    454 #endif
     454
    455455/** @todo The next two members are redundant. It adds some readability though. */
    456456    /** Start of the range. */
     
    458458    /** End of the range (exclusive). */
    459459    RTGCPTR                             GCPtrLast;
     460
    460461    /** Size of the range (in bytes). */
    461462    RTGCUINTPTR                         cb;
    462     /** Pointer to the GC callback function. */
    463     RCPTRTYPE(PFNPGMGCVIRTHANDLER)      pfnHandlerGC;
     463    /** Pointer to the RC callback function. */
     464    RCPTRTYPE(PFNPGMRCVIRTHANDLER)      pfnHandlerRC;
    464465#if GC_ARCH_BITS == 64
    465466    RTRCPTR                             padding1;
    466467#endif
    467     /** Pointer to the HC callback function for invalidation. */
    468     R3PTRTYPE(PFNPGMHCVIRTINVALIDATE)   pfnInvalidateHC;
    469     /** Pointer to the HC callback function. */
    470     R3PTRTYPE(PFNPGMHCVIRTHANDLER)      pfnHandlerHC;
     468    /** Pointer to the R3 callback function for invalidation. */
     469    R3PTRTYPE(PFNPGMR3VIRTINVALIDATE)   pfnInvalidateR3;
     470    /** Pointer to the R3 callback function. */
     471    R3PTRTYPE(PFNPGMR3VIRTHANDLER)      pfnHandlerR3;
    471472    /** Description / Name. For easing debugging. */
    472473    R3PTRTYPE(const char *)             pszDesc;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r13042 r13045  
    280280#  ifdef IN_GC
    281281                    STAM_PROFILE_START(&pCur->Stat, h);
    282                     rc = CTXSUFF(pCur->pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
     282                    rc = pCur->CTX_SUFF(pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
    283283                    STAM_PROFILE_STOP(&pCur->Stat, h);
    284284#  else
     
    460460#  ifdef IN_GC
    461461                                STAM_PROFILE_START(&pCur->Stat, h);
    462                                 rc = CTXSUFF(pCur->pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
     462                                rc = pCur->CTX_SUFF(pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
    463463                                STAM_PROFILE_STOP(&pCur->Stat, h);
    464464#  else
     
    489489                                Assert(off < pCur->cb);
    490490                                STAM_PROFILE_START(&pCur->Stat, h);
    491                                 rc = CTXSUFF(pCur->pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, off);
     491                                rc = pCur->CTX_SUFF(pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, off);
    492492                                STAM_PROFILE_STOP(&pCur->Stat, h);
    493493#  else
     
    567567#  ifdef IN_GC
    568568                            STAM_PROFILE_START(&pCur->Stat, h);
    569                             rc = CTXSUFF(pCur->pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
     569                            rc = pCur->CTX_SUFF(pfnHandler)(pVM, uErr, pRegFrame, pvFault, pCur->GCPtr, (RTGCUINTPTR)pvFault - (RTGCUINTPTR)pCur->GCPtr);
    570570                            STAM_PROFILE_STOP(&pCur->Stat, h);
    571571#  else
  • trunk/src/VBox/VMM/VMMAll/PGMAllPhys.cpp

    r13040 r13045  
    12501250                    unsigned iPage;
    12511251                    int rc2 = pgmHandlerVirtualFindByPhysAddr(pVM, GCPhys, &pNode, &iPage);
    1252                     if (VBOX_SUCCESS(rc2) && pNode->pfnHandlerHC)
     1252                    if (VBOX_SUCCESS(rc2) && pNode->pfnHandlerR3)
    12531253                    {
    12541254                        size_t cbRange = pNode->Core.KeyLast - GCPhys + 1;
     
    12621262                        void *pvSrc = PGMRAMRANGE_GETHCPTR(pRam, off)
    12631263
    1264                         /** @note Dangerous assumption that HC handlers don't do anything that really requires an EMT lock! */
    1265                         rc = pNode->pfnHandlerHC(pVM, (RTGCPTR)GCPtr, pvSrc, pvBuf, cb, PGMACCESSTYPE_READ, 0);
     1264                        /* Note: Dangerous assumption that HC handlers don't do anything that really requires an EMT lock! */
     1265                        rc = pNode->pfnHandlerR3(pVM, (RTGCPTR)GCPtr, pvSrc, pvBuf, cb, PGMACCESSTYPE_READ, 0);
    12661266                    }
    12671267#endif /* IN_RING3 */
     
    14911491                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
    14921492
    1493                             /** @note Dangerous assumption that HC handlers don't do anything that really requires an EMT lock! */
     1493                            /* Note! Dangerous assumption that R3 handlers don't do anything that really requires an EMT lock! */
    14941494                            rc = pPhysNode->pfnHandlerR3(pVM, GCPhys, pvDst, (void *)pvBuf, cb, PGMACCESSTYPE_WRITE, pPhysNode->pvUserR3);
    14951495                        }
     
    14991499                        unsigned iPage;
    15001500                        int rc2 = pgmHandlerVirtualFindByPhysAddr(pVM, GCPhys, &pVirtNode, &iPage);
    1501                         if (VBOX_SUCCESS(rc2) && pVirtNode->pfnHandlerHC)
     1501                        if (VBOX_SUCCESS(rc2) && pVirtNode->pfnHandlerR3)
    15021502                        {
    15031503                            size_t cbRange = pVirtNode->Core.KeyLast - GCPhys + 1;
     
    15111511                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
    15121512
    1513                             /** @note Dangerous assumption that HC handlers don't do anything that really requires an EMT lock! */
    1514                             rc2 = pVirtNode->pfnHandlerHC(pVM, (RTGCPTR)GCPtr, pvDst, (void *)pvBuf, cb, PGMACCESSTYPE_WRITE, 0);
     1513                            /* Note! Dangerous assumption that R3 handlers don't do anything that really requires an EMT lock! */
     1514                            rc2 = pVirtNode->pfnHandlerR3(pVM, (RTGCPTR)GCPtr, pvDst, (void *)pvBuf, cb, PGMACCESSTYPE_WRITE, 0);
    15151515                            if (    (   rc2 != VINF_PGM_HANDLER_DO_DEFAULT
    15161516                                     && rc == VINF_PGM_HANDLER_DO_DEFAULT)
     
    15491549                        unsigned iPage;
    15501550                        int rc2 = pgmHandlerVirtualFindByPhysAddr(pVM, GCPhys, &pNode, &iPage);
    1551                         if (VBOX_SUCCESS(rc2) && pNode->pfnHandlerHC)
     1551                        if (VBOX_SUCCESS(rc2) && pNode->pfnHandlerR3)
    15521552                        {
    15531553                            size_t cbRange = pNode->Core.KeyLast - GCPhys + 1;
     
    15611561                            void *pvDst = PGMRAMRANGE_GETHCPTR(pRam, off)
    15621562
    1563                             /** @tode Dangerous assumption that HC handlers don't do anything that really requires an EMT lock! */
    1564                             rc = pNode->pfnHandlerHC(pVM, (RTGCPTR)GCPtr, pvDst, (void *)pvBuf, cb, PGMACCESSTYPE_WRITE, 0);
     1563                            /* Note! Dangerous assumption that R3 handlers don't do anything that really requires an EMT lock! */
     1564                            rc = pNode->pfnHandlerR3(pVM, (RTGCPTR)GCPtr, pvDst, (void *)pvBuf, cb, PGMACCESSTYPE_WRITE, 0);
    15651565                        }
    15661566#endif /* IN_RING3 */
  • trunk/src/VBox/VMM/testcase/tstVMStructGC.cpp

    r13042 r13045  
    558558    GEN_CHECK_OFF(PGMVIRTHANDLER, GCPtrLast);
    559559    GEN_CHECK_OFF(PGMVIRTHANDLER, cb);
    560     GEN_CHECK_OFF(PGMVIRTHANDLER, pfnHandlerHC);
    561     GEN_CHECK_OFF(PGMVIRTHANDLER, pfnHandlerGC);
     560    GEN_CHECK_OFF(PGMVIRTHANDLER, pfnHandlerR3);
     561    GEN_CHECK_OFF(PGMVIRTHANDLER, pfnHandlerRC);
    562562    GEN_CHECK_OFF(PGMVIRTHANDLER, pszDesc);
    563563    GEN_CHECK_OFF(PGMVIRTHANDLER, cPages);
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