VirtualBox

Changeset 93 in vbox


Ignore:
Timestamp:
Jan 17, 2007 12:57:07 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
17539
Message:

Patch2GuestAddrTree / RECPATCHTOGUEST: changed from PV to U32 AVL tree. (first in a series of 64-bit fixes)

Location:
trunk/src/VBox/VMM/PATM
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PATM/PATM.cpp

    r77 r93  
    11251125    PRECPATCHTOGUEST pPatchToGuestRec;
    11261126    PRECGUESTTOPATCH pGuestToPatchRec;
    1127     RTGCUINTPTR PatchOffset = pPatchInstrHC - pVM->patm.s.pPatchMemHC;  /* Offset in memory reserved for PATM. */
     1127    uint32_t PatchOffset = pPatchInstrHC - pVM->patm.s.pPatchMemHC;  /* Offset in memory reserved for PATM. */
    11281128
    11291129    if (enmType == PATM_LOOKUP_PATCH2GUEST)
    11301130    {
    1131         pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGet(&pPatch->Patch2GuestAddrTree, (AVLPVKEY)PatchOffset);
    1132         if (pPatchToGuestRec && pPatchToGuestRec->Core.Key == (AVLPVKEY)PatchOffset)
     1131        pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32Get(&pPatch->Patch2GuestAddrTree, PatchOffset);
     1132        if (pPatchToGuestRec && pPatchToGuestRec->Core.Key == PatchOffset)
    11331133            return; /* already there */
    11341134
     
    11381138    else
    11391139    {
    1140         pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGet(&pPatch->Patch2GuestAddrTree, (AVLPVKEY)PatchOffset);
     1140        pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32Get(&pPatch->Patch2GuestAddrTree, PatchOffset);
    11411141        Assert(!pPatchToGuestRec);
    11421142    }
     
    11451145    pPatchToGuestRec = (PRECPATCHTOGUEST)MMR3HeapAllocZ(pVM, MM_TAG_PATM_PATCH, sizeof(RECPATCHTOGUEST) + sizeof(RECGUESTTOPATCH));
    11461146    Assert(pPatchToGuestRec);
    1147     pPatchToGuestRec->Core.Key    = (AVLPVKEY)PatchOffset;
     1147    pPatchToGuestRec->Core.Key    = PatchOffset;
    11481148    pPatchToGuestRec->pOrgInstrGC = pInstrGC;
    11491149    pPatchToGuestRec->enmType     = enmType;
    11501150    pPatchToGuestRec->fDirty      = fDirty;
    11511151
    1152     ret = RTAvlPVInsert(&pPatch->Patch2GuestAddrTree, &pPatchToGuestRec->Core);
     1152    ret = RTAvlU32Insert(&pPatch->Patch2GuestAddrTree, &pPatchToGuestRec->Core);
    11531153    Assert(ret);
    11541154
     
    11561156    if (enmType == PATM_LOOKUP_BOTHDIR)
    11571157    {
    1158         pGuestToPatchRec = (PRECGUESTTOPATCH)RTAvlPVGet(&pPatch->Guest2PatchAddrTree, (AVLPVKEY)PatchOffset);
     1158        pGuestToPatchRec = (PRECGUESTTOPATCH)RTAvlPVGet(&pPatch->Guest2PatchAddrTree, (AVLPVKEY)PatchOffset); /** @todo bird: this doesn't look right. check it out later. */
    11591159        if (!pGuestToPatchRec)
    11601160        {
     
    11811181void patmr3RemoveP2GLookupRecord(PVM pVM, PPATCHINFO pPatch, RTGCPTR pPatchInstrGC)
    11821182{
    1183     PAVLPVNODECORE   pNode;
     1183    PAVLU32NODECORE  pNode;
     1184    PAVLPVNODECORE   pNode2;
    11841185    PRECPATCHTOGUEST pPatchToGuestRec;
    1185     RTGCUINTPTR      PatchOffset = pPatchInstrGC - pVM->patm.s.pPatchMemGC;  /* Offset in memory reserved for PATM. */
    1186 
    1187     pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGet(&pPatch->Patch2GuestAddrTree, (AVLPVKEY)PatchOffset);
     1186    uint32_t         PatchOffset = pPatchInstrGC - pVM->patm.s.pPatchMemGC;  /* Offset in memory reserved for PATM. */
     1187
     1188    pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32Get(&pPatch->Patch2GuestAddrTree, PatchOffset);
    11881189    Assert(pPatchToGuestRec);
    11891190    if (pPatchToGuestRec)
     
    11941195
    11951196            Assert(pGuestToPatchRec->Core.Key);
    1196             pNode = RTAvlPVRemove(&pPatch->Guest2PatchAddrTree, pGuestToPatchRec->Core.Key);
    1197             Assert(pNode);
    1198         }
    1199         pNode = RTAvlPVRemove(&pPatch->Patch2GuestAddrTree, pPatchToGuestRec->Core.Key);
     1197            pNode2 = RTAvlPVRemove(&pPatch->Guest2PatchAddrTree, pGuestToPatchRec->Core.Key);
     1198            Assert(pNode2);
     1199        }
     1200        pNode = RTAvlU32Remove(&pPatch->Patch2GuestAddrTree, pPatchToGuestRec->Core.Key);
    12001201        Assert(pNode);
    12011202
     
    12061207
    12071208
    1208 /* Empty the specified tree (PV tree, MMR3 heap)
     1209/**
     1210 * RTAvlPVDestroy callback.
     1211 */
     1212static DECLCALLBACK(int) patmEmptyTreePVCallback(PAVLPVNODECORE pNode, void *)
     1213{
     1214    MMR3HeapFree(pNode);
     1215    return 0;
     1216}
     1217
     1218/**
     1219 * Empty the specified tree (PV tree, MMR3 heap)
    12091220 *
    12101221 * @param   pVM             The VM to operate on.
     
    12131224void patmEmptyTree(PVM pVM, PAVLPVNODECORE *ppTree)
    12141225{
    1215     PAVLPVNODECORE pRec;
    1216 
    1217     if (*ppTree == 0)
    1218         return;
    1219 
    1220     while (true)
    1221     {
    1222         pRec = RTAvlPVRemoveBestFit(ppTree, 0, true);
    1223         if (pRec)
    1224         {
    1225             MMR3HeapFree(pRec);
    1226         }
    1227         else
    1228             break;
    1229     }
    1230     Assert(*ppTree == 0);
     1226    RTAvlPVDestroy(ppTree, patmEmptyTreePVCallback, NULL);
     1227}
     1228
     1229
     1230/**
     1231 * RTAvlU32Destroy callback.
     1232 */
     1233static DECLCALLBACK(int) patmEmptyTreeU32Callback(PAVLU32NODECORE pNode, void *)
     1234{
     1235    MMR3HeapFree(pNode);
     1236    return 0;
     1237}
     1238
     1239/**
     1240 * Empty the specified tree (U32 tree, MMR3 heap)
     1241 *
     1242 * @param   pVM             The VM to operate on.
     1243 * @param   ppTree          Tree to empty
     1244 */
     1245void patmEmptyTreeU32(PVM pVM, PPAVLU32NODECORE ppTree)
     1246{
     1247    RTAvlU32Destroy(ppTree, patmEmptyTreeU32Callback, NULL);
    12311248}
    12321249
     
    42434260        if (pPatchRec && pPatchRec->patch.nrPatch2GuestRecs)
    42444261        {
    4245             patmEmptyTree(pVM, &pPatchRec->patch.Patch2GuestAddrTree);
     4262            patmEmptyTreeU32(pVM, &pPatchRec->patch.Patch2GuestAddrTree);
    42464263            pPatchRec->patch.nrPatch2GuestRecs = 0;
    42474264        }
     
    46444661                        if (pPatchInstrGC)
    46454662                        {
    4646                             RTGCUINTPTR PatchOffset = pPatchInstrGC - pVM->patm.s.pPatchMemGC;  /* Offset in memory reserved for PATM. */
     4663                            uint32_t PatchOffset = pPatchInstrGC - pVM->patm.s.pPatchMemGC;  /* Offset in memory reserved for PATM. */
    46474664
    46484665                            fValidPatchWrite = true;
    46494666
    4650                             PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGet(&pPatch->Patch2GuestAddrTree, (AVLPVKEY)PatchOffset);
     4667                            PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32Get(&pPatch->Patch2GuestAddrTree, PatchOffset);
    46514668                            Assert(pPatchToGuestRec);
    46524669                            if (pPatchToGuestRec && !pPatchToGuestRec->fDirty)
     
    52345251
    52355252    /** @note no need to free Guest2PatchAddrTree as those records share memory with Patch2GuestAddrTree records. */
    5236     patmEmptyTree(pVM, &pPatch->Patch2GuestAddrTree);
     5253    patmEmptyTreeU32(pVM, &pPatch->Patch2GuestAddrTree);
    52375254    pPatch->nrPatch2GuestRecs = 0;
    52385255    Assert(pPatch->Patch2GuestAddrTree == 0);
     
    53995416    Assert(pPatch->Patch2GuestAddrTree);
    54005417    /* Get the closest record from below. */
    5401     PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGetBestFit(&pPatch->Patch2GuestAddrTree, (AVLPVKEY)(pPatchGC - pVM->patm.s.pPatchMemGC), false);
     5418    PRECPATCHTOGUEST pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32GetBestFit(&pPatch->Patch2GuestAddrTree, pPatchGC - pVM->patm.s.pPatchMemGC, false);
    54025419    if (pPatchToGuestRec)
    54035420        return pPatchToGuestRec->pOrgInstrGC;
     
    56015618
    56025619        /* Let's see if there's another dirty instruction right after. */
    5603         pRec = (PRECPATCHTOGUEST)RTAvlPVGetBestFit(&pPatch->patch.Patch2GuestAddrTree, (AVLPVKEY)(pCurPatchInstrGC - pVM->patm.s.pPatchMemGC), true);
     5620        pRec = (PRECPATCHTOGUEST)RTAvlU32GetBestFit(&pPatch->patch.Patch2GuestAddrTree, pCurPatchInstrGC - pVM->patm.s.pPatchMemGC, true);
    56045621        if (!pRec || !pRec->fDirty)
    56055622            break;  /* no more dirty instructions */
     
    57535770        }
    57545771
    5755         pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlPVGetBestFit(&pPatch->patch.Patch2GuestAddrTree, (AVLPVKEY)offset, false);
     5772        pPatchToGuestRec = (PRECPATCHTOGUEST)RTAvlU32GetBestFit(&pPatch->patch.Patch2GuestAddrTree, offset, false);
    57565773        AssertReleaseMsg(pPatchToGuestRec, ("PATMR3HandleTrap: Unable to find corresponding guest address for %VGv (offset %x)\n", pEip, offset));
    57575774
     
    58215838    if (pPatchToGuestRec->fDirty)
    58225839    {
    5823         Assert(pPatchToGuestRec->Core.Key == (AVLPVKEY)offset);
     5840        Assert(pPatchToGuestRec->Core.Key == offset);
    58245841        Assert(pVM->patm.s.pGCStateHC->fPIF == 1);
    58255842
  • trunk/src/VBox/VMM/PATM/PATMInternal.h

    r23 r93  
    149149typedef struct
    150150{
    151     /** The key is a GC virtual address. */
     151    /** The key is a pointer to a JUMPREC structure. */
    152152    AVLPVNODECORE   Core;
    153153
     
    173173{
    174174    /** The key is an offset inside the patch memory block. */
    175     AVLPVNODECORE    Core;
     175    AVLU32NODECORE   Core;
    176176
    177177    RTGCPTR          pOrgInstrGC;
     
    189189    AVLPVNODECORE   Core;
    190190
    191     RTGCUINTPTR     PatchOffset;
     191    /** Patch offset (relative to PATM::pPatchMemGC / PATM::pPatchMemHC). */
     192    uint32_t        PatchOffset;
    192193} RECGUESTTOPATCH, *PRECGUESTTOPATCH;
    193194
     
    257258     * instruction in the patch block.
    258259     */
    259     HCPTRTYPE(PAVLPVNODECORE) Patch2GuestAddrTree;
     260    HCPTRTYPE(PAVLU32NODECORE) Patch2GuestAddrTree;
    260261    HCPTRTYPE(PAVLPVNODECORE) Guest2PatchAddrTree;
    261262    uint32_t                  nrPatch2GuestRecs;
     
    609610
    610611
    611 /* Empty the specified tree (PV tree, MMR3 heap)
     612/**
     613 * Empty the specified tree (PV tree, MMR3 heap)
    612614 *
    613615 * @param   pVM             The VM to operate on.
    614616 * @param   ppTree          Tree to empty
    615617 */
    616 void patmEmptyTree(PVM pVM, PAVLPVNODECORE *ppTree);
     618void patmEmptyTree(PVM pVM, PPAVLPVNODECORE ppTree);
     619
     620
     621/**
     622 * Empty the specified tree (U32 tree, MMR3 heap)
     623 *
     624 * @param   pVM             The VM to operate on.
     625 * @param   ppTree          Tree to empty
     626 */
     627void patmEmptyTreeU32(PVM pVM, PPAVLU32NODECORE ppTree);
    617628
    618629
  • trunk/src/VBox/VMM/PATM/PATMSSM.cpp

    r23 r93  
    180180#ifdef VBOX_STRICT
    181181    int nrLookupRecords = 0;
    182     RTAvlPVDoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmCountLeaf, &nrLookupRecords);
     182    RTAvlU32DoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmCountLeaf, &nrLookupRecords);
    183183    Assert(nrLookupRecords == pPatch->patch.nrPatch2GuestRecs);
    184184#endif
    185185
    186     RTAvlPVDoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmSaveP2GLookupRecords, pVM);
     186    RTAvlU32DoWithAll(&pPatch->patch.Patch2GuestAddrTree, true, patmSaveP2GLookupRecords, pVM);
    187187    return VINF_SUCCESS;
    188188}
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