VirtualBox

Changeset 99899 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
May 22, 2023 12:43:21 PM (21 months ago)
Author:
vboxsync
Message:

VMM/EM,DBGF: Removed the EMSTATE_IEM_THEN_REM stuff as it makes no sense without the old REM. bugref:10369

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

Legend:

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

    r99897 r99899  
    432432
    433433        case EMSTATE_IEM:
    434         case EMSTATE_RAW_OBSOLETE:
    435         case EMSTATE_IEM_THEN_REM:
    436434        case EMSTATE_DEBUG_GUEST_IEM:
    437435        case EMSTATE_DEBUG_GUEST_RAW:
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r99897 r99899  
    565565           || pVCpu->em.s.enmState == EMSTATE_IEM
    566566           || pVCpu->em.s.enmState == EMSTATE_RECOMPILER
    567            /* obsolete stuff: */
    568            || pVCpu->em.s.enmState == EMSTATE_IEM_THEN_REM
    569567         ? VINF_EM_RESCHEDULE
    570568         : VINF_SUCCESS;
     
    693691        case EMSTATE_DEBUG_HYPER:               return "EMSTATE_DEBUG_HYPER";
    694692        case EMSTATE_GURU_MEDITATION:           return "EMSTATE_GURU_MEDITATION";
    695         case EMSTATE_IEM_THEN_REM:              return "EMSTATE_IEM_THEN_REM";
     693        case EMSTATE_IEM_THEN_REM_OBSOLETE:     return "EMSTATE_IEM_THEN_REM_OBSOLETE";
    696694        case EMSTATE_NEM:                       return "EMSTATE_NEM";
    697695        case EMSTATE_DEBUG_GUEST_NEM:           return "EMSTATE_DEBUG_GUEST_NEM";
     
    11521150
    11531151/**
    1154  * Try execute the problematic code in IEM first, then fall back on REM if there
    1155  * is too much of it or if IEM doesn't implement something.
    1156  *
    1157  * @returns Strict VBox status code from IEMExecLots.
    1158  * @param   pVM        The cross context VM structure.
    1159  * @param   pVCpu       The cross context virtual CPU structure of the calling EMT.
    1160  * @param   pfFFDone    Force flags done indicator.
    1161  *
    1162  * @thread  EMT(pVCpu)
    1163  */
    1164 static VBOXSTRICTRC emR3ExecuteIemThenRem(PVM pVM, PVMCPU pVCpu, bool *pfFFDone)
    1165 {
    1166 #if defined(VBOX_VMM_TARGET_ARMV8)
    1167     LogFlow(("emR3ExecuteIemThenRem: %RGv\n", CPUMGetGuestFlatPC(pVCpu)));
    1168 #else
    1169     LogFlow(("emR3ExecuteIemThenRem: %04x:%RGv\n", CPUMGetGuestCS(pVCpu), CPUMGetGuestRIP(pVCpu)));
    1170 #endif
    1171     *pfFFDone = false;
    1172 
    1173     /*
    1174      * Execute in IEM for a while.
    1175      */
    1176     while (pVCpu->em.s.cIemThenRemInstructions < 1024)
    1177     {
    1178         uint32_t     cInstructions;
    1179         VBOXSTRICTRC rcStrict = IEMExecLots(pVCpu, 1024 - pVCpu->em.s.cIemThenRemInstructions /*cMaxInstructions*/,
    1180                                             UINT32_MAX/2 /*cPollRate*/, &cInstructions);
    1181         pVCpu->em.s.cIemThenRemInstructions += cInstructions;
    1182         if (rcStrict != VINF_SUCCESS)
    1183         {
    1184             if (   rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED
    1185                 || rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED)
    1186                 break;
    1187 
    1188             Log(("emR3ExecuteIemThenRem: returns %Rrc after %u instructions\n",
    1189                  VBOXSTRICTRC_VAL(rcStrict), pVCpu->em.s.cIemThenRemInstructions));
    1190             return rcStrict;
    1191         }
    1192 
    1193         EMSTATE enmNewState = emR3Reschedule(pVM, pVCpu);
    1194         if (enmNewState != EMSTATE_RECOMPILER && enmNewState != EMSTATE_IEM_THEN_REM)
    1195         {
    1196             LogFlow(("emR3ExecuteIemThenRem: -> %d (%s) after %u instructions\n",
    1197                      enmNewState, emR3GetStateName(enmNewState), pVCpu->em.s.cIemThenRemInstructions));
    1198             pVCpu->em.s.enmPrevState = pVCpu->em.s.enmState;
    1199             pVCpu->em.s.enmState     = enmNewState;
    1200             return VINF_SUCCESS;
    1201         }
    1202 
    1203         /*
    1204          * Check for pending actions.
    1205          */
    1206         if (   VM_FF_IS_ANY_SET(pVM, VM_FF_ALL_REM_MASK)
    1207             || VMCPU_FF_IS_ANY_SET(pVCpu, VMCPU_FF_ALL_REM_MASK & ~VMCPU_FF_UNHALT))
    1208             return VINF_SUCCESS;
    1209     }
    1210 
    1211     /*
    1212      * Switch to REM.
    1213      */
    1214     Log(("emR3ExecuteIemThenRem: -> EMSTATE_RECOMPILER (after %u instructions)\n", pVCpu->em.s.cIemThenRemInstructions));
    1215     pVCpu->em.s.enmState = EMSTATE_RECOMPILER;
    1216     return VINF_SUCCESS;
    1217 }
    1218 
    1219 
    1220 /**
    1221  * Decides whether to execute RAW, HWACC or REM.
     1152 * Decides whether to execute HM, NEM, IEM/interpreter or IEM/recompiler.
    12221153 *
    12231154 * @returns new EM state
     
    12591190     *       turns off monitoring features essential for raw mode!
    12601191     */
    1261     return EMSTATE_IEM_THEN_REM;
     1192#ifdef VBOX_WITH_IEM_RECOMPILER
     1193    return pVM->em.s.fIemRecompiled ? EMSTATE_RECOMPILER : EMSTATE_IEM;
     1194#else
     1195    return EMSTATE_IEM;
     1196#endif
    12621197}
    12631198
     
    21702105        else
    21712106            pVCpu->em.s.enmState = emR3Reschedule(pVM, pVCpu);
    2172         pVCpu->em.s.cIemThenRemInstructions = 0;
    21732107        Log(("EMR3ExecuteVM: enmState=%s\n", emR3GetStateName(pVCpu->em.s.enmState)));
    21742108
     
    22392173                        else
    22402174                        {
    2241                             Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_HM: %d -> %d (EMSTATE_IEM_THEN_REM)\n", enmOldState, EMSTATE_IEM_THEN_REM));
    2242                             pVCpu->em.s.enmState = EMSTATE_IEM_THEN_REM;
     2175                            Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_HM: %d -> %d (EMSTATE_RECOMPILER)\n", enmOldState, EMSTATE_RECOMPILER));
     2176                            pVCpu->em.s.enmState = EMSTATE_RECOMPILER;
    22432177                        }
    22442178                    }
     
    22622196                case VINF_EM_RESCHEDULE_REM:
    22632197                    Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM);
    2264                     Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_IEM_THEN_REM)\n",
    2265                           enmOldState, EMSTATE_IEM_THEN_REM));
    2266                     if (pVCpu->em.s.enmState != EMSTATE_IEM_THEN_REM)
    2267                     {
    2268                         pVCpu->em.s.enmState = EMSTATE_IEM_THEN_REM;
    2269                         pVCpu->em.s.cIemThenRemInstructions = 0;
    2270                     }
     2198                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n",
     2199                          enmOldState, EMSTATE_RECOMPILER));
     2200                    pVCpu->em.s.enmState = EMSTATE_RECOMPILER;
    22712201                    break;
    22722202
     
    22932223                    EMSTATE enmState = emR3Reschedule(pVM, pVCpu);
    22942224                    Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState)));
    2295                     if (pVCpu->em.s.enmState != enmState && enmState == EMSTATE_IEM_THEN_REM)
    2296                         pVCpu->em.s.cIemThenRemInstructions = 0;
    22972225                    pVCpu->em.s.enmState = enmState;
    22982226                    break;
     
    23372265                        EMSTATE enmState = emR3Reschedule(pVM, pVCpu);
    23382266                        Log2(("EMR3ExecuteVM: VINF_EM_RESET: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState)));
    2339                         if (pVCpu->em.s.enmState != enmState && enmState == EMSTATE_IEM_THEN_REM)
    2340                             pVCpu->em.s.cIemThenRemInstructions = 0;
    23412267                        pVCpu->em.s.enmState = enmState;
    23422268                    }
     
    24902416                        || enmNewState == EMSTATE_DEBUG_GUEST_NEM
    24912417                        || enmNewState == EMSTATE_DEBUG_GUEST_IEM
    2492                         || enmNewState == EMSTATE_DEBUG_GUEST_RECOMPILER
    2493                         /* Obsolete stuff: */
    2494                         || enmNewState == EMSTATE_IEM_THEN_REM ) )
     2418                        || enmNewState == EMSTATE_DEBUG_GUEST_RECOMPILER) )
    24952419                {
    24962420                    if (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE)
     
    25692493                    }
    25702494                    fFFDone = false;
    2571                     break;
    2572                 }
    2573 
    2574                 /*
    2575                  * Execute in IEM, hoping we can quickly switch aback to HM
    2576                  * or RAW execution.  If our hopes fail, we go to REM.
    2577                  */
    2578                 case EMSTATE_IEM_THEN_REM:
    2579                 {
    2580                     STAM_PROFILE_START(&pVCpu->em.s.StatIEMThenREM, pIemThenRem);
    2581                     rc = VBOXSTRICTRC_TODO(emR3ExecuteIemThenRem(pVM, pVCpu, &fFFDone));
    2582                     STAM_PROFILE_STOP(&pVCpu->em.s.StatIEMThenREM, pIemThenRem);
    25832495                    break;
    25842496                }
     
    27252637                case EMSTATE_NONE:
    27262638                case EMSTATE_RAW_OBSOLETE:
     2639                case EMSTATE_IEM_THEN_REM_OBSOLETE:
    27272640                case EMSTATE_TERMINATING:
    27282641                default:
  • trunk/src/VBox/VMM/include/EMInternal.h

    r99897 r99899  
    158158
    159159    /** Explicit padding. */
    160     uint8_t                 abPadding0[3];
    161 
    162     /** The number of instructions we've executed in IEM since switching to the
    163      *  EMSTATE_IEM_THEN_REM state. */
    164     uint32_t                cIemThenRemInstructions;
     160    uint8_t                 abPadding0[7];
    165161
    166162    /** Start of the current time slice in ms. */
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