VirtualBox

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


Ignore:
Timestamp:
Sep 18, 2023 8:44:24 PM (16 months ago)
Author:
vboxsync
Message:

VMM/IEM: Experimental recompilation of threaded blocks into native code on linux.amd64. bugref:10370

File:
1 edited

Legend:

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

    r101096 r101163  
    140140                          "InitialTbCount value %u (%#x) is higher than the MaxTbCount value %u (%#x)",
    141141                          cInitialTbs, cInitialTbs, cMaxTbs, cMaxTbs);
    142 #endif
     142
     143    /** @cfgm{/IEM/MaxExecMem, uint64_t, 512 MiB}
     144     * Max executable memory for recompiled code per EMT. */
     145    uint64_t cbMaxExec = 0;
     146    rc = CFGMR3QueryU64Def(pIem, "MaxExecMem", &cbMaxExec, _512M);
     147    AssertLogRelRCReturn(rc, rc);
     148    if (cbMaxExec < _1M || cbMaxExec > 16*_1G64)
     149        return VMSetError(pVM, VERR_OUT_OF_RANGE, RT_SRC_POS,
     150                          "MaxExecMem value %'RU64 (%#RX64) is out of range (min %'RU64, max %'RU64)",
     151                          cbMaxExec, cbMaxExec, (uint64_t)_1M, 16*_1G64);
     152
     153    /** @cfgm{/IEM/ExecChunkSize, uint32_t, 0 (auto)}
     154     * The executable memory allocator chunk size. */
     155    uint32_t cbChunkExec = 0;
     156    rc = CFGMR3QueryU32Def(pIem, "ExecChunkSize", &cbChunkExec, 0);
     157    AssertLogRelRCReturn(rc, rc);
     158    if (cbChunkExec != 0 && cbChunkExec != UINT32_MAX && (cbChunkExec < _1M || cbChunkExec > _256M))
     159        return VMSetError(pVM, VERR_OUT_OF_RANGE, RT_SRC_POS,
     160                          "ExecChunkSize value %'RU32 (%#RX32) is out of range (min %'RU32, max %'RU32)",
     161                          cbChunkExec, cbChunkExec, _1M, _256M);
     162
     163    /** @cfgm{/IEM/InitialExecMemSize, uint64_t, 1}
     164     * The initial executable memory allocator size (per EMT).  The value is
     165     * rounded up to the nearest chunk size, so 1 byte means one chunk. */
     166    uint64_t cbInitialExec = 0;
     167    rc = CFGMR3QueryU64Def(pIem, "InitialExecMemSize", &cbInitialExec, 0);
     168    AssertLogRelRCReturn(rc, rc);
     169    if (cbInitialExec > cbMaxExec)
     170        return VMSetError(pVM, VERR_OUT_OF_RANGE, RT_SRC_POS,
     171                          "InitialExecMemSize value %'RU64 (%#RX64) is out of range (max %'RU64)",
     172                          cbInitialExec, cbInitialExec, cbMaxExec);
     173
     174#endif /* VBOX_WITH_IEM_RECOMPILER*/
    143175
    144176    /*
     
    228260     * the allocations.
    229261     */
    230     rc = VMR3ReqCallWait(pVM, VMCPUID_ALL, (PFNRT)iemTbInit, 3, pVM, cInitialTbs, cMaxTbs);
     262    rc = VMR3ReqCallWait(pVM, VMCPUID_ALL, (PFNRT)iemTbInit, 6,
     263                         pVM, cInitialTbs, cMaxTbs, cbInitialExec, cbMaxExec, cbChunkExec);
    231264    AssertLogRelRCReturn(rc, rc);
    232265#endif
     
    286319
    287320#ifdef VBOX_WITH_IEM_RECOMPILER
    288         STAMR3RegisterF(pVM, (void *)&pVCpu->iem.s.cTbExec,             STAMTYPE_U64_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
    289                         "Executed translation block",                   "/IEM/CPU%u/re/cTbExec", idCpu);
     321        STAMR3RegisterF(pVM, (void *)&pVCpu->iem.s.cTbExecNative,       STAMTYPE_U64_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     322                        "Executed native translation block",            "/IEM/CPU%u/re/cTbExecNative", idCpu);
     323        STAMR3RegisterF(pVM, (void *)&pVCpu->iem.s.cTbExecThreaded,     STAMTYPE_U64_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT,
     324                        "Executed threaded translation block",          "/IEM/CPU%u/re/cTbExecThreaded", idCpu);
    290325        STAMR3RegisterF(pVM, (void *)&pVCpu->iem.s.StatTbExecBreaks,    STAMTYPE_COUNTER,   STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES,
    291326                        "Times TB execution was interrupted/broken off", "/IEM/CPU%u/re/cTbExecBreaks", idCpu);
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