VirtualBox

Changeset 46177 in vbox


Ignore:
Timestamp:
May 20, 2013 9:12:43 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
85887
Message:

More symbols in disassembly, for PATM esp.

Location:
trunk/src/VBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp

    r42369 r46177  
    341341#define PUT_NUM_S64(num) PUT_NUM_SIGN(18, "0%016RX64h", num, int64_t, uint64_t)
    342342
     343#define PUT_SYMBOL_TWO(a_rcSym, a_szStart, a_chEnd) \
     344        do { \
     345            if (RT_SUCCESS(a_rcSym)) \
     346            { \
     347                PUT_SZ(a_szStart); \
     348                PUT_PSZ(szSymbol); \
     349                if (off != 0) \
     350                { \
     351                    if ((int8_t)off == off) \
     352                        PUT_NUM_S8(off); \
     353                    else if ((int16_t)off == off) \
     354                        PUT_NUM_S16(off); \
     355                    else if ((int32_t)off == off) \
     356                        PUT_NUM_S32(off); \
     357                    else \
     358                        PUT_NUM_S64(off); \
     359                } \
     360                PUT_C(a_chEnd); \
     361            } \
     362        } while (0)
     363
     364#define PUT_SYMBOL(a_uSeg, a_uAddr, a_szStart, a_chEnd) \
     365        do { \
     366            if (pfnGetSymbol) \
     367            { \
     368                int rcSym = pfnGetSymbol(pDis, a_uSeg, a_uAddr, szSymbol, sizeof(szSymbol), &off, pvUser); \
     369                PUT_SYMBOL_TWO(rcSym, a_szStart, a_chEnd); \
     370            } \
     371        } while (0)
     372
    343373
    344374    /*
     
    736766                            Assert(!(fUse & DISUSE_SCALE));
    737767
     768                        int64_t off2 = 0;
    738769                        if (fUse & (DISUSE_DISPLACEMENT8 | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT32 | DISUSE_DISPLACEMENT64 | DISUSE_RIPDISPLACEMENT32))
    739770                        {
    740                             int64_t off2;
    741771                            if (fUse & DISUSE_DISPLACEMENT8)
    742772                                off2 = pParam->uDisp.i8;
     
    775805
    776806                        if (DISUSE_IS_EFFECTIVE_ADDR(fUse))
     807                        {
     808                            if (pfnGetSymbol && !fBase && !(fUse & DISUSE_INDEX) && off2 != 0)
     809                                PUT_SYMBOL((pDis->fPrefix & DISPREFIX_SEG)
     810                                           ? DIS_FMT_SEL_FROM_REG(pDis->idxSegPrefix)
     811                                           : DIS_FMT_SEL_FROM_REG(DISSELREG_DS),
     812                                           pDis->uAddrMode == DISCPUMODE_64BIT
     813                                           ? (uint64_t)off2
     814                                           : pDis->uAddrMode == DISCPUMODE_32BIT
     815                                           ? (uint32_t)off2
     816                                           : (uint16_t)off2,
     817                                           " (=", ')');
    777818                            PUT_C(']');
     819                        }
    778820                        break;
    779821                    }
     
    840882                                }
    841883                                PUT_NUM_32(pParam->uValue);
     884                                if (pDis->uCpuMode == DISCPUMODE_32BIT)
     885                                    PUT_SYMBOL(DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uValue, " (=", ')');
    842886                                break;
    843887
     
    908952                                PUT_SZ("near ");
    909953                            offDisplacement = (int32_t)pParam->uValue;
    910                             Assert(pParam->fUse & (DISUSE_IMMEDIATE32_REL|DISUSE_IMMEDIATE64_REL));
     954                            Assert(pParam->fUse & (DISUSE_IMMEDIATE32_REL | DISUSE_IMMEDIATE64_REL));
    911955                            Assert(*pszFmt == 'v'); pszFmt++;
    912956
     
    925969                            PUT_NUM_64(uTrgAddr);
    926970
    927                         if (pfnGetSymbol)
     971                        if (fFlags & DIS_FMT_FLAGS_RELATIVE_BRANCH)
    928972                        {
    929                             int rc = pfnGetSymbol(pDis, DIS_FMT_SEL_FROM_REG(DISSELREG_CS), uTrgAddr, szSymbol, sizeof(szSymbol), &off, pvUser);
    930                             if (RT_SUCCESS(rc))
    931                             {
    932                                 PUT_SZ(" [");
    933                                 PUT_PSZ(szSymbol);
    934                                 if (off != 0)
    935                                 {
    936                                     if ((int8_t)off == off)
    937                                         PUT_NUM_S8(off);
    938                                     else if ((int16_t)off == off)
    939                                         PUT_NUM_S16(off);
    940                                     else if ((int32_t)off == off)
    941                                         PUT_NUM_S32(off);
    942                                     else
    943                                         PUT_NUM_S64(off);
    944                                 }
    945                                 PUT_C(']');
    946                             }
     973                            PUT_SYMBOL(DIS_FMT_SEL_FROM_REG(DISSELREG_CS), uTrgAddr, " = ", ' ');
     974                            PUT_C(')');
    947975                        }
    948 
    949                         if (fFlags & DIS_FMT_FLAGS_RELATIVE_BRANCH)
    950                             PUT_C(')');
     976                        else
     977                            PUT_SYMBOL(DIS_FMT_SEL_FROM_REG(DISSELREG_CS), uTrgAddr, " (", ')');
    951978                        break;
    952979                    }
     
    9951022                        }
    9961023
    997                         if (RT_SUCCESS(rc))
    998                         {
    999                             PUT_SZ(" [");
    1000                             PUT_PSZ(szSymbol);
    1001                             if (off != 0)
    1002                             {
    1003                                 if ((int8_t)off == off)
    1004                                     PUT_NUM_S8(off);
    1005                                 else if ((int16_t)off == off)
    1006                                     PUT_NUM_S16(off);
    1007                                 else if ((int32_t)off == off)
    1008                                     PUT_NUM_S32(off);
    1009                                 else
    1010                                     PUT_NUM_S64(off);
    1011                             }
    1012                             PUT_C(']');
    1013                         }
     1024                        PUT_SYMBOL_TWO(rc, " [", ']');
    10141025                        break;
    10151026                    }
     
    10601071                        PUT_C(']');
    10611072
    1062                         if (RT_SUCCESS(rc))
    1063                         {
    1064                             PUT_SZ(" (");
    1065                             PUT_PSZ(szSymbol);
    1066                             if (off != 0)
    1067                             {
    1068                                 if ((int8_t)off == off)
    1069                                     PUT_NUM_S8(off);
    1070                                 else if ((int16_t)off == off)
    1071                                     PUT_NUM_S16(off);
    1072                                 else if ((int32_t)off == off)
    1073                                     PUT_NUM_S32(off);
    1074                                 else
    1075                                     PUT_NUM_S64(off);
    1076                             }
    1077                             PUT_C(')');
    1078                         }
     1073                        PUT_SYMBOL_TWO(rc, " (", ')');
    10791074                        break;
    10801075                    }
  • trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp

    r46164 r46177  
    240240            else
    241241            {
    242                 offFile  = -1;
     242                offFile  = UINT32_MAX;
    243243                cbToRead = 0;
    244244            }
  • trunk/src/VBox/VMM/VMMR3/DBGFDisas.cpp

    r46159 r46177  
    325325 * @copydoc FNDISGETSYMBOL
    326326 */
    327 static DECLCALLBACK(int) dbgfR3DisasGetSymbol(PCDISCPUSTATE pCpu, uint32_t u32Sel, RTUINTPTR uAddress, char *pszBuf, size_t cchBuf, RTINTPTR *poff, void *pvUser)
     327static DECLCALLBACK(int) dbgfR3DisasGetSymbol(PCDISCPUSTATE pCpu, uint32_t u32Sel, RTUINTPTR uAddress,
     328                                              char *pszBuf, size_t cchBuf, RTINTPTR *poff, void *pvUser)
    328329{
    329330    PDBGFDISASSTATE pState   = (PDBGFDISASSTATE)pCpu;
    330331    PCDBGFSELINFO   pSelInfo = (PCDBGFSELINFO)pvUser;
     332
     333    /*
     334     * Address conversion
     335     */
    331336    DBGFADDRESS     Addr;
    332     RTDBGSYMBOL     Sym;
    333     RTGCINTPTR      off;
    334337    int             rc;
    335 
     338    /* Start with CS. */
    336339    if (   DIS_FMT_SEL_IS_REG(u32Sel)
    337340        ?  DIS_FMT_SEL_GET_REG(u32Sel) == DISSELREG_CS
    338341        :  pSelInfo->Sel == DIS_FMT_SEL_GET_VALUE(u32Sel))
    339     {
    340342        rc = DBGFR3AddrFromSelInfoOff(pState->pVM->pUVM, &Addr, pSelInfo, uAddress);
     343    /* In long mode everything but FS and GS is easy. */
     344    else if (   pState->Cpu.uCpuMode == DISCPUMODE_64BIT
     345             && DIS_FMT_SEL_IS_REG(u32Sel)
     346             && DIS_FMT_SEL_GET_REG(u32Sel) != DISSELREG_GS
     347             && DIS_FMT_SEL_GET_REG(u32Sel) != DISSELREG_FS)
     348    {
     349        DBGFR3AddrFromFlat(pState->pVM->pUVM, &Addr, uAddress);
     350        rc = VINF_SUCCESS;
     351    }
     352    /* Here's a quick hack to catch patch manager SS relative access. */
     353    else if (   DIS_FMT_SEL_IS_REG(u32Sel)
     354             && DIS_FMT_SEL_GET_REG(u32Sel) == DISSELREG_SS
     355             && pSelInfo->GCPtrBase == 0
     356             && pSelInfo->cbLimit   >= UINT32_MAX
     357             && PATMIsPatchGCAddr(pState->pVM, pState->Cpu.uInstrAddr))
     358    {
     359        DBGFR3AddrFromFlat(pState->pVM->pUVM, &Addr, uAddress);
     360        rc = VINF_SUCCESS;
     361    }
     362    else
     363    {
     364        /** @todo implement a generic solution here. */
     365        rc = VERR_SYMBOL_NOT_FOUND;
     366    }
     367
     368    /*
     369     * If we got an address, try resolve it into a symbol.
     370     */
     371    if (RT_SUCCESS(rc))
     372    {
     373        RTDBGSYMBOL     Sym;
     374        RTGCINTPTR      off;
     375        rc = DBGFR3AsSymbolByAddr(pState->pVM->pUVM, pState->hDbgAs, &Addr, RTDBGSYMADDR_FLAGS_LESS_OR_EQUAL,
     376                                  &off, &Sym, NULL /*phMod*/);
    341377        if (RT_SUCCESS(rc))
    342             rc = DBGFR3AsSymbolByAddr(pState->pVM->pUVM, pState->hDbgAs, &Addr, RTDBGSYMADDR_FLAGS_LESS_OR_EQUAL,
    343                                       &off, &Sym, NULL /*phMod*/);
    344     }
    345     else
    346         rc = VERR_SYMBOL_NOT_FOUND; /** @todo implement this */
    347     if (RT_SUCCESS(rc))
    348     {
    349         size_t cchName = strlen(Sym.szName);
    350         if (cchName >= cchBuf)
    351             cchName = cchBuf - 1;
    352         memcpy(pszBuf, Sym.szName, cchName);
    353         pszBuf[cchName] = '\0';
    354 
    355         *poff = off;
    356     }
    357 
     378        {
     379            /*
     380             * Return the symbol and offset.
     381             */
     382            size_t cchName = strlen(Sym.szName);
     383            if (cchName >= cchBuf)
     384                cchName = cchBuf - 1;
     385            memcpy(pszBuf, Sym.szName, cchName);
     386            pszBuf[cchName] = '\0';
     387
     388            *poff = off;
     389        }
     390    }
    358391    return rc;
    359392}
  • trunk/src/VBox/VMM/VMMR3/PATMR3Dbg.cpp

    r46167 r46177  
    239239{
    240240    /*
    241      * Global functions.
     241     * Global functions and a start marker.
    242242     */
    243243    ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperCallGC, PATMLookupAndCallRecord.size, "PATMLookupAndCall");
     
    245245    ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperJumpGC, PATMLookupAndJumpRecord.size, "PATMLookupAndJump");
    246246    ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperIretGC, PATMIretFunctionRecord.size,  "PATMIretFunction");
     247
     248    ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pPatchMemGC, 0,  "PatchMemStart");
     249    ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pGCStackGC, PATM_STACK_TOTAL_SIZE, "PATMStack");
    247250
    248251    /*
     
    297300
    298301    /*
    299      * Add a fake debug module for the patches.
    300      */
    301     rc = RTDbgModCreate(&hDbgMod, "patches", pVM->patm.s.cbPatchMem, 0 /*fFlags*/);
     302     * Add something for the stats so we get some kind of symbols for
     303     * references to them while disassembling patches.
     304     */
     305    rc = RTDbgModCreate(&hDbgMod, "patmstats", PATM_STAT_MEMSIZE, 0 /*fFlags*/);
     306    if (RT_SUCCESS(rc))
     307    {
     308        ADD_FUNC(hDbgMod, pVM->patm.s.pStatsGC, pVM->patm.s.pStatsGC, PATM_STAT_MEMSIZE, "PATMMemStatsStart");
     309
     310        rc = RTDbgAsModuleLink(hDbgAs, hDbgMod, pVM->patm.s.pStatsGC, 0 /*fFlags/*/);
     311        AssertLogRelRC(rc);
     312        RTDbgModRelease(hDbgMod);
     313    }
     314
     315    /*
     316     * Add a fake debug module for the patches and stack.
     317     */
     318    rc = RTDbgModCreate(&hDbgMod, "patches", pVM->patm.s.cbPatchMem + PATM_STACK_TOTAL_SIZE + PAGE_SIZE, 0 /*fFlags*/);
    302319    if (RT_SUCCESS(rc))
    303320    {
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