Changeset 99899 in vbox for trunk/src/VBox/VMM
- Timestamp:
- May 22, 2023 12:43:21 PM (21 months ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMR3/DBGF.cpp
r99897 r99899 432 432 433 433 case EMSTATE_IEM: 434 case EMSTATE_RAW_OBSOLETE:435 case EMSTATE_IEM_THEN_REM:436 434 case EMSTATE_DEBUG_GUEST_IEM: 437 435 case EMSTATE_DEBUG_GUEST_RAW: -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r99897 r99899 565 565 || pVCpu->em.s.enmState == EMSTATE_IEM 566 566 || pVCpu->em.s.enmState == EMSTATE_RECOMPILER 567 /* obsolete stuff: */568 || pVCpu->em.s.enmState == EMSTATE_IEM_THEN_REM569 567 ? VINF_EM_RESCHEDULE 570 568 : VINF_SUCCESS; … … 693 691 case EMSTATE_DEBUG_HYPER: return "EMSTATE_DEBUG_HYPER"; 694 692 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"; 696 694 case EMSTATE_NEM: return "EMSTATE_NEM"; 697 695 case EMSTATE_DEBUG_GUEST_NEM: return "EMSTATE_DEBUG_GUEST_NEM"; … … 1152 1150 1153 1151 /** 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. 1222 1153 * 1223 1154 * @returns new EM state … … 1259 1190 * turns off monitoring features essential for raw mode! 1260 1191 */ 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 1262 1197 } 1263 1198 … … 2170 2105 else 2171 2106 pVCpu->em.s.enmState = emR3Reschedule(pVM, pVCpu); 2172 pVCpu->em.s.cIemThenRemInstructions = 0;2173 2107 Log(("EMR3ExecuteVM: enmState=%s\n", emR3GetStateName(pVCpu->em.s.enmState))); 2174 2108 … … 2239 2173 else 2240 2174 { 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; 2243 2177 } 2244 2178 } … … 2262 2196 case VINF_EM_RESCHEDULE_REM: 2263 2197 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; 2271 2201 break; 2272 2202 … … 2293 2223 EMSTATE enmState = emR3Reschedule(pVM, pVCpu); 2294 2224 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;2297 2225 pVCpu->em.s.enmState = enmState; 2298 2226 break; … … 2337 2265 EMSTATE enmState = emR3Reschedule(pVM, pVCpu); 2338 2266 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;2341 2267 pVCpu->em.s.enmState = enmState; 2342 2268 } … … 2490 2416 || enmNewState == EMSTATE_DEBUG_GUEST_NEM 2491 2417 || 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) ) 2495 2419 { 2496 2420 if (pVCpu->em.s.MWait.fWait & EMMWAIT_FLAG_ACTIVE) … … 2569 2493 } 2570 2494 fFFDone = false; 2571 break;2572 }2573 2574 /*2575 * Execute in IEM, hoping we can quickly switch aback to HM2576 * 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);2583 2495 break; 2584 2496 } … … 2725 2637 case EMSTATE_NONE: 2726 2638 case EMSTATE_RAW_OBSOLETE: 2639 case EMSTATE_IEM_THEN_REM_OBSOLETE: 2727 2640 case EMSTATE_TERMINATING: 2728 2641 default: -
trunk/src/VBox/VMM/include/EMInternal.h
r99897 r99899 158 158 159 159 /** 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]; 165 161 166 162 /** Start of the current time slice in ms. */
Note:
See TracChangeset
for help on using the changeset viewer.