VirtualBox

Changeset 12855 in vbox for trunk/src/VBox/VMM/PATM


Ignore:
Timestamp:
Oct 1, 2008 9:37:46 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37231
Message:

Mark referenced patches, so they can't be removed.

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

Legend:

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

    r12835 r12855  
    10481048            /* Special case: call function replacement patch from this patch block.
    10491049             */
    1050             if (PATMQueryFunctionPatch(pVM, pRec->pTargetGC) == 0)
     1050            PPATMPATCHREC pFunctionRec = PATMQueryFunctionPatch(pVM, pRec->pTargetGC);
     1051            if (!pFunctionRec)
    10511052            {
    10521053                int rc;
     
    10801081                }
    10811082            }
     1083            else
     1084            {
     1085                Log(("Patch block %VRv called as function\n", pFunctionRec->patch.pPrivInstrGC));
     1086                pFunctionRec->patch.flags |= PATMFL_CODE_REFERENCED;
     1087            }
     1088
    10821089            pBranchTargetGC = PATMR3QueryPatchGCPtr(pVM, pRec->pTargetGC);
    10831090        }
     
    40794086                }
    40804087            }
    4081             PATMR3RemovePatch(pVM, pInstrGC);
     4088            rc = PATMR3RemovePatch(pVM, pInstrGC);
     4089            if (VBOX_FAILURE(rc))
     4090                return VERR_PATCHING_REFUSED;
    40824091        }
    40834092        else
     
    47274736                            Log(("PATMR3PatchWrite: overwriting jump to patch code -> remove patch.\n"));
    47284737                            int rc = PATMR3RemovePatch(pVM, pPatch->pPrivInstrGC);
    4729                             AssertRC(rc);
    4730 
    4731                             /** @note jump back to the start as the pPatchPage has been deleted or changed */
    4732                             goto loop_start;
     4738                            if (rc == VINF_SUCCESS)
     4739                                /** @note jump back to the start as the pPatchPage has been deleted or changed */
     4740                                goto loop_start;
     4741
     4742                            continue;
    47334743                        }
    47344744
     
    52325242                        STAM_COUNTER_INC(&pVM->patm.s.StatOverwritten);
    52335243                        /* Remove it completely */
    5234                         PATMR3RemovePatch(pVM, pInstrGC);
     5244                        rc = PATMR3RemovePatch(pVM, pInstrGC);
     5245                        AssertRC(rc);
    52355246                        return VERR_PATCH_NOT_FOUND;
    52365247                    }
     
    52695280                    Log(("PATMR3EnablePatch: Can't enable a patch who's guest code has changed!!\n"));
    52705281                    STAM_COUNTER_INC(&pVM->patm.s.StatOverwritten);
    5271                     PATMR3RemovePatch(pVM, pInstrGC);
     5282                    rc = PATMR3RemovePatch(pVM, pInstrGC);
     5283                    AssertRC(rc);
    52725284                    return VERR_PATCH_NOT_FOUND;
    52735285                }
     
    53115323
    53125324    /* Strictly forbidden to remove such patches. There can be dependencies!! */
    5313     AssertReturn(fForceRemove || !(pPatch->flags & (PATMFL_DUPLICATE_FUNCTION)), VERR_ACCESS_DENIED);
     5325    if (!fForceRemove && (pPatch->flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_CODE_REFERENCED)))
     5326    {
     5327        Log(("PATMRemovePatch %VRv REFUSED!\n", pPatch->pPrivInstrGC));
     5328        return VERR_ACCESS_DENIED;
     5329    }
     5330    Log(("PATMRemovePatch %VRv\n", pPatch->pPrivInstrGC));
    53145331
    53155332    /** @note NEVER EVER REUSE PATCH MEMORY */
     
    54645481        LogRel(("PATM: patmR3RefreshPatch: succeeded to refresh patch at %VRv \n", pInstrGC));
    54655482        STAM_COUNTER_INC(&pVM->patm.s.StatPatchRefreshSuccess);
     5483
     5484        /* Used by another patch, so don't remove it! */
     5485        pNewPatchRec->patch.flags |= PATMFL_CODE_REFERENCED;
    54665486    }
    54675487
     
    59856005        pPatch = PATM_PATCHREC_FROM_COREOFFSET(pvPatchCoreOffset);
    59866006
     6007        Assert(offset >= pPatch->patch.pPatchBlockOffset && offset < pPatch->patch.pPatchBlockOffset + pPatch->patch.cbPatchBlockSize);
     6008
    59876009        if (pPatch->patch.uState == PATCH_DIRTY)
    59886010        {
    59896011            Log(("PATMR3HandleTrap: trap in dirty patch at %VRv\n", pEip));
    5990             if (pPatch->patch.flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_CALLABLE_AS_FUNCTION))
     6012            if (pPatch->patch.flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_CODE_REFERENCED))
    59916013            {
    59926014                /* Function duplication patches set fPIF to 1 on entry */
     
    59986020        {
    59996021            Log(("PATMR3HandleTrap: trap in disabled patch at %VRv\n", pEip));
    6000             if (pPatch->patch.flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_CALLABLE_AS_FUNCTION))
     6022            if (pPatch->patch.flags & (PATMFL_DUPLICATE_FUNCTION|PATMFL_CODE_REFERENCED))
    60016023            {
    60026024                /* Function duplication patches set fPIF to 1 on entry */
  • trunk/src/VBox/VMM/PATM/PATMInternal.h

    r12532 r12855  
    7979#define PATMFL_INT3_REPLACEMENT_BLOCK       RT_BIT_64(32) /** int 3 replacement block */
    8080#define PATMFL_EXTERNAL_JUMP_INSIDE         RT_BIT_64(33) /** A trampoline patch was created that jumps to an instruction in the patch block */
     81#define PATMFL_CODE_REFERENCED              RT_BIT_64(34) /** patch block referenced (called, jumped to) by another patch. */
    8182
    8283#define SIZEOF_NEARJUMP8                   2 //opcode byte + 1 byte relative offset
  • trunk/src/VBox/VMM/PATM/VMMGC/PATMGC.cpp

    r9659 r12855  
    201201                        if (rc == VINF_SUCCESS)
    202202                        {
     203                            Log(("Patch block %VRv called as function\n", pRec->patch.pPrivInstrGC));
     204                            pRec->patch.flags |= PATMFL_CODE_REFERENCED;
     205
    203206                            pRegFrame->eip += PATM_ILLEGAL_INSTR_SIZE;
    204207                            pRegFrame->eax = pRelAddr;
     
    218221                else
    219222                {
    220 #if 0
    221                     if (pRegFrame->edx == 0x806eca98)
    222                     {
    223                         pRegFrame->eip += PATM_ILLEGAL_INSTR_SIZE;
    224                         pRegFrame->eax = 0;     /* make it fault */
    225                         STAM_COUNTER_INC(&pVM->patm.s.StatFunctionNotFound);
    226                         return VINF_SUCCESS;
    227                     }
    228 #endif
    229223                    STAM_COUNTER_INC(&pVM->patm.s.StatFunctionNotFound);
    230224                    return VINF_PATM_DUPLICATE_FUNCTION;
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