VirtualBox

Changeset 208 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jan 21, 2007 2:23:25 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
17693
Message:

Changed guest specific patch for OpenBSD. 3.7, 3.8, 3.9 and 4.0 now work.

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

Legend:

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

    r27 r208  
    17741774        RTHCPHYS GCPhys;
    17751775        rc = PGMShwGetPage(pVM, pPageAddrGC, &fPageShw, &GCPhys);
    1776         AssertMsg(     (rc == VERR_PAGE_NOT_PRESENT || rc == VERR_PAGE_TABLE_NOT_PRESENT)
    1777                 ||  !(fPageShw & X86_PTE_RW)
    1778                 ||   (pPageRec->page.GCPhys == 0), ("Shadow page flags for %VGv (%VHp) aren't readonly (%VX64)!!\n", pPageAddrGC, GCPhys, fPageShw));
     1776//        AssertMsg(     (rc == VERR_PAGE_NOT_PRESENT || rc == VERR_PAGE_TABLE_NOT_PRESENT)
     1777//                ||  !(fPageShw & X86_PTE_RW)
     1778//                ||   (pPageRec->page.GCPhys == 0), ("Shadow page flags for %VGv (%VHp) aren't readonly (%VX64)!!\n", pPageAddrGC, GCPhys, fPageShw));
    17791779    }
    17801780#endif
     
    22662266            else
    22672267            {
    2268                 /* OpenBSD guest specific patch test */
    2269                 rc = PATMR3InstallPatch(pVM, pHandler - 4, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC);
    2270                 if (VBOX_SUCCESS(rc))
     2268                if (iGate >= 0x20)
    22712269                {
    2272                     Log(("Installed OpenBSD interrupt handler prefix instruction (push cs) patch\n"));
    2273                     if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32)
     2270                    /* OpenBSD guest specific patch test (3.7 & 3.8) */
     2271                    rc = PATMR3InstallPatch(pVM, pHandler - 3, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC);
     2272                    if (VBOX_FAILURE(rc))
     2273                        /* OpenBSD guest specific patch test (3.9 & 4.0) */
     2274                        rc = PATMR3InstallPatch(pVM, pHandler - 0x2B, PATMFL_CODE32 | PATMFL_GUEST_SPECIFIC);
     2275                    if (VBOX_SUCCESS(rc))
    22742276                    {
    2275                         /* This is actually fatal!!!! */
    2276                         Log(("Warning: patch jump overwrites trap handler entrypoint!!!!!!!!!!!!!\n"));
     2277                        Log(("Installed OpenBSD interrupt handler prefix instruction (push cs) patch\n"));
     2278                        if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32)
     2279                        {
     2280                           /* This is actually fatal!!!! */
     2281                            Log(("Warning: patch jump overwrites trap handler entrypoint!!!!!!!!!!!!!\n"));
     2282                        }
    22772283                    }
    22782284                }
     2285
     2286                /* Trap gates and certain interrupt gates. */
     2287                uint32_t fPatchFlags = PATMFL_CODE32 | PATMFL_IDTHANDLER;
     2288
     2289                if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32)
     2290                    fPatchFlags |= PATMFL_TRAPHANDLER;
    22792291                else
    2280                 /* Trap gates and certain interrupt gates. */
    2281 //                if (   pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32
    2282 //                    || iGate == 0x2E || iGate == 0xE || iGate == 0x80 || iGate == 0xEF)
     2292                    fPatchFlags |= PATMFL_INTHANDLER;
     2293
     2294                switch (iGate) {
     2295                case 8:
     2296                case 10:
     2297                case 11:
     2298                case 12:
     2299                case 13:
     2300                case 14:
     2301                case 17:
     2302                    fPatchFlags |= PATMFL_TRAPHANDLER_WITH_ERRORCODE;
     2303                    break;
     2304                default:
     2305                    /* No error code. */
     2306                    break;
     2307                }
     2308
     2309                Log(("Installing %s gate handler for 0x%X at %VGv\n", (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) ? "trap" : "intr", iGate, pHandler));
     2310
     2311                rc = PATMR3InstallPatch(pVM, pHandler, fPatchFlags);
     2312                if (VBOX_SUCCESS(rc) || rc == VERR_PATM_ALREADY_PATCHED)
    22832313                {
    2284                     uint32_t fPatchFlags = PATMFL_CODE32 | PATMFL_IDTHANDLER;
    2285 
    2286                     if (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32)
    2287                         fPatchFlags |= PATMFL_TRAPHANDLER;
     2314                    RTGCPTR pNewHandlerGC;
     2315
     2316                    Log(("Gate handler 0x%X is SAFE!\n", iGate));
     2317
     2318                    pNewHandlerGC = PATMR3QueryPatchGCPtr(pVM, pHandler);
     2319                    if (pNewHandlerGC)
     2320                    {
     2321                        rc = TRPMR3SetGuestTrapHandler(pVM, iGate, pNewHandlerGC);
     2322                        if (VBOX_FAILURE(rc))
     2323                            Log(("TRPMR3SetGuestTrapHandler %d failed with %Vrc\n", iGate, rc));
     2324                    }
    22882325                    else
    2289                         fPatchFlags |= PATMFL_INTHANDLER;
    2290 
    2291                     switch (iGate) {
    2292                     case 8:
    2293                     case 10:
    2294                     case 11:
    2295                     case 12:
    2296                     case 13:
    2297                     case 14:
    2298                     case 17:
    2299                         fPatchFlags |= PATMFL_TRAPHANDLER_WITH_ERRORCODE;
    2300                         break;
    2301                     default:
    2302                         /* No error code. */
    2303                         break;
    2304                     }
    2305 
    2306                     Log(("Installing %s gate handler for 0x%X at %VGv\n", (pGuestIdte->Gen.u5Type2 == VBOX_IDTE_TYPE2_TRAP_32) ? "trap" : "intr", iGate, pHandler));
    2307 
    2308                     rc = PATMR3InstallPatch(pVM, pHandler, fPatchFlags);
    2309                     if (VBOX_SUCCESS(rc) || rc == VERR_PATM_ALREADY_PATCHED)
    2310                     {
    2311                         RTGCPTR pNewHandlerGC;
    2312 
    2313                         Log(("Gate handler 0x%X is SAFE!\n", iGate));
    2314 
    2315                         pNewHandlerGC = PATMR3QueryPatchGCPtr(pVM, pHandler);
    2316                         if (pNewHandlerGC)
    2317                         {
    2318                             rc = TRPMR3SetGuestTrapHandler(pVM, iGate, pNewHandlerGC);
    2319                             if (VBOX_FAILURE(rc))
    2320                                 Log(("TRPMR3SetGuestTrapHandler %d failed with %Vrc\n", iGate, rc));
    2321                         }
    2322                         else
    2323                             Assert(0);
    2324                     }
     2326                        Assert(0);
    23252327                }
    23262328            }
  • trunk/src/VBox/VMM/PATM/PATM.cpp

    r103 r208  
    41734173        {
    41744174        case OP_SYSENTER:
    4175         case OP_PUSHF:
     4175        case OP_PUSH:
    41764176            rc = PATMInstallGuestSpecificPatch(pVM, &cpu, pInstrGC, pInstrHC, pPatchRec);
    41774177            if (rc == VINF_SUCCESS)
  • trunk/src/VBox/VMM/PATM/PATMGuest.cpp

    r23 r208  
    7070
    7171/*
    72  * D0101B6C:  pushf                         [9C]
     72 * OpenBSD 3.7 & 3.8:
     73 *
    7374 * D0101B6D:  push CS                       [0E]
    7475 * D0101B6E:  push ESI                      [56]
    7576 * D0101B6F:  cli                           [FA]
    7677 */
    77 static uint8_t uFnOpenBSDHandlerPrefix[4] = { 0x9C, 0x0E, 0x56, 0xFA };
     78static uint8_t uFnOpenBSDHandlerPrefix1[3] = { 0x0E, 0x56, 0xFA };
     79/*
     80 * OpenBSD 3.9 & 4.0
     81 *
     82 * D0101BD1:  push CS                       [0E]
     83 * D0101BD2:  push ESI                      [56]
     84 * D0101BD3:  push 0x00                     [6A 00]
     85 * D0101BD4:  push 0x03                     [6A 03]
     86 */
     87static uint8_t uFnOpenBSDHandlerPrefix2[6] = { 0x0E, 0x56, 0x6A, 0x00, 0x6A, 0x03 };
    7888
    7989
     
    175185    int       rc;
    176186
    177     Assert(sizeof(uTemp) > sizeof(uFnOpenBSDHandlerPrefix));
     187    Assert(sizeof(uTemp) > RT_MAX(sizeof(uFnOpenBSDHandlerPrefix1), sizeof(uFnOpenBSDHandlerPrefix2)));
    178188
    179189    /* Guest OS specific patch; check heuristics first */
    180190
    181     rc = PGMPhysReadGCPtr(pVM, uTemp, pInstrGC, sizeof(uFnOpenBSDHandlerPrefix));
    182     if (VBOX_FAILURE(rc) || memcmp(uFnOpenBSDHandlerPrefix, uTemp, sizeof(uFnOpenBSDHandlerPrefix)))
    183     {
    184         return VERR_PATCHING_REFUSED;
    185     }
    186     /* Found it; patch the pushf block (including push cs) */
     191    rc = PGMPhysReadGCPtr(pVM, uTemp, pInstrGC, RT_MAX(sizeof(uFnOpenBSDHandlerPrefix1), sizeof(uFnOpenBSDHandlerPrefix2)));
     192    if (    VBOX_FAILURE(rc)
     193        || (    memcmp(uFnOpenBSDHandlerPrefix1, uTemp, sizeof(uFnOpenBSDHandlerPrefix1))
     194            &&  memcmp(uFnOpenBSDHandlerPrefix2, uTemp, sizeof(uFnOpenBSDHandlerPrefix2))))
     195    {
     196        return VERR_PATCHING_REFUSED;
     197    }
     198    /* Found it; patch the push cs */
    187199    pPatchRec->patch.flags &= ~(PATMFL_GUEST_SPECIFIC);  /* prevent a breakpoint from being triggered */
    188     return PATMR3PatchBlock(pVM, pInstrGC, pInstrHC, pCpu->pCurInstr->opcode, pCpu->opsize, pPatchRec);
     200    return PATMR3PatchInstrInt3(pVM, pInstrGC, pInstrHC, pCpu, &pPatchRec->patch);
    189201}
    190202
     
    218230        return VINF_SUCCESS;
    219231
    220     case OP_PUSHF:
     232    case OP_PUSH:
    221233        /* OpenBSD guest specific patch for the following code block:
    222234         *
     
    226238         *  cli
    227239         */
    228         return PATMPatchOpenBSDHandlerPrefix(pVM, pCpu, pInstrGC, pInstrHC, pPatchRec);
     240        if (pCpu->pCurInstr->param1 == OP_PARM_REG_CS)
     241            return PATMPatchOpenBSDHandlerPrefix(pVM, pCpu, pInstrGC, pInstrHC, pPatchRec);
     242
     243        return VERR_PATCHING_REFUSED;
    229244
    230245    default:
  • trunk/src/VBox/VMM/PATM/PATMInternal.h

    r188 r208  
    730730
    731731/**
     732 * Replace an instruction with a breakpoint (0xCC), that is handled dynamically in the guest context.
     733 *
     734 * @returns VBox status code.
     735 * @param   pVM         The VM to operate on.
     736 * @param   pInstrGC    Guest context point to privileged instruction
     737 * @param   pInstrHC    Host context point to privileged instruction
     738 * @param   pCpu        Disassembly CPU structure ptr
     739 * @param   pPatch      Patch record
     740 *
     741 * @note    returns failure if patching is not allowed or possible
     742 *
     743 */
     744PATMR3DECL(int) PATMR3PatchInstrInt3(PVM pVM, RTGCPTR pInstrGC, HCPTRTYPE(uint8_t *) pInstrHC, DISCPUSTATE *pCpu, PPATCHINFO pPatch);
     745
     746/**
    732747 * Mark patch as dirty
    733748 *
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