VirtualBox

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


Ignore:
Timestamp:
Jul 19, 2024 12:28:25 AM (6 months ago)
Author:
vboxsync
Message:

VMM/IEM: info itlb/dtlb improvements and fixes for global entries. bugref:10687 bugref:10727

File:
1 edited

Legend:

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

    r105376 r105410  
    10701070
    10711071
     1072#define IEMR3INFOTLB_F_ONLY_VALID   RT_BIT_32(0)
     1073
    10721074/** Worker for iemR3InfoTlbPrintSlots and iemR3InfoTlbPrintAddress. */
    1073 static void iemR3InfoTlbPrintSlot(PCDBGFINFOHLP pHlp, IEMTLB const *pTlb, IEMTLBENTRY const *pTlbe, uint32_t uSlot)
     1075static void iemR3InfoTlbPrintSlot(PCDBGFINFOHLP pHlp, IEMTLB const *pTlb, IEMTLBENTRY const *pTlbe,
     1076                                  uint32_t uSlot, uint32_t fFlags)
    10741077{
    1075     pHlp->pfnPrintf(pHlp, "%02x: %s %#018RX64 -> %RGp / %p / %#05x %s%s%s%s%s/%s%s%s/%s %s\n",
     1078#ifndef VBOX_VMM_TARGET_ARMV8
     1079    uint64_t const uTlbRevision = !(uSlot & 1) ? pTlb->uTlbRevision : pTlb->uTlbRevisionGlobal;
     1080#else
     1081    uint64_t const uTlbRevision = pTlb->uTlbRevision;
     1082#endif
     1083    if ((fFlags & IEMR3INFOTLB_F_ONLY_VALID) && (pTlbe->uTag & IEMTLB_REVISION_MASK) != uTlbRevision)
     1084        return;
     1085
     1086    /* The address needs to be sign extended, thus the shifting fun here.*/
     1087    RTGCPTR const  GCPtr = (RTGCINTPTR)((pTlbe->uTag & ~IEMTLB_REVISION_MASK) << (64 - IEMTLB_TAG_ADDR_WIDTH))
     1088                         >>                                                      (64 - IEMTLB_TAG_ADDR_WIDTH - GUEST_PAGE_SHIFT);
     1089    pHlp->pfnPrintf(pHlp, "%0*x: %s %#018RX64 -> %RGp / %p / %#05x %s%s%s%s%s%s/%s%s%s%s/%s %s\n",
     1090                    RT_ELEMENTS(pTlb->aEntries) >= 0x1000 ? 4 : RT_ELEMENTS(pTlb->aEntries) >= 0x100 ? 3 : 2,
    10761091                    uSlot,
    1077                     (pTlbe->uTag & IEMTLB_REVISION_MASK) == pTlb->uTlbRevision ? "valid  "
    1078                     : (pTlbe->uTag & IEMTLB_REVISION_MASK) == 0                ? "empty  "
    1079                                                                                : "expired",
    1080                     (pTlbe->uTag & ~IEMTLB_REVISION_MASK) << X86_PAGE_SHIFT,
     1092                    (pTlbe->uTag & IEMTLB_REVISION_MASK) == uTlbRevision ? "valid  "
     1093                    : (pTlbe->uTag & IEMTLB_REVISION_MASK) == 0          ? "empty  "
     1094                                                                         : "expired",
     1095                    GCPtr,
    10811096                    pTlbe->GCPhys, pTlbe->pbMappingR3,
    10821097                    (uint32_t)(pTlbe->fFlagsAndPhysRev & ~IEMTLBE_F_PHYS_REV),
    1083                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_EXEC      ? "NX" : " X",
    1084                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_WRITE     ? "RO" : "RW",
    1085                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_ACCESSED  ? "-"  : "A",
    1086                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_DIRTY     ? "-"  : "D",
    1087                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE   ? "-"  : "S",
    1088                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_NO_WRITE     ? "-"  : "w",
    1089                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_NO_READ      ? "-"  : "r",
    1090                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_UNASSIGNED   ? "U"  : "-",
    1091                     pTlbe->fFlagsAndPhysRev & IEMTLBE_F_NO_MAPPINGR3    ? "S"  : "M",
     1098                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_WRITE      ? "R-" : "RW",
     1099                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_EXEC       ? "-"  : "X",
     1100                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_ACCESSED   ? "-"  : "A",
     1101                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_NO_DIRTY      ? "-"  : "D",
     1102                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PT_LARGE_PAGE    ? "-"  : "S",
     1103                    !(uSlot & 1)                                         ? "-"  : "G",
     1104                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_NO_WRITE      ? "-"  : "w",
     1105                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_NO_READ       ? "-"  : "r",
     1106                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_UNASSIGNED    ? "U"  : "-",
     1107                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PG_CODE_PAGE     ? "C"  : "-",
     1108                    pTlbe->fFlagsAndPhysRev & IEMTLBE_F_NO_MAPPINGR3     ? "S"  : "M",
    10921109                    (pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PHYS_REV) == pTlb->uTlbPhysRev ? "phys-valid"
    10931110                    : (pTlbe->fFlagsAndPhysRev & IEMTLBE_F_PHYS_REV) == 0 ? "phys-empty" : "phys-expired");
     
    10971114/** Displays one or more TLB slots. */
    10981115static void iemR3InfoTlbPrintSlots(PVMCPU pVCpu, PCDBGFINFOHLP pHlp, IEMTLB const *pTlb,
    1099                                    uint32_t uSlot, uint32_t cSlots, bool *pfHeader)
     1116                                   uint32_t uSlot, uint32_t cSlots, uint32_t fFlags, bool *pfHeader)
    11001117{
    11011118    if (uSlot < RT_ELEMENTS(pTlb->aEntries))
     
    11121129        {
    11131130            IEMTLBENTRY const Tlbe = pTlb->aEntries[uSlot];
    1114             iemR3InfoTlbPrintSlot(pHlp, pTlb, &Tlbe, uSlot);
     1131            iemR3InfoTlbPrintSlot(pHlp, pTlb, &Tlbe, uSlot, fFlags);
    11151132            uSlot = (uSlot + 1) % RT_ELEMENTS(pTlb->aEntries);
    11161133        }
     
    11241141/** Displays the TLB slot for the given address. */
    11251142static void iemR3InfoTlbPrintAddress(PVMCPU pVCpu, PCDBGFINFOHLP pHlp, IEMTLB const *pTlb,
    1126                                      uint64_t uAddress, bool *pfHeader)
     1143                                     uint64_t uAddress, uint32_t fFlags, bool *pfHeader)
    11271144{
    11281145    iemR3InfoTlbPrintHeader(pVCpu, pHlp, pTlb, pfHeader);
     
    11341151                    Tlbe.uTag == (uTag | pTlb->uTlbRevision)  ? "match"
    11351152                    : (Tlbe.uTag & ~IEMTLB_REVISION_MASK) == uTag ? "expired" : "mismatch");
    1136     iemR3InfoTlbPrintSlot(pHlp, pTlb, &Tlbe, uSlot);
     1153    iemR3InfoTlbPrintSlot(pHlp, pTlb, &Tlbe, uSlot, fFlags);
    11371154}
    11381155
     
    11461163    static RTGETOPTDEF const s_aOptions[] =
    11471164    {
    1148         { "--cpu",     'c', RTGETOPT_REQ_UINT32                          },
    1149         { "--vcpu",    'c', RTGETOPT_REQ_UINT32                          },
    1150         { "all",       'A', RTGETOPT_REQ_NOTHING                         },
    1151         { "--all",     'A', RTGETOPT_REQ_NOTHING                         },
    1152         { "--address", 'a', RTGETOPT_REQ_UINT64      | RTGETOPT_FLAG_HEX },
    1153         { "--range",   'r', RTGETOPT_REQ_UINT32_PAIR | RTGETOPT_FLAG_HEX },
    1154         { "--slot",    's', RTGETOPT_REQ_UINT32      | RTGETOPT_FLAG_HEX },
     1165        { "--cpu",          'c', RTGETOPT_REQ_UINT32                          },
     1166        { "--vcpu",         'c', RTGETOPT_REQ_UINT32                          },
     1167        { "all",            'A', RTGETOPT_REQ_NOTHING                         },
     1168        { "--all",          'A', RTGETOPT_REQ_NOTHING                         },
     1169        { "--address",      'a', RTGETOPT_REQ_UINT64      | RTGETOPT_FLAG_HEX },
     1170        { "--range",        'r', RTGETOPT_REQ_UINT32_PAIR | RTGETOPT_FLAG_HEX },
     1171        { "--slot",         's', RTGETOPT_REQ_UINT32      | RTGETOPT_FLAG_HEX },
     1172        { "--only-valid",   'v', RTGETOPT_REQ_NOTHING                         },
    11551173    };
    11561174
     
    11691187    bool            fNeedHeader  = true;
    11701188    bool            fAddressMode = true;
     1189    uint32_t        fFlags       = 0;
    11711190    PVMCPU          pVCpu        = VMMGetCpu(pVM);
    11721191    if (!pVCpu)
     
    11901209            case 'a':
    11911210                iemR3InfoTlbPrintAddress(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1192                                          ValueUnion.u64, &fNeedHeader);
     1211                                         ValueUnion.u64, fFlags, &fNeedHeader);
    11931212                fAddressMode = true;
    11941213                break;
     
    11961215            case 'A':
    11971216                iemR3InfoTlbPrintSlots(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1198                                        0, RT_ELEMENTS(pVCpu->iem.s.CodeTlb.aEntries), &fNeedHeader);
     1217                                       0, RT_ELEMENTS(pVCpu->iem.s.CodeTlb.aEntries), fFlags, &fNeedHeader);
    11991218                break;
    12001219
    12011220            case 'r':
    12021221                iemR3InfoTlbPrintSlots(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1203                                        ValueUnion.PairU32.uFirst, ValueUnion.PairU32.uSecond, &fNeedHeader);
     1222                                       ValueUnion.PairU32.uFirst, ValueUnion.PairU32.uSecond, fFlags, &fNeedHeader);
    12041223                fAddressMode = false;
    12051224                break;
     
    12071226            case 's':
    12081227                iemR3InfoTlbPrintSlots(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1209                                        ValueUnion.u32, 1, &fNeedHeader);
     1228                                       ValueUnion.u32, 1, fFlags, &fNeedHeader);
    12101229                fAddressMode = false;
     1230                break;
     1231
     1232            case 'v':
     1233                fFlags |= IEMR3INFOTLB_F_ONLY_VALID;
    12111234                break;
    12121235
     
    12181241                    if (RT_SUCCESS(rc) && rc != VWRN_NUMBER_TOO_BIG)
    12191242                        iemR3InfoTlbPrintAddress(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1220                                                  uAddr, &fNeedHeader);
     1243                                                 uAddr, fFlags, &fNeedHeader);
    12211244                    else
    12221245                        pHlp->pfnPrintf(pHlp, "error: Invalid or malformed guest address '%s': %Rrc\n", ValueUnion.psz, rc);
     
    12281251                    if (RT_SUCCESS(rc) && rc != VWRN_NUMBER_TOO_BIG)
    12291252                        iemR3InfoTlbPrintSlots(pVCpu, pHlp, fITlb ? &pVCpu->iem.s.CodeTlb : &pVCpu->iem.s.DataTlb,
    1230                                                uSlot, 1, &fNeedHeader);
     1253                                               uSlot, 1, fFlags, &fNeedHeader);
    12311254                    else
    12321255                        pHlp->pfnPrintf(pHlp, "error: Invalid or malformed TLB slot number '%s': %Rrc\n", ValueUnion.psz, rc);
     
    12491272                                "  -s<slot>,--slot=<slot>\n"
    12501273                                "    Shows the given TLB slot.\n"
     1274                                "  -v,--only-valid\n"
     1275                                "    Only show valid TLB entries (TAG, not phys)\n"
    12511276                                "\n"
    12521277                                "Non-options are interpreted according to the last -a, -r or -s option,\n"
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette