VirtualBox

Changeset 104151 in vbox


Ignore:
Timestamp:
Apr 4, 2024 9:29:59 AM (11 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
162573
Message:

VMM/IEM: Deal with iemNativeDbgInfoAddGuestRegWriteback assertion. bugref:10614

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

Legend:

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

    r104147 r104151  
    23912391DECL_HIDDEN_THROW(void) iemNativeDbgInfoAddGuestRegWriteback(PIEMRECOMPILERSTATE pReNative, bool fSimdReg, uint64_t fGstReg)
    23922392{
     2393    unsigned const cBitsGstRegMask = 25;
     2394    uint32_t const fGstRegMask     = RT_BIT_32(cBitsGstRegMask) - 1U;
     2395
     2396    /* The first block of 25 bits: */
     2397    if (fGstReg & fGstRegMask)
     2398    {
     2399        PIEMTBDBGENTRY const pEntry = iemNativeDbgInfoAddNewEntry(pReNative, pReNative->pDbgInfo);
     2400        pEntry->GuestRegWriteback.uType     = kIemTbDbgEntryType_GuestRegWriteback;
     2401        pEntry->GuestRegWriteback.fSimdReg  = fSimdReg ? 1 : 0;
     2402        pEntry->GuestRegWriteback.cShift    = 0;
     2403        pEntry->GuestRegWriteback.fGstReg   = (uint32_t)(fGstReg & fGstRegMask);
     2404        fGstReg &= ~(uint64_t)fGstRegMask;
     2405        if (!fGstReg)
     2406            return;
     2407    }
     2408
     2409    /* The second block of 25 bits: */
     2410    fGstReg >>= cBitsGstRegMask;
     2411    if (fGstReg & fGstRegMask)
     2412    {
     2413        PIEMTBDBGENTRY const pEntry = iemNativeDbgInfoAddNewEntry(pReNative, pReNative->pDbgInfo);
     2414        pEntry->GuestRegWriteback.uType     = kIemTbDbgEntryType_GuestRegWriteback;
     2415        pEntry->GuestRegWriteback.fSimdReg  = fSimdReg ? 1 : 0;
     2416        pEntry->GuestRegWriteback.cShift    = 0;
     2417        pEntry->GuestRegWriteback.fGstReg   = (uint32_t)(fGstReg & fGstRegMask);
     2418        fGstReg &= ~(uint64_t)fGstRegMask;
     2419        if (!fGstReg)
     2420            return;
     2421    }
     2422
     2423    /* The last block with 14 bits: */
     2424    fGstReg >>= cBitsGstRegMask;
     2425    Assert(fGstReg & fGstRegMask);
     2426    Assert((fGstReg & ~(uint64_t)fGstRegMask) == 0);
    23932427    PIEMTBDBGENTRY const pEntry = iemNativeDbgInfoAddNewEntry(pReNative, pReNative->pDbgInfo);
    2394     pEntry->GuestRegWriteback.uType         = kIemTbDbgEntryType_GuestRegWriteback;
    2395     pEntry->GuestRegWriteback.fSimdReg      = fSimdReg ? 1 : 0;
    2396     pEntry->GuestRegWriteback.fGstReg       = (uint32_t)fGstReg;
    2397     /** @todo r=aeichner Can't fit the whole register mask in the debug info entry, deal with it when it becomes necessary. */
    2398     Assert((uint64_t)pEntry->GuestRegWriteback.fGstReg == fGstReg);
     2428    pEntry->GuestRegWriteback.uType     = kIemTbDbgEntryType_GuestRegWriteback;
     2429    pEntry->GuestRegWriteback.fSimdReg  = fSimdReg ? 1 : 0;
     2430    pEntry->GuestRegWriteback.cShift    = 2;
     2431    pEntry->GuestRegWriteback.fGstReg   = (uint32_t)(fGstReg & fGstRegMask);
    23992432}
    24002433
     
    86398672                            pHlp->pfnPrintf(pHlp, "  Writing dirty %s registers (gst %#RX32)\n",
    86408673                                            pDbgInfo->aEntries[iDbgEntry].GuestRegWriteback.fSimdReg ? "SIMD" : "general",
    8641                                             pDbgInfo->aEntries[iDbgEntry].GuestRegWriteback.fGstReg);
     8674                                               (uint64_t)pDbgInfo->aEntries[iDbgEntry].GuestRegWriteback.fGstReg
     8675                                            << (pDbgInfo->aEntries[iDbgEntry].GuestRegWriteback.cShift * 25));
    86428676                            continue;
    86438677#endif
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r104150 r104151  
    11191119        /** Flag whether this is about a SIMD (true) or general (false) register flush. */
    11201120        uint32_t    fSimdReg      : 1;
     1121        /** The mask shift. */
     1122        uint32_t    cShift        : 2;
    11211123        /** The guest register mask being written back. */
    1122         uint32_t    fGstReg       : 27;
     1124        uint32_t    fGstReg       : 25;
    11231125    } GuestRegWriteback;
    11241126#endif
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