VirtualBox

Changeset 106310 in vbox


Ignore:
Timestamp:
Oct 14, 2024 3:17:55 PM (6 weeks ago)
Author:
vboxsync
Message:

VMM/IEM: Some more exec mem tweaking. bugref:10720

File:
1 edited

Legend:

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

    r106309 r106310  
    651651# ifdef RT_ARCH_AMD64
    652652                unsigned cZerosInWord = __popcnt64(~uWord);
     653# elif defined(RT_ARCH_ARM64)
     654                unsigned cZerosInWord = _CountOneBits64(~uWord);
    653655# else
    654656#  pragma message("need popcount intrinsic or something...") /** @todo port me: Win/ARM. */
     
    856858
    857859
    858 static PIEMNATIVEINSTR
    859 iemExecMemAllocatorAllocInChunk(PIEMEXECMEMALLOCATOR pExecMemAllocator, uint32_t idxChunk, uint32_t cbReq, PIEMTB pTb,
    860                                 PIEMNATIVEINSTR *ppaExec, PCIEMNATIVEPERCHUNKCTX *ppChunkCtx)
    861 {
    862     /*
    863      * Figure out how much to allocate.
    864      */
     860/**
     861 * Converts requested number of bytes into a unit count.
     862 */
     863DECL_FORCE_INLINE(uint32_t) iemExecMemAllocBytesToUnits(uint32_t cbReq)
     864{
    865865#ifdef IEMEXECMEM_ALT_SUB_WITH_ALLOC_HEADER
    866     uint32_t const cReqUnits = (cbReq + sizeof(IEMEXECMEMALLOCHDR) + IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SIZE - 1)
     866    return (cbReq + sizeof(IEMEXECMEMALLOCHDR) + IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SIZE - 1)
    867867#else
    868     uint32_t const cReqUnits = (cbReq + IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SIZE - 1)
    869 #endif
    870                             >> IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT;
     868    return (cbReq + IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SIZE - 1)
     869#endif
     870        >> IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT;
     871}
     872
     873
     874DECL_FORCE_INLINE(PIEMNATIVEINSTR)
     875iemExecMemAllocatorAllocUnitsInChunkInner(PIEMEXECMEMALLOCATOR pExecMemAllocator, uint32_t idxChunk, uint32_t cReqUnits,
     876                                          PIEMTB pTb, PIEMNATIVEINSTR *ppaExec, PCIEMNATIVEPERCHUNKCTX *ppChunkCtx)
     877{
     878    uint64_t * const pbmAlloc = &pExecMemAllocator->pbmAlloc[pExecMemAllocator->cBitmapElementsPerChunk * idxChunk];
     879    uint32_t const   idxHint  = pExecMemAllocator->aChunks[idxChunk].idxFreeHint & ~(uint32_t)63;
     880    if (idxHint + cReqUnits <= pExecMemAllocator->cUnitsPerChunk)
     881    {
     882        void *pvRet = iemExecMemAllocatorAllocInChunkInt(pExecMemAllocator, pbmAlloc, idxHint,
     883                                                         pExecMemAllocator->cUnitsPerChunk - idxHint,
     884                                                         cReqUnits, idxChunk, pTb, (void **)ppaExec, ppChunkCtx);
     885        if (pvRet)
     886            return (PIEMNATIVEINSTR)pvRet;
     887    }
     888    void *pvRet = iemExecMemAllocatorAllocInChunkInt(pExecMemAllocator, pbmAlloc, 0,
     889                                                     RT_MIN(pExecMemAllocator->cUnitsPerChunk,
     890                                                            RT_ALIGN_32(idxHint + cReqUnits, 64*4)),
     891                                                     cReqUnits, idxChunk, pTb, (void **)ppaExec, ppChunkCtx);
     892    if (!pvRet)
     893        pExecMemAllocator->cFruitlessChunkScans += 1;
     894    return (PIEMNATIVEINSTR)pvRet;
     895}
     896
     897
     898DECL_FORCE_INLINE(PIEMNATIVEINSTR)
     899iemExecMemAllocatorAllocUnitsInChunk(PIEMEXECMEMALLOCATOR pExecMemAllocator, uint32_t idxChunk, uint32_t cReqUnits, PIEMTB pTb,
     900                                     PIEMNATIVEINSTR *ppaExec, PCIEMNATIVEPERCHUNKCTX *ppChunkCtx)
     901{
    871902    if (cReqUnits <= pExecMemAllocator->aChunks[idxChunk].cFreeUnits)
    872     {
    873         uint64_t * const pbmAlloc = &pExecMemAllocator->pbmAlloc[pExecMemAllocator->cBitmapElementsPerChunk * idxChunk];
    874         uint32_t const   idxHint  = pExecMemAllocator->aChunks[idxChunk].idxFreeHint & ~(uint32_t)63;
    875         if (idxHint + cReqUnits <= pExecMemAllocator->cUnitsPerChunk)
    876         {
    877             void *pvRet = iemExecMemAllocatorAllocInChunkInt(pExecMemAllocator, pbmAlloc, idxHint,
    878                                                              pExecMemAllocator->cUnitsPerChunk - idxHint,
    879                                                              cReqUnits, idxChunk, pTb, (void **)ppaExec, ppChunkCtx);
    880             if (pvRet)
    881             {
    882 #ifdef VBOX_WITH_STATISTICS
    883                 pExecMemAllocator->cbUnusable += (cReqUnits << IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT) - cbReq;
    884 #endif
    885                 return (PIEMNATIVEINSTR)pvRet;
    886             }
    887         }
    888         void *pvRet = iemExecMemAllocatorAllocInChunkInt(pExecMemAllocator, pbmAlloc, 0,
    889                                                          RT_MIN(pExecMemAllocator->cUnitsPerChunk,
    890                                                                 RT_ALIGN_32(idxHint + cReqUnits, 64*4)),
    891                                                          cReqUnits, idxChunk, pTb, (void **)ppaExec, ppChunkCtx);
    892         if (!pvRet)
    893             pExecMemAllocator->cFruitlessChunkScans += 1;
    894 #ifdef VBOX_WITH_STATISTICS
    895         else
    896             pExecMemAllocator->cbUnusable += (cReqUnits << IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT) - cbReq;
    897 #endif
    898         return (PIEMNATIVEINSTR)pvRet;
    899     }
     903        return iemExecMemAllocatorAllocUnitsInChunkInner(pExecMemAllocator, idxChunk, cReqUnits, pTb, ppaExec, ppChunkCtx);
    900904    return NULL;
     905}
     906
     907
     908DECLINLINE(PIEMNATIVEINSTR)
     909iemExecMemAllocatorAllocBytesInChunk(PIEMEXECMEMALLOCATOR pExecMemAllocator, uint32_t idxChunk, uint32_t cbReq,
     910                                     PIEMNATIVEINSTR *ppaExec)
     911{
     912    return iemExecMemAllocatorAllocUnitsInChunk(pExecMemAllocator, idxChunk, iemExecMemAllocBytesToUnits(cbReq), NULL /*pTb*/,
     913                                                ppaExec, NULL /*ppChunkCtx*/);
    901914}
    902915
     
    924937    STAM_PROFILE_START(&pExecMemAllocator->StatAlloc, a);
    925938
     939    uint32_t const cReqUnits = iemExecMemAllocBytesToUnits(cbReq);
    926940    for (unsigned iIteration = 0;; iIteration++)
    927941    {
     
    932946            for (uint32_t idxChunk = idxChunkHint; idxChunk < cChunks; idxChunk++)
    933947            {
    934                 PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk, cbReq, pTb,
    935                                                                              ppaExec, ppChunkCtx);
     948                PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocUnitsInChunk(pExecMemAllocator, idxChunk, cReqUnits, pTb,
     949                                                                                  ppaExec, ppChunkCtx);
    936950                if (pRet)
    937951                {
    938952                    STAM_PROFILE_STOP(&pExecMemAllocator->StatAlloc, a);
     953#ifdef VBOX_WITH_STATISTICS
     954                    pExecMemAllocator->cbUnusable += (cReqUnits << IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT) - cbReq;
     955#endif
    939956                    return pRet;
    940957                }
     
    942959            for (uint32_t idxChunk = 0; idxChunk < idxChunkHint; idxChunk++)
    943960            {
    944                 PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk, cbReq, pTb,
    945                                                                              ppaExec, ppChunkCtx);
     961                PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocUnitsInChunk(pExecMemAllocator, idxChunk, cReqUnits, pTb,
     962                                                                                  ppaExec, ppChunkCtx);
    946963                if (pRet)
    947964                {
    948965                    STAM_PROFILE_STOP(&pExecMemAllocator->StatAlloc, a);
     966#ifdef VBOX_WITH_STATISTICS
     967                    pExecMemAllocator->cbUnusable += (cReqUnits << IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT) - cbReq;
     968#endif
    949969                    return pRet;
    950970                }
     
    961981
    962982            uint32_t const idxChunk = pExecMemAllocator->cChunks - 1;
    963             PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk, cbReq, pTb,
    964                                                                          ppaExec, ppChunkCtx);
     983            PIEMNATIVEINSTR const pRet = iemExecMemAllocatorAllocUnitsInChunk(pExecMemAllocator, idxChunk, cReqUnits, pTb,
     984                                                                              ppaExec, ppChunkCtx);
    965985            if (pRet)
    966986            {
    967987                STAM_PROFILE_STOP(&pExecMemAllocator->StatAlloc, a);
     988#ifdef VBOX_WITH_STATISTICS
     989                pExecMemAllocator->cbUnusable += (cReqUnits << IEMEXECMEM_ALT_SUB_ALLOC_UNIT_SHIFT) - cbReq;
     990#endif
    968991                return pRet;
    969992            }
     
    11971220    AssertReturn(idxChunk < pExecMemAllocator->cChunks, NULL);
    11981221    Assert(cbReq < _1M);
    1199     return iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk, cbReq, NULL /*pTb*/, ppaExec, NULL /*ppChunkCtx*/);
     1222    return iemExecMemAllocatorAllocBytesInChunk(pExecMemAllocator, idxChunk, cbReq, ppaExec);
    12001223}
    12011224
     
    12871310    unsigned const cbNeeded         = sizeof(IMAGE_RUNTIME_FUNCTION_ENTRY) * cFunctionEntries + cbUnwindInfo;
    12881311    PIMAGE_RUNTIME_FUNCTION_ENTRY const paFunctions
    1289         = (PIMAGE_RUNTIME_FUNCTION_ENTRY)iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk, cbNeeded, NULL, NULL, NULL);
     1312        = (PIMAGE_RUNTIME_FUNCTION_ENTRY)iemExecMemAllocatorAllocBytesInChunk(pExecMemAllocator, idxChunk, cbNeeded, NULL);
    12901313    AssertReturn(paFunctions, VERR_INTERNAL_ERROR_5);
    12911314    pExecMemAllocator->aChunks[idxChunk].pvUnwindInfo = paFunctions;
     
    15221545     * This seems to work best with ET_DYN.
    15231546     */
    1524     GDBJITSYMFILE * const pSymFile = (GDBJITSYMFILE *)iemExecMemAllocatorAllocInChunk(pExecMemAllocator, idxChunk,
    1525                                                                                       sizeof(GDBJITSYMFILE), NULL, NULL, NULL);
     1547    GDBJITSYMFILE * const pSymFile = (GDBJITSYMFILE *)iemExecMemAllocatorAllocBytesInChunk(pExecMemAllocator, idxChunk,
     1548                                                                                           sizeof(GDBJITSYMFILE), NULL);
    15261549    AssertReturn(pSymFile, VERR_INTERNAL_ERROR_5);
    15271550    unsigned const offSymFileInChunk = (uintptr_t)pSymFile - (uintptr_t)pvChunk;
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