VirtualBox

Changeset 72642 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Jun 21, 2018 3:41:14 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
123148
Message:

EM,IEM,VMX: Working on configuring exit history optimziations. Currently enabled in ring-0 for NEM but disabled for HM. bugref:9198

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

Legend:

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

    r72636 r72642  
    438438}
    439439
     440#ifndef IN_RC
    440441
    441442/**
     
    601602                                              PEMEXITENTRY pHistEntry, uint64_t uExitNo)
    602603{
     604# ifdef IN_RING0
     605    /* Disregard the preempt disabled flag. */
     606    uFlagsAndType &= ~EMEXIT_F_PREEMPT_DISABLED;
     607# endif
     608
    603609    /*
    604610     * Work the hash table.
    605611     */
    606612    AssertCompile(RT_ELEMENTS(pVCpu->em.s.aExitRecords) == 1024);
    607 #define EM_EXIT_RECORDS_IDX_MASK 0x3ff
     613# define EM_EXIT_RECORDS_IDX_MASK 0x3ff
    608614    uintptr_t  idxSlot  = ((uintptr_t)uFlatPC >> 1) & EM_EXIT_RECORDS_IDX_MASK;
    609615    PEMEXITREC pExitRec = &pVCpu->em.s.aExitRecords[idxSlot];
     
    733739}
    734740
     741#endif /* !IN_RC */
    735742
    736743/**
     
    761768    pHistEntry->idxSlot       = UINT32_MAX;
    762769
     770#ifndef IN_RC
    763771    /*
    764772     * If common exit type, we will insert/update the exit into the exit record hash table.
    765773     */
    766774    if (   (uFlagsAndType & (EMEXIT_F_KIND_MASK | EMEXIT_F_CS_EIP | EMEXIT_F_UNFLATTENED_PC)) == EMEXIT_F_KIND_EM
     775# ifdef IN_RING0
     776        && pVCpu->em.s.fExitOptimizationEnabledR0
     777        && ( !(uFlagsAndType & EMEXIT_F_PREEMPT_DISABLED) || pVCpu->em.s.fExitOptimizationEnabledR0PreemptDisabled)
     778# else
    767779        && pVCpu->em.s.fExitOptimizationEnabled
    768         && uFlatPC != UINT64_MAX)
     780# endif
     781        && uFlatPC != UINT64_MAX
     782       )
    769783        return emHistoryAddOrUpdateRecord(pVCpu, uFlagsAndType, uFlatPC, pHistEntry, uExitNo);
     784#endif
    770785    return NULL;
    771786}
     
    842857    pHistEntry->uFlagsAndType = uFlagsAndType | (pHistEntry->uFlagsAndType & (EMEXIT_F_CS_EIP | EMEXIT_F_UNFLATTENED_PC));
    843858
     859#ifndef IN_RC
    844860    /*
    845861     * If common exit type, we will insert/update the exit into the exit record hash table.
    846862     */
    847863    if (   (uFlagsAndType & (EMEXIT_F_KIND_MASK | EMEXIT_F_CS_EIP | EMEXIT_F_UNFLATTENED_PC)) == EMEXIT_F_KIND_EM
     864# ifdef IN_RING0
     865        && pVCpu->em.s.fExitOptimizationEnabledR0
     866        && ( !(uFlagsAndType & EMEXIT_F_PREEMPT_DISABLED) || pVCpu->em.s.fExitOptimizationEnabledR0PreemptDisabled)
     867# else
    848868        && pVCpu->em.s.fExitOptimizationEnabled
    849         && pHistEntry->uFlatPC != UINT64_MAX)
     869# endif
     870        && pHistEntry->uFlatPC != UINT64_MAX
     871       )
    850872        return emHistoryAddOrUpdateRecord(pVCpu, uFlagsAndType, pHistEntry->uFlatPC, pHistEntry, uExitNo);
     873#endif
    851874    return NULL;
    852875}
     
    879902    pHistEntry->uFlatPC       = uFlatPC;
    880903
     904#ifndef IN_RC
    881905    /*
    882906     * If common exit type, we will insert/update the exit into the exit record hash table.
    883907     */
    884908    if (   (uFlagsAndType & (EMEXIT_F_KIND_MASK | EMEXIT_F_CS_EIP | EMEXIT_F_UNFLATTENED_PC)) == EMEXIT_F_KIND_EM
    885         && pVCpu->em.s.fExitOptimizationEnabled)
     909# ifdef IN_RING0
     910        && pVCpu->em.s.fExitOptimizationEnabledR0
     911        && ( !(uFlagsAndType & EMEXIT_F_PREEMPT_DISABLED) || pVCpu->em.s.fExitOptimizationEnabledR0PreemptDisabled)
     912# else
     913        && pVCpu->em.s.fExitOptimizationEnabled
     914# endif
     915       )
    886916        return emHistoryAddOrUpdateRecord(pVCpu, uFlagsAndType, uFlatPC, pHistEntry, uExitNo);
     917#endif
    887918    return NULL;
    888919}
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r72607 r72642  
    1419314193#endif
    1419414194        {
    14195             uint32_t cInstructionSinceLastExit = 0;
     14195#ifdef IN_RING0
     14196            bool const fCheckPreemptionPending   = !RTThreadPreemptIsPossible() || !RTThreadPreemptIsEnabled(NIL_RTTHREAD);
     14197#endif
     14198            uint32_t   cInstructionSinceLastExit = 0;
    1419614199
    1419714200            /*
     
    1425814261                                {
    1425914262#ifdef IN_RING0
    14260                                     if (!RTThreadPreemptIsPending(NIL_RTTHREAD))
     14263                                    if (   !fCheckPreemptionPending
     14264                                        || !RTThreadPreemptIsPending(NIL_RTTHREAD))
    1426114265#endif
    1426214266                                    {
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