VirtualBox

Changeset 105465 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Jul 24, 2024 9:05:40 AM (9 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
164124
Message:

VMM/IEM: Some more TLB tracing related changes. bugref:10727

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r105440 r105465  
    189189
    190190    /** @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. */
    192193    uint32_t uTbNativeRecompileAtUsedCount = 16;
    193194    rc = CFGMR3QueryU32Def(pIem, "NativeRecompileAtUsedCount", &uTbNativeRecompileAtUsedCount, 16);
     
    14551456        { "--limit",                    'l', RTGETOPT_REQ_UINT32  },
    14561457        { "--stop-at-global-flush",     'g', RTGETOPT_REQ_NOTHING },
     1458        { "--resolve-rip",              'r', RTGETOPT_REQ_NOTHING },
    14571459    };
    14581460
     
    14631465    uint32_t        cLimit             = UINT32_MAX;
    14641466    bool            fStopAtGlobalFlush = false;
     1467    bool            fResolveRip        = false;
    14651468    PVMCPU const    pVCpuCall          = VMMGetCpu(pVM);
    14661469    PVMCPU          pVCpu              = pVCpuCall;
     
    14881491                break;
    14891492
     1493            case 'r':
     1494                fResolveRip = true;
     1495                break;
     1496
    14901497            case 'h':
    14911498                pHlp->pfnPrintf(pHlp,
    1492                                 "Usage: info tlbtrace [options]\n"
     1499                                "Usage: info tlbtrace [options] [n]\n"
    14931500                                "\n"
    14941501                                "Options:\n"
    14951502                                "  -c<n>, --cpu=<n>, --vcpu=<n>\n"
    14961503                                "    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"
    14981505                                "    Limit display to the last N entries. Default: all\n"
    1499                                 "  -g,--stop-at-global-flush\n"
     1506                                "  -g, --stop-at-global-flush\n"
    15001507                                "    Stop after the first global flush entry.\n"
     1508                                "  -r, --resolve-rip\n"
     1509                                "    Resolve symbols for the flattened RIP addresses.\n"
    15011510                                );
     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);
    15021518                return;
    15031519
     
    15261542        while (cLeft-- > 0)
    15271543        {
    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            }
    15291577            switch (pCur->enmType)
    15301578            {
    15311579                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);
    15341582                    break;
    15351583                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);
    15381586                    break;
    15391587                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);
    15421590                    if (fStopAtGlobalFlush)
    15431591                        return;
    15441592                    break;
    15451593                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",
    15471595                                    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);
    15491597                    break;
    15501598                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",
    15521600                                    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);
    15541602                    break;
    15551603                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);
    15581606                    break;
    15591607                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);
    15621610                    break;
    15631611                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);
    15661614                    break;
    15671615                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);
    15701639                    break;
    15711640                case kIemTlbTraceType_Invalid:
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