VirtualBox

Changeset 96745 in vbox


Ignore:
Timestamp:
Sep 15, 2022 11:35:07 AM (3 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153632
Message:

VMM/IEM: Some micro optimizations around iemHandleNestedInstructionBoundaryFFs. bugref:10092

File:
1 edited

Legend:

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

    r96744 r96745  
    96879687     * problematic because of the setjmp/longjmp clobbering above.
    96889688     */
    9689     if (   rcStrict == VINF_SUCCESS
    9690         && VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
    9691                                     | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW))
     9689    if (   !VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
     9690                                     | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW)
     9691        || rcStrict != VINF_SUCCESS)
     9692    { /* likely */ }
     9693    else
    96929694        rcStrict = iemHandleNestedInstructionBoundaryFFs(pVCpu, rcStrict);
    96939695#endif
     
    97249726                pVCpu->iem.s.cInstructions++;
    97259727#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    9726                 if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
    9727                                              | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW))
     9728                if (!VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
     9729                                              | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW))
     9730                { /* likely */ }
     9731                else
    97289732                    rcStrict = iemHandleNestedInstructionBoundaryFFs(pVCpu, rcStrict);
    97299733#endif
     
    1005610060                    Assert(pVCpu->iem.s.cActiveMappings == 0);
    1005710061                    pVCpu->iem.s.cInstructions++;
     10062
    1005810063#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    1005910064                    /* Perform any VMX nested-guest instruction boundary actions. */
    10060                     if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
    10061                                                  | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW))
     10065                    uint64_t fCpu = pVCpu->fLocalForcedActions;
     10066                    if (!(fCpu & (  VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
     10067                                  | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW)))
     10068                    { /* likely */ }
     10069                    else
     10070                    {
    1006210071                        rcStrict = iemHandleNestedInstructionBoundaryFFs(pVCpu, rcStrict);
     10072                        if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     10073                            fCpu = pVCpu->fLocalForcedActions;
     10074                        else
     10075                        {
     10076                            rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
     10077                            break;
     10078                        }
     10079                    }
    1006310080#endif
    10064                     if (   RT_LIKELY(rcStrict == VINF_SUCCESS)
    10065                         && RT_LIKELY(pVCpu->iem.s.rcPassUp == VINF_SUCCESS))
     10081                    if (RT_LIKELY(pVCpu->iem.s.rcPassUp == VINF_SUCCESS))
    1006610082                    {
    10067                         uint64_t fCpu = pVCpu->fLocalForcedActions
    10068                                       & ( VMCPU_FF_ALL_MASK & ~(  VMCPU_FF_PGM_SYNC_CR3
    10069                                                                 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
    10070                                                                 | VMCPU_FF_TLB_FLUSH
    10071                                                                 | VMCPU_FF_INHIBIT_INTERRUPTS
    10072                                                                 | VMCPU_FF_BLOCK_NMIS
    10073                                                                 | VMCPU_FF_UNHALT ));
     10083#ifndef VBOX_WITH_NESTED_HWVIRT_VMX
     10084                        uint64_t fCpu = pVCpu->fLocalForcedActions;
     10085#endif
     10086                        fCpu &= VMCPU_FF_ALL_MASK & ~(  VMCPU_FF_PGM_SYNC_CR3
     10087                                                      | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
     10088                                                      | VMCPU_FF_TLB_FLUSH
     10089                                                      | VMCPU_FF_INHIBIT_INTERRUPTS
     10090                                                      | VMCPU_FF_BLOCK_NMIS
     10091                                                      | VMCPU_FF_UNHALT );
    1007410092
    1007510093                        if (RT_LIKELY(   (   !fCpu
     
    1009410112                }
    1009510113                else if (pVCpu->iem.s.cActiveMappings > 0)
    10096                         iemMemRollback(pVCpu);
     10114                    iemMemRollback(pVCpu);
    1009710115                rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
    1009810116                break;
     
    1022410242                    pStats->cInstructions++;
    1022510243                    cInstructionSinceLastExit++;
     10244
    1022610245#ifdef VBOX_WITH_NESTED_HWVIRT_VMX
    1022710246                    /* Perform any VMX nested-guest instruction boundary actions. */
    10228                     if (VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
    10229                                                  | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW))
     10247                    uint64_t fCpu = pVCpu->fLocalForcedActions;
     10248                    if (!(fCpu & (  VMCPU_FF_VMX_APIC_WRITE | VMCPU_FF_VMX_MTF | VMCPU_FF_VMX_PREEMPT_TIMER
     10249                                  | VMCPU_FF_VMX_INT_WINDOW | VMCPU_FF_VMX_NMI_WINDOW)))
     10250                    { /* likely */ }
     10251                    else
     10252                    {
    1023010253                        rcStrict = iemHandleNestedInstructionBoundaryFFs(pVCpu, rcStrict);
     10254                        if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     10255                            fCpu = pVCpu->fLocalForcedActions;
     10256                        else
     10257                        {
     10258                            rcStrict = iemExecStatusCodeFiddling(pVCpu, rcStrict);
     10259                            break;
     10260                        }
     10261                    }
    1023110262#endif
    10232                     if (   RT_LIKELY(rcStrict == VINF_SUCCESS)
    10233                         && RT_LIKELY(pVCpu->iem.s.rcPassUp == VINF_SUCCESS))
     10263                    if (RT_LIKELY(pVCpu->iem.s.rcPassUp == VINF_SUCCESS))
    1023410264                    {
    10235                         uint64_t fCpu = pVCpu->fLocalForcedActions
    10236                                       & ( VMCPU_FF_ALL_MASK & ~(  VMCPU_FF_PGM_SYNC_CR3
    10237                                                                 | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
    10238                                                                 | VMCPU_FF_TLB_FLUSH
    10239                                                                 | VMCPU_FF_INHIBIT_INTERRUPTS
    10240                                                                 | VMCPU_FF_BLOCK_NMIS
    10241                                                                 | VMCPU_FF_UNHALT ));
    10242 
     10265#ifndef VBOX_WITH_NESTED_HWVIRT_VMX
     10266                        uint64_t fCpu = pVCpu->fLocalForcedActions;
     10267#endif
     10268                        fCpu &= VMCPU_FF_ALL_MASK & ~(  VMCPU_FF_PGM_SYNC_CR3
     10269                                                      | VMCPU_FF_PGM_SYNC_CR3_NON_GLOBAL
     10270                                                      | VMCPU_FF_TLB_FLUSH
     10271                                                      | VMCPU_FF_INHIBIT_INTERRUPTS
     10272                                                      | VMCPU_FF_BLOCK_NMIS
     10273                                                      | VMCPU_FF_UNHALT );
    1024310274                        if (RT_LIKELY(   (   (   !fCpu
    1024410275                                              || (   !(fCpu & ~(VMCPU_FF_INTERRUPT_APIC | VMCPU_FF_INTERRUPT_PIC))
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