VirtualBox

Changeset 106192 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Oct 1, 2024 12:57:32 PM (4 months ago)
Author:
vboxsync
Message:

VMM/IEM: Added some basic stats & debug info for postponed EFLAGS calcs. Moved debug info structures from IEMInternal.h and into IEMN8veRecompiler.h. bugref:10720

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllN8veRecompiler.cpp

    r106187 r106192  
    27892789
    27902790# endif /* defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR) */
     2791
     2792# ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING
     2793/**
     2794 * Debug Info: Record info about emitting a postponed EFLAGS calculation.
     2795 */
     2796DECL_HIDDEN_THROW(void)
     2797iemNativeDbgInfoAddPostponedEFlagsCalc(PIEMRECOMPILERSTATE pReNative, uint32_t off, IEMNATIVE_POSTPONED_EFL_OP_T enmOp,
     2798                                       uint8_t cOpBits, uint8_t idxEmit)
     2799{
     2800    iemNativeDbgInfoAddNativeOffset(pReNative, off);
     2801    PIEMTBDBGENTRY const pEntry = iemNativeDbgInfoAddNewEntry(pReNative, pReNative->pDbgInfo);
     2802    pEntry->PostponedEflCalc.uType      = kIemTbDbgEntryType_PostponedEFlagsCalc;
     2803    pEntry->PostponedEflCalc.enmOp      = (unsigned)enmOp;
     2804    pEntry->PostponedEflCalc.cOpBits    = cOpBits;
     2805    pEntry->PostponedEflCalc.idxEmit    = idxEmit;
     2806    pEntry->PostponedEflCalc.uUnused    = 0;
     2807}
     2808# endif /* IEMNATIVE_WITH_EFLAGS_POSTPONING */
    27912809
    27922810#endif /* IEMNATIVE_WITH_TB_DEBUG_INFO */
     
    91729190                for (; iDbgEntry < cDbgEntries; iDbgEntry++)
    91739191                {
    9174                     switch (pDbgInfo->aEntries[iDbgEntry].Gen.uType)
     9192                    switch ((IEMTBDBGENTRYTYPE)pDbgInfo->aEntries[iDbgEntry].Gen.uType)
    91759193                    {
    91769194                        case kIemTbDbgEntryType_GuestInstruction:
     
    93519369# endif
    93529370
     9371# ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING
     9372                        case kIemTbDbgEntryType_PostponedEFlagsCalc:
     9373                        {
     9374                            const char *pszOp = "!unknown!";
     9375                            switch ((IEMNATIVE_POSTPONED_EFL_OP_T)pDbgInfo->aEntries[iDbgEntry].PostponedEflCalc.enmOp)
     9376                            {
     9377                                case kIemNativePostponedEflOp_Logical: pszOp = "logical"; break;
     9378                                case kIemNativePostponedEflOp_Invalid: break;
     9379                                case kIemNativePostponedEflOp_End:     break;
     9380                            }
     9381                            pHlp->pfnPrintf(pHlp, "  Postponed EFLAGS calc #%u: %s %u bits\n",
     9382                                            pDbgInfo->aEntries[iDbgEntry].PostponedEflCalc.idxEmit, pszOp,
     9383                                            pDbgInfo->aEntries[iDbgEntry].PostponedEflCalc.cOpBits);
     9384                            continue;
     9385                        }
     9386# endif
    93539387                        default:
    93549388                            AssertFailed();
     9389                            continue;
    93559390                    }
     9391                    /* Break out of the loop at kIemTbDbgEntryType_NativeOffset. */
    93569392                    iDbgEntry++;
    93579393                    break;
  • trunk/src/VBox/VMM/VMMAll/target-x86/IEMAllN8veEmit-x86.h

    r106187 r106192  
    255255        pReNative->PostponedEfl.idxReg1 = UINT8_MAX;
    256256        pReNative->PostponedEfl.idxReg2 = UINT8_MAX;
     257#if defined(VBOX_WITH_STATISTICS) || defined(IEMNATIVE_WITH_TB_DEBUG_INFO)
     258        STAM_PROFILE_ADD_PERIOD(&pReNative->pVCpu->iem.s.StatNativeEflPostponedEmits, pReNative->PostponedEfl.cEmits);
     259        pReNative->PostponedEfl.cEmits = 0;
     260#endif
    257261    }
    258262}
     
    362366                                                   uint32_t bmExtraTlbMissRegs = 0)
    363367{
     368#ifdef IEMNATIVE_WITH_TB_DEBUG_INFO
     369    iemNativeDbgInfoAddPostponedEFlagsCalc(pReNative, off, pReNative->PostponedEfl.enmOp, pReNative->PostponedEfl.cOpBits,
     370                                           pReNative->PostponedEfl.cEmits);
     371#endif
     372
    364373    /*
    365374     * In the TB exit code path we cannot do regular register allocation.  Nor
     
    459468    IEMNATIVE_ASSERT_INSTR_BUF_ENSURE(pReNative, off);
    460469
     470#if defined(VBOX_WITH_STATISTICS) || defined(IEMNATIVE_WITH_TB_DEBUG_INFO)
     471    pReNative->PostponedEfl.cEmits++;
     472#endif
    461473    return off;
    462474}
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r106180 r106192  
    755755        REG_NATIVE_EFL_GROUP(shift,      Shift);
    756756#   undef REG_NATIVE_EFL_GROUP
     757
     758        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeEflPostponedEmits, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,
     759                        "Postponed EFLAGS calculation emits", "/IEM/CPU%u/re/NativeEFlags/ZZEmits", idCpu);
    757760
    758761        STAMR3RegisterF(pVM, &pVCpu->iem.s.StatNativeLivenessEflCfSkippable,    STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Skippable EFLAGS.CF updating",       "/IEM/CPU%u/re/NativeLivenessEFlags/CfSkippable", idCpu);
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r106179 r106192  
    13291329
    13301330/**
    1331  * Translation block debug info entry type.
    1332  */
    1333 typedef enum IEMTBDBGENTRYTYPE
    1334 {
    1335     kIemTbDbgEntryType_Invalid = 0,
    1336     /** The entry is for marking a native code position.
    1337      * Entries following this all apply to this position. */
    1338     kIemTbDbgEntryType_NativeOffset,
    1339     /** The entry is for a new guest instruction. */
    1340     kIemTbDbgEntryType_GuestInstruction,
    1341     /** Marks the start of a threaded call. */
    1342     kIemTbDbgEntryType_ThreadedCall,
    1343     /** Marks the location of a label. */
    1344     kIemTbDbgEntryType_Label,
    1345     /** Info about a host register shadowing a guest register. */
    1346     kIemTbDbgEntryType_GuestRegShadowing,
    1347 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
    1348     /** Info about a host SIMD register shadowing a guest SIMD register. */
    1349     kIemTbDbgEntryType_GuestSimdRegShadowing,
    1350 #endif
    1351 #ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING
    1352     /** Info about a delayed RIP update. */
    1353     kIemTbDbgEntryType_DelayedPcUpdate,
    1354 #endif
    1355 #if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)
    1356     /** Info about a shadowed guest register becoming dirty. */
    1357     kIemTbDbgEntryType_GuestRegDirty,
    1358     /** Info about register writeback/flush oepration. */
    1359     kIemTbDbgEntryType_GuestRegWriteback,
    1360 #endif
    1361     kIemTbDbgEntryType_End
    1362 } IEMTBDBGENTRYTYPE;
    1363 
    1364 /**
    1365  * Translation block debug info entry.
    1366  */
    1367 typedef union IEMTBDBGENTRY
    1368 {
    1369     /** Plain 32-bit view. */
    1370     uint32_t u;
    1371 
    1372     /** Generic view for getting at the type field. */
    1373     struct
    1374     {
    1375         /** IEMTBDBGENTRYTYPE */
    1376         uint32_t    uType : 4;
    1377         uint32_t    uTypeSpecific : 28;
    1378     } Gen;
    1379 
    1380     struct
    1381     {
    1382         /** kIemTbDbgEntryType_ThreadedCall1. */
    1383         uint32_t    uType      : 4;
    1384         /** Native code offset. */
    1385         uint32_t    offNative  : 28;
    1386     } NativeOffset;
    1387 
    1388     struct
    1389     {
    1390         /** kIemTbDbgEntryType_GuestInstruction. */
    1391         uint32_t    uType      : 4;
    1392         uint32_t    uUnused    : 4;
    1393         /** The IEM_F_XXX flags. */
    1394         uint32_t    fExec      : 24;
    1395     } GuestInstruction;
    1396 
    1397     struct
    1398     {
    1399         /* kIemTbDbgEntryType_ThreadedCall. */
    1400         uint32_t    uType       : 4;
    1401         /** Set if the call was recompiled to native code, clear if just calling
    1402          *  threaded function. */
    1403         uint32_t    fRecompiled : 1;
    1404         uint32_t    uUnused     : 11;
    1405         /** The threaded call number (IEMTHREADEDFUNCS). */
    1406         uint32_t    enmCall     : 16;
    1407     } ThreadedCall;
    1408 
    1409     struct
    1410     {
    1411         /* kIemTbDbgEntryType_Label. */
    1412         uint32_t    uType      : 4;
    1413         uint32_t    uUnused    : 4;
    1414         /** The label type (IEMNATIVELABELTYPE).   */
    1415         uint32_t    enmLabel   : 8;
    1416         /** The label data. */
    1417         uint32_t    uData      : 16;
    1418     } Label;
    1419 
    1420     struct
    1421     {
    1422         /* kIemTbDbgEntryType_GuestRegShadowing. */
    1423         uint32_t    uType         : 4;
    1424         uint32_t    uUnused       : 4;
    1425         /** The guest register being shadowed (IEMNATIVEGSTREG). */
    1426         uint32_t    idxGstReg     : 8;
    1427         /** The host new register number, UINT8_MAX if dropped. */
    1428         uint32_t    idxHstReg     : 8;
    1429         /** The previous host register number, UINT8_MAX if new.   */
    1430         uint32_t    idxHstRegPrev : 8;
    1431     } GuestRegShadowing;
    1432 
    1433 #ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
    1434     struct
    1435     {
    1436         /* kIemTbDbgEntryType_GuestSimdRegShadowing. */
    1437         uint32_t    uType             : 4;
    1438         uint32_t    uUnused           : 4;
    1439         /** The guest register being shadowed (IEMNATIVEGSTSIMDREG). */
    1440         uint32_t    idxGstSimdReg     : 8;
    1441         /** The host new register number, UINT8_MAX if dropped. */
    1442         uint32_t    idxHstSimdReg     : 8;
    1443         /** The previous host register number, UINT8_MAX if new.   */
    1444         uint32_t    idxHstSimdRegPrev : 8;
    1445     } GuestSimdRegShadowing;
    1446 #endif
    1447 
    1448 #ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING
    1449     struct
    1450     {
    1451         /* kIemTbDbgEntryType_DelayedPcUpdate. */
    1452         uint32_t    uType         : 4;
    1453         /** Number of instructions skipped. */
    1454         uint32_t    cInstrSkipped : 8;
    1455         /* The instruction offset added to the program counter. */
    1456         int32_t     offPc         : 20;
    1457     } DelayedPcUpdate;
    1458 #endif
    1459 
    1460 #if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)
    1461     struct
    1462     {
    1463         /* kIemTbDbgEntryType_GuestRegDirty. */
    1464         uint32_t    uType         : 4;
    1465         uint32_t    uUnused       : 11;
    1466         /** Flag whether this is about a SIMD (true) or general (false) register. */
    1467         uint32_t    fSimdReg      : 1;
    1468         /** The guest register index being marked as dirty. */
    1469         uint32_t    idxGstReg     : 8;
    1470         /** The host register number this register is shadowed in .*/
    1471         uint32_t    idxHstReg     : 8;
    1472     } GuestRegDirty;
    1473 
    1474     struct
    1475     {
    1476         /* kIemTbDbgEntryType_GuestRegWriteback. */
    1477         uint32_t    uType         : 4;
    1478         /** Flag whether this is about a SIMD (true) or general (false) register flush. */
    1479         uint32_t    fSimdReg      : 1;
    1480         /** The mask shift. */
    1481         uint32_t    cShift        : 2;
    1482         /** The guest register mask being written back. */
    1483         uint32_t    fGstReg       : 25;
    1484     } GuestRegWriteback;
    1485 #endif
    1486 
    1487 } IEMTBDBGENTRY;
    1488 AssertCompileSize(IEMTBDBGENTRY, sizeof(uint32_t));
    1489 /** Pointer to a debug info entry. */
    1490 typedef IEMTBDBGENTRY *PIEMTBDBGENTRY;
    1491 /** Pointer to a const debug info entry. */
    1492 typedef IEMTBDBGENTRY const *PCIEMTBDBGENTRY;
    1493 
    1494 /**
    1495  * Translation block debug info.
    1496  */
    1497 typedef struct IEMTBDBG
    1498 {
    1499     /** This is the flat PC corresponding to IEMTB::GCPhysPc. */
    1500     RTGCPTR         FlatPc;
    1501     /** Number of entries in aEntries. */
    1502     uint32_t        cEntries;
    1503     /** The offset of the last kIemTbDbgEntryType_NativeOffset record. */
    1504     uint32_t        offNativeLast;
    1505     /** Debug info entries. */
    1506     RT_FLEXIBLE_ARRAY_EXTENSION
    1507     IEMTBDBGENTRY   aEntries[RT_FLEXIBLE_ARRAY];
    1508 } IEMTBDBG;
    1509 /** Pointer to TB debug info. */
    1510 typedef IEMTBDBG *PIEMTBDBG;
    1511 /** Pointer to const TB debug info. */
    1512 typedef IEMTBDBG const *PCIEMTBDBG;
    1513 
    1514 
    1515 /**
    15161331 * Translation block.
    15171332 *
     
    15961411        /** Native recompilation debug info if enabled.
    15971412         * This is only generated by the native recompiler. */
    1598         PIEMTBDBG       pDbgInfo;
     1413        struct IEMTBDBG    *pDbgInfo;
    15991414        /** For threaded TBs and natives when debug info is disabled, this is the flat
    16001415         * PC corresponding to GCPhysPc. */
    1601         RTGCPTR         FlatPc;
     1416        RTGCPTR             FlatPc;
    16021417    };
    16031418
     
    23852200    STAMCOUNTER             StatNativeEflTotalShift;
    23862201
     2202    /** Native recompiler: Number of emits per postponement. */
     2203    STAMPROFILE             StatNativeEflPostponedEmits;
     2204
    23872205    /** Native recompiler: Number of opportunities to skip EFLAGS.CF updating. */
    23882206    STAMCOUNTER             StatNativeLivenessEflCfSkippable;
     
    25562374
    25572375#ifdef IEM_WITH_TLB_TRACE
    2558     uint64_t                au64Padding[5];
     2376    uint64_t                au64Padding[1];
    25592377#else
    2560     uint64_t                au64Padding[7];
     2378    uint64_t                au64Padding[3];
    25612379#endif
    25622380
  • trunk/src/VBox/VMM/include/IEMN8veRecompiler.h

    r106187 r106192  
    12321232
    12331233/**
     1234 * Translation block debug info entry type.
     1235 */
     1236typedef enum IEMTBDBGENTRYTYPE
     1237{
     1238    kIemTbDbgEntryType_Invalid = 0,
     1239    /** The entry is for marking a native code position.
     1240     * Entries following this all apply to this position. */
     1241    kIemTbDbgEntryType_NativeOffset,
     1242    /** The entry is for a new guest instruction. */
     1243    kIemTbDbgEntryType_GuestInstruction,
     1244    /** Marks the start of a threaded call. */
     1245    kIemTbDbgEntryType_ThreadedCall,
     1246    /** Marks the location of a label. */
     1247    kIemTbDbgEntryType_Label,
     1248    /** Info about a host register shadowing a guest register. */
     1249    kIemTbDbgEntryType_GuestRegShadowing,
     1250#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
     1251    /** Info about a host SIMD register shadowing a guest SIMD register. */
     1252    kIemTbDbgEntryType_GuestSimdRegShadowing,
     1253#endif
     1254#ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING
     1255    /** Info about a delayed RIP update. */
     1256    kIemTbDbgEntryType_DelayedPcUpdate,
     1257#endif
     1258#if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)
     1259    /** Info about a shadowed guest register becoming dirty. */
     1260    kIemTbDbgEntryType_GuestRegDirty,
     1261    /** Info about register writeback/flush oepration. */
     1262    kIemTbDbgEntryType_GuestRegWriteback,
     1263#endif
     1264#ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING
     1265    /** Info about a delayed EFLAGS calculation. */
     1266    kIemTbDbgEntryType_PostponedEFlagsCalc,
     1267#endif
     1268    kIemTbDbgEntryType_End
     1269} IEMTBDBGENTRYTYPE;
     1270
     1271/**
     1272 * Translation block debug info entry.
     1273 */
     1274typedef union IEMTBDBGENTRY
     1275{
     1276    /** Plain 32-bit view. */
     1277    uint32_t u;
     1278
     1279    /** Generic view for getting at the type field. */
     1280    struct
     1281    {
     1282        /** IEMTBDBGENTRYTYPE */
     1283        uint32_t    uType : 4;
     1284        uint32_t    uTypeSpecific : 28;
     1285    } Gen;
     1286
     1287    struct
     1288    {
     1289        /** kIemTbDbgEntryType_ThreadedCall1. */
     1290        uint32_t    uType      : 4;
     1291        /** Native code offset. */
     1292        uint32_t    offNative  : 28;
     1293    } NativeOffset;
     1294
     1295    struct
     1296    {
     1297        /** kIemTbDbgEntryType_GuestInstruction. */
     1298        uint32_t    uType      : 4;
     1299        uint32_t    uUnused    : 4;
     1300        /** The IEM_F_XXX flags. */
     1301        uint32_t    fExec      : 24;
     1302    } GuestInstruction;
     1303
     1304    struct
     1305    {
     1306        /* kIemTbDbgEntryType_ThreadedCall. */
     1307        uint32_t    uType       : 4;
     1308        /** Set if the call was recompiled to native code, clear if just calling
     1309         *  threaded function. */
     1310        uint32_t    fRecompiled : 1;
     1311        uint32_t    uUnused     : 11;
     1312        /** The threaded call number (IEMTHREADEDFUNCS). */
     1313        uint32_t    enmCall     : 16;
     1314    } ThreadedCall;
     1315
     1316    struct
     1317    {
     1318        /* kIemTbDbgEntryType_Label. */
     1319        uint32_t    uType      : 4;
     1320        uint32_t    uUnused    : 4;
     1321        /** The label type (IEMNATIVELABELTYPE).   */
     1322        uint32_t    enmLabel   : 8;
     1323        /** The label data. */
     1324        uint32_t    uData      : 16;
     1325    } Label;
     1326
     1327    struct
     1328    {
     1329        /* kIemTbDbgEntryType_GuestRegShadowing. */
     1330        uint32_t    uType         : 4;
     1331        uint32_t    uUnused       : 4;
     1332        /** The guest register being shadowed (IEMNATIVEGSTREG). */
     1333        uint32_t    idxGstReg     : 8;
     1334        /** The host new register number, UINT8_MAX if dropped. */
     1335        uint32_t    idxHstReg     : 8;
     1336        /** The previous host register number, UINT8_MAX if new.   */
     1337        uint32_t    idxHstRegPrev : 8;
     1338    } GuestRegShadowing;
     1339
     1340#ifdef IEMNATIVE_WITH_SIMD_REG_ALLOCATOR
     1341    struct
     1342    {
     1343        /* kIemTbDbgEntryType_GuestSimdRegShadowing. */
     1344        uint32_t    uType             : 4;
     1345        uint32_t    uUnused           : 4;
     1346        /** The guest register being shadowed (IEMNATIVEGSTSIMDREG). */
     1347        uint32_t    idxGstSimdReg     : 8;
     1348        /** The host new register number, UINT8_MAX if dropped. */
     1349        uint32_t    idxHstSimdReg     : 8;
     1350        /** The previous host register number, UINT8_MAX if new.   */
     1351        uint32_t    idxHstSimdRegPrev : 8;
     1352    } GuestSimdRegShadowing;
     1353#endif
     1354
     1355#ifdef IEMNATIVE_WITH_DELAYED_PC_UPDATING
     1356    struct
     1357    {
     1358        /* kIemTbDbgEntryType_DelayedPcUpdate. */
     1359        uint32_t    uType         : 4;
     1360        /** Number of instructions skipped. */
     1361        uint32_t    cInstrSkipped : 8;
     1362        /* The instruction offset added to the program counter. */
     1363        int32_t     offPc         : 20;
     1364    } DelayedPcUpdate;
     1365#endif
     1366
     1367#if defined(IEMNATIVE_WITH_DELAYED_REGISTER_WRITEBACK) || defined(IEMNATIVE_WITH_SIMD_REG_ALLOCATOR)
     1368    struct
     1369    {
     1370        /* kIemTbDbgEntryType_GuestRegDirty. */
     1371        uint32_t    uType         : 4;
     1372        uint32_t    uUnused       : 11;
     1373        /** Flag whether this is about a SIMD (true) or general (false) register. */
     1374        uint32_t    fSimdReg      : 1;
     1375        /** The guest register index being marked as dirty. */
     1376        uint32_t    idxGstReg     : 8;
     1377        /** The host register number this register is shadowed in .*/
     1378        uint32_t    idxHstReg     : 8;
     1379    } GuestRegDirty;
     1380
     1381    struct
     1382    {
     1383        /* kIemTbDbgEntryType_GuestRegWriteback. */
     1384        uint32_t    uType         : 4;
     1385        /** Flag whether this is about a SIMD (true) or general (false) register flush. */
     1386        uint32_t    fSimdReg      : 1;
     1387        /** The mask shift. */
     1388        uint32_t    cShift        : 2;
     1389        /** The guest register mask being written back. */
     1390        uint32_t    fGstReg       : 25;
     1391    } GuestRegWriteback;
     1392#endif
     1393
     1394#ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING
     1395    struct
     1396    {
     1397        /* kIemTbDbgEntryType_PostponedEFlagsCalc. */
     1398        uint32_t    uType         : 4;
     1399        /** The EFLAGS operation (IEMNATIVE_POSTPONED_EFL_OP_T). */
     1400        uint32_t    enmOp         : 4;
     1401        /** The mask shift. */
     1402        uint32_t    cOpBits       : 8;
     1403        /** The emit instance number (0-based). */
     1404        uint32_t    idxEmit       : 8;
     1405        /** Unused. */
     1406        uint32_t    uUnused       : 8;
     1407    } PostponedEflCalc;
     1408#endif
     1409} IEMTBDBGENTRY;
     1410AssertCompileSize(IEMTBDBGENTRY, sizeof(uint32_t));
     1411/** Pointer to a debug info entry. */
     1412typedef IEMTBDBGENTRY *PIEMTBDBGENTRY;
     1413/** Pointer to a const debug info entry. */
     1414typedef IEMTBDBGENTRY const *PCIEMTBDBGENTRY;
     1415
     1416/**
     1417 * Translation block debug info.
     1418 */
     1419typedef struct IEMTBDBG
     1420{
     1421    /** This is the flat PC corresponding to IEMTB::GCPhysPc. */
     1422    RTGCPTR         FlatPc;
     1423    /** Number of entries in aEntries. */
     1424    uint32_t        cEntries;
     1425    /** The offset of the last kIemTbDbgEntryType_NativeOffset record. */
     1426    uint32_t        offNativeLast;
     1427    /** Debug info entries. */
     1428    RT_FLEXIBLE_ARRAY_EXTENSION
     1429    IEMTBDBGENTRY   aEntries[RT_FLEXIBLE_ARRAY];
     1430} IEMTBDBG;
     1431/** Pointer to TB debug info. */
     1432typedef IEMTBDBG *PIEMTBDBG;
     1433/** Pointer to const TB debug info. */
     1434typedef IEMTBDBG const *PCIEMTBDBG;
     1435
     1436/**
    12341437 * Guest registers that can be shadowed in GPRs.
    12351438 *
     
    18472050         *  UINT8_MAX if not in use. */
    18482051        uint8_t                         idxReg2;
     2052# if defined(VBOX_WITH_STATISTICS) || defined(IEMNATIVE_WITH_TB_DEBUG_INFO)
     2053        /** Number of times the delayed calculation was emitted. */
     2054        uint8_t                         cEmits;
     2055# endif
    18492056    } PostponedEfl;
    18502057#endif
     
    20002207DECL_HIDDEN_THROW(void)     iemNativeDbgInfoAddDelayedPcUpdate(PIEMRECOMPILERSTATE pReNative,
    20012208                                                               uint64_t offPc, uint32_t cInstrSkipped);
     2209# ifdef IEMNATIVE_WITH_EFLAGS_POSTPONING
     2210DECL_HIDDEN_THROW(void)     iemNativeDbgInfoAddPostponedEFlagsCalc(PIEMRECOMPILERSTATE pReNative, uint32_t off,
     2211                                                                   IEMNATIVE_POSTPONED_EFL_OP_T enmOp, uint8_t cOpBits,
     2212                                                                   uint8_t idxInstance);
     2213# endif
    20022214#endif /* IEMNATIVE_WITH_TB_DEBUG_INFO */
    20032215
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