Changeset 105465 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Jul 24, 2024 9:05:40 AM (9 months ago)
- svn:sync-xref-src-repo-rev:
- 164124
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/IEMR3.cpp
r105440 r105465 189 189 190 190 /** @cfgm{/IEM/NativeRecompileAtUsedCount, uint32_t, 16} 191 * The translation block use count value to do native recompilation at. */ 191 * The translation block use count value to do native recompilation at. 192 * Set to zero to disable native recompilation. */ 192 193 uint32_t uTbNativeRecompileAtUsedCount = 16; 193 194 rc = CFGMR3QueryU32Def(pIem, "NativeRecompileAtUsedCount", &uTbNativeRecompileAtUsedCount, 16); … … 1455 1456 { "--limit", 'l', RTGETOPT_REQ_UINT32 }, 1456 1457 { "--stop-at-global-flush", 'g', RTGETOPT_REQ_NOTHING }, 1458 { "--resolve-rip", 'r', RTGETOPT_REQ_NOTHING }, 1457 1459 }; 1458 1460 … … 1463 1465 uint32_t cLimit = UINT32_MAX; 1464 1466 bool fStopAtGlobalFlush = false; 1467 bool fResolveRip = false; 1465 1468 PVMCPU const pVCpuCall = VMMGetCpu(pVM); 1466 1469 PVMCPU pVCpu = pVCpuCall; … … 1488 1491 break; 1489 1492 1493 case 'r': 1494 fResolveRip = true; 1495 break; 1496 1490 1497 case 'h': 1491 1498 pHlp->pfnPrintf(pHlp, 1492 "Usage: info tlbtrace [options] \n"1499 "Usage: info tlbtrace [options] [n]\n" 1493 1500 "\n" 1494 1501 "Options:\n" 1495 1502 " -c<n>, --cpu=<n>, --vcpu=<n>\n" 1496 1503 " Selects the CPU which TLB trace we're looking at. Default: Caller / 0\n" 1497 " -l<n>, --last=<n>\n"1504 " [n], -l<n>, --last=<n>\n" 1498 1505 " Limit display to the last N entries. Default: all\n" 1499 " -g, --stop-at-global-flush\n"1506 " -g, --stop-at-global-flush\n" 1500 1507 " Stop after the first global flush entry.\n" 1508 " -r, --resolve-rip\n" 1509 " Resolve symbols for the flattened RIP addresses.\n" 1501 1510 ); 1511 return; 1512 1513 case VINF_GETOPT_NOT_OPTION: 1514 rc = RTStrToUInt32Full(ValueUnion.psz, 0, &cLimit); 1515 if (RT_SUCCESS(rc)) 1516 break; 1517 pHlp->pfnPrintf(pHlp, "error: failed to convert '%s' to a number: %Rrc\n", ValueUnion.psz, rc); 1502 1518 return; 1503 1519 … … 1526 1542 while (cLeft-- > 0) 1527 1543 { 1528 PCIEMTLBTRACEENTRY const pCur = &paEntries[--idx & fMask]; 1544 PCIEMTLBTRACEENTRY const pCur = &paEntries[--idx & fMask]; 1545 const char *pszSymbol = ""; 1546 union 1547 { 1548 RTDBGSYMBOL Symbol; 1549 char ach[sizeof(RTDBGSYMBOL) + 32]; 1550 } uBuf; 1551 if (fResolveRip) 1552 { 1553 RTGCINTPTR offDisp = 0; 1554 DBGFADDRESS Addr; 1555 rc = DBGFR3AsSymbolByAddr(pVM->pUVM, DBGF_AS_GLOBAL, DBGFR3AddrFromFlat(pVM->pUVM, &Addr, pCur->rip), 1556 RTDBGSYMADDR_FLAGS_LESS_OR_EQUAL 1557 | RTDBGSYMADDR_FLAGS_SKIP_ABS 1558 | RTDBGSYMADDR_FLAGS_SKIP_ABS_IN_DEFERRED, 1559 &offDisp, &uBuf.Symbol, NULL); 1560 if (RT_SUCCESS(rc)) 1561 { 1562 if (offDisp) 1563 { 1564 size_t const cchName = strlen(uBuf.Symbol.szName); 1565 char * const pszEndName = &uBuf.Symbol.szName[cchName]; 1566 size_t const cbLeft = sizeof(uBuf) - sizeof(uBuf.Symbol) + sizeof(uBuf.Symbol.szName) - cchName; 1567 if (offDisp > 0) 1568 RTStrPrintf(pszEndName, cbLeft, "+%#1RGv", offDisp); 1569 else 1570 RTStrPrintf(pszEndName, cbLeft, "-%#1RGv", -offDisp); 1571 char *pszName = uBuf.Symbol.szName; 1572 *--pszName = ' '; /* padding */ 1573 pszSymbol = pszName; 1574 } 1575 } 1576 } 1529 1577 switch (pCur->enmType) 1530 1578 { 1531 1579 case kIemTlbTraceType_InvlPg: 1532 pHlp->pfnPrintf(pHlp, "%u: %016RX64 invlpg %RGv slot=" IEMTLB_SLOT_FMT " \n",1533 idx, pCur->rip, pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param));1580 pHlp->pfnPrintf(pHlp, "%u: %016RX64 invlpg %RGv slot=" IEMTLB_SLOT_FMT "%s\n", idx, pCur->rip, 1581 pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param), pszSymbol); 1534 1582 break; 1535 1583 case kIemTlbTraceType_Flush: 1536 pHlp->pfnPrintf(pHlp, "%u: %016RX64 flush %s rev=%#RX64 \n", idx, pCur->rip,1537 pCur->bParam ? "data" : "code", pCur->u64Param );1584 pHlp->pfnPrintf(pHlp, "%u: %016RX64 flush %s rev=%#RX64%s\n", idx, pCur->rip, 1585 pCur->bParam ? "data" : "code", pCur->u64Param, pszSymbol); 1538 1586 break; 1539 1587 case kIemTlbTraceType_FlushGlobal: 1540 pHlp->pfnPrintf(pHlp, "%u: %016RX64 flush %s rev=%#RX64 grev=%#RX64 \n", idx, pCur->rip,1541 pCur->bParam ? "data" : "code", pCur->u64Param, pCur->u64Param2 );1588 pHlp->pfnPrintf(pHlp, "%u: %016RX64 flush %s rev=%#RX64 grev=%#RX64%s\n", idx, pCur->rip, 1589 pCur->bParam ? "data" : "code", pCur->u64Param, pCur->u64Param2, pszSymbol); 1542 1590 if (fStopAtGlobalFlush) 1543 1591 return; 1544 1592 break; 1545 1593 case kIemTlbTraceType_Load: 1546 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load %s %RGv slot=" IEMTLB_SLOT_FMT " \n",1594 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load %s %RGv slot=" IEMTLB_SLOT_FMT "%s\n", 1547 1595 idx, pCur->rip, pCur->bParam ? "data" : "code", 1548 pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param) );1596 pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param), pszSymbol); 1549 1597 break; 1550 1598 case kIemTlbTraceType_LoadGlobal: 1551 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load %s %RGv slot=" IEMTLB_SLOT_FMT " (global) \n",1599 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load %s %RGv slot=" IEMTLB_SLOT_FMT " (global)%s\n", 1552 1600 idx, pCur->rip, pCur->bParam ? "data" : "code", 1553 pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param) );1601 pCur->u64Param, (uint32_t)IEMTLB_ADDR_TO_EVEN_INDEX(pCur->u64Param), pszSymbol); 1554 1602 break; 1555 1603 case kIemTlbTraceType_Load_Cr0: 1556 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr0 %08RX64 (was %08RX64) \n",1557 idx, pCur->rip, pCur->u64Param, pCur->u64Param2 );1604 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr0 %08RX64 (was %08RX64)%s\n", 1605 idx, pCur->rip, pCur->u64Param, pCur->u64Param2, pszSymbol); 1558 1606 break; 1559 1607 case kIemTlbTraceType_Load_Cr3: 1560 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr3 %016RX64 (was %016RX64) \n",1561 idx, pCur->rip, pCur->u64Param, pCur->u64Param2 );1608 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr3 %016RX64 (was %016RX64)%s\n", 1609 idx, pCur->rip, pCur->u64Param, pCur->u64Param2, pszSymbol); 1562 1610 break; 1563 1611 case kIemTlbTraceType_Load_Cr4: 1564 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr4 %08RX64 (was %08RX64) \n",1565 idx, pCur->rip, pCur->u64Param, pCur->u64Param2 );1612 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load cr4 %08RX64 (was %08RX64)%s\n", 1613 idx, pCur->rip, pCur->u64Param, pCur->u64Param2, pszSymbol); 1566 1614 break; 1567 1615 case kIemTlbTraceType_Load_Efer: 1568 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load efer %016RX64 (was %016RX64)\n", 1569 idx, pCur->rip, pCur->u64Param, pCur->u64Param2); 1616 pHlp->pfnPrintf(pHlp, "%u: %016RX64 load efer %016RX64 (was %016RX64)%s\n", 1617 idx, pCur->rip, pCur->u64Param, pCur->u64Param2, pszSymbol); 1618 break; 1619 case kIemTlbTraceType_Irq: 1620 pHlp->pfnPrintf(pHlp, "%u: %016RX64 irq %#04x flags=%#x eflboth=%#RX64%s\n", 1621 idx, pCur->rip, pCur->bParam, pCur->u32Param, 1622 pCur->u64Param & ((RT_BIT_64(CPUMX86EFLAGS_HW_BITS) - 1) | CPUMX86EFLAGS_INT_MASK_64), 1623 pszSymbol); 1624 break; 1625 case kIemTlbTraceType_Xcpt: 1626 if (pCur->u32Param & IEM_XCPT_FLAGS_CR2) 1627 pHlp->pfnPrintf(pHlp, "%u: %016RX64 xcpt %#04x flags=%#x errcd=%#x cr2=%RX64%s\n", 1628 idx, pCur->rip, pCur->bParam, pCur->u32Param, pCur->u64Param, pCur->u64Param2, pszSymbol); 1629 else if (pCur->u32Param & IEM_XCPT_FLAGS_ERR) 1630 pHlp->pfnPrintf(pHlp, "%u: %016RX64 xcpt %#04x flags=%#x errcd=%#x%s\n", 1631 idx, pCur->rip, pCur->bParam, pCur->u32Param, pCur->u64Param, pszSymbol); 1632 else 1633 pHlp->pfnPrintf(pHlp, "%u: %016RX64 xcpt %#04x flags=%#x%s\n", 1634 idx, pCur->rip, pCur->bParam, pCur->u32Param, pszSymbol); 1635 break; 1636 case kIemTlbTraceType_IRet: 1637 pHlp->pfnPrintf(pHlp, "%u: %016RX64 iret cs:rip=%04x:%016RX64 efl=%08RX32%s\n", 1638 idx, pCur->rip, pCur->u32Param, pCur->u64Param, (uint32_t)pCur->u64Param2, pszSymbol); 1570 1639 break; 1571 1640 case kIemTlbTraceType_Invalid:
Note:
See TracChangeset
for help on using the changeset viewer.