Changeset 46177 in vbox
- Timestamp:
- May 20, 2013 9:12:43 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 85887
- Location:
- trunk/src/VBox
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Disassembler/DisasmFormatYasm.cpp
r42369 r46177 341 341 #define PUT_NUM_S64(num) PUT_NUM_SIGN(18, "0%016RX64h", num, int64_t, uint64_t) 342 342 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 343 373 344 374 /* … … 736 766 Assert(!(fUse & DISUSE_SCALE)); 737 767 768 int64_t off2 = 0; 738 769 if (fUse & (DISUSE_DISPLACEMENT8 | DISUSE_DISPLACEMENT16 | DISUSE_DISPLACEMENT32 | DISUSE_DISPLACEMENT64 | DISUSE_RIPDISPLACEMENT32)) 739 770 { 740 int64_t off2;741 771 if (fUse & DISUSE_DISPLACEMENT8) 742 772 off2 = pParam->uDisp.i8; … … 775 805 776 806 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 " (=", ')'); 777 818 PUT_C(']'); 819 } 778 820 break; 779 821 } … … 840 882 } 841 883 PUT_NUM_32(pParam->uValue); 884 if (pDis->uCpuMode == DISCPUMODE_32BIT) 885 PUT_SYMBOL(DIS_FMT_SEL_FROM_REG(DISSELREG_CS), pParam->uValue, " (=", ')'); 842 886 break; 843 887 … … 908 952 PUT_SZ("near "); 909 953 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)); 911 955 Assert(*pszFmt == 'v'); pszFmt++; 912 956 … … 925 969 PUT_NUM_64(uTrgAddr); 926 970 927 if ( pfnGetSymbol)971 if (fFlags & DIS_FMT_FLAGS_RELATIVE_BRANCH) 928 972 { 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(')'); 947 975 } 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, " (", ')'); 951 978 break; 952 979 } … … 995 1022 } 996 1023 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, " [", ']'); 1014 1025 break; 1015 1026 } … … 1060 1071 PUT_C(']'); 1061 1072 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, " (", ')'); 1079 1074 break; 1080 1075 } -
trunk/src/VBox/Runtime/common/ldr/ldrPE.cpp
r46164 r46177 240 240 else 241 241 { 242 offFile = -1;242 offFile = UINT32_MAX; 243 243 cbToRead = 0; 244 244 } -
trunk/src/VBox/VMM/VMMR3/DBGFDisas.cpp
r46159 r46177 325 325 * @copydoc FNDISGETSYMBOL 326 326 */ 327 static DECLCALLBACK(int) dbgfR3DisasGetSymbol(PCDISCPUSTATE pCpu, uint32_t u32Sel, RTUINTPTR uAddress, char *pszBuf, size_t cchBuf, RTINTPTR *poff, void *pvUser) 327 static DECLCALLBACK(int) dbgfR3DisasGetSymbol(PCDISCPUSTATE pCpu, uint32_t u32Sel, RTUINTPTR uAddress, 328 char *pszBuf, size_t cchBuf, RTINTPTR *poff, void *pvUser) 328 329 { 329 330 PDBGFDISASSTATE pState = (PDBGFDISASSTATE)pCpu; 330 331 PCDBGFSELINFO pSelInfo = (PCDBGFSELINFO)pvUser; 332 333 /* 334 * Address conversion 335 */ 331 336 DBGFADDRESS Addr; 332 RTDBGSYMBOL Sym;333 RTGCINTPTR off;334 337 int rc; 335 338 /* Start with CS. */ 336 339 if ( DIS_FMT_SEL_IS_REG(u32Sel) 337 340 ? DIS_FMT_SEL_GET_REG(u32Sel) == DISSELREG_CS 338 341 : pSelInfo->Sel == DIS_FMT_SEL_GET_VALUE(u32Sel)) 339 {340 342 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*/); 341 377 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 } 358 391 return rc; 359 392 } -
trunk/src/VBox/VMM/VMMR3/PATMR3Dbg.cpp
r46167 r46177 239 239 { 240 240 /* 241 * Global functions .241 * Global functions and a start marker. 242 242 */ 243 243 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperCallGC, PATMLookupAndCallRecord.size, "PATMLookupAndCall"); … … 245 245 ADD_FUNC(hDbgMod, pVM->patm.s.pPatchMemGC, pVM->patm.s.pfnHelperJumpGC, PATMLookupAndJumpRecord.size, "PATMLookupAndJump"); 246 246 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"); 247 250 248 251 /* … … 297 300 298 301 /* 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*/); 302 319 if (RT_SUCCESS(rc)) 303 320 {
Note:
See TracChangeset
for help on using the changeset viewer.