Changeset 47807 in vbox
- Timestamp:
- Aug 16, 2013 12:54:26 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 88068
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/em.h
r47671 r47807 77 77 /** The VM has encountered a fatal error. (And everyone is panicing....) */ 78 78 EMSTATE_GURU_MEDITATION, 79 /** Executing in IEM, falling back on REM if we cannot switch back to HM or 80 * RAW after a short while. */ 81 EMSTATE_IEM_THEN_REM, 79 82 /** Just a hack to ensure that we get a 32-bit integer. */ 80 83 EMSTATE_MAKE_32BIT_HACK = 0x7fffffff -
trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h
r47752 r47807 1655 1655 FNIEMOP_STUB(iemOp_cvtpi2ps_Vps_Qpi__cvtpi2pd_Vpd_Qpi__cvtsi2ss_Vss_Ey__cvtsi2sd_Vsd_Ey); //NEXT 1656 1656 /** Opcode 0x0f 0x2b. */ 1657 FNIEMOP_STUB(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd); 1657 FNIEMOP_STUB(iemOp_movntps_Mps_Vps__movntpd_Mpd_Vpd); //NEXT:XP 1658 1658 /** Opcode 0x0f 0x2c. */ 1659 1659 FNIEMOP_STUB(iemOp_cvttps2pi_Ppi_Wps__cvttpd2pi_Ppi_Wpd__cvttss2si_Gy_Wss__cvttsd2si_Yu_Wsd); //NEXT -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r47788 r47807 161 161 { 162 162 PVMCPU pVCpu = &pVM->aCpus[i]; 163 164 pVCpu->em.s.offVMCPU = RT_OFFSETOF(VMCPU, em.s);165 163 166 164 pVCpu->em.s.enmState = (i == 0) ? EMSTATE_NONE : EMSTATE_WAIT_SIPI; … … 421 419 EM_REG_PROFILE(&pVCpu->em.s.StatHmExec, "/PROF/CPU%d/EM/HmExec", "Profiling Hardware Accelerated Mode execution."); 422 420 EM_REG_PROFILE(&pVCpu->em.s.StatIEMEmu, "/PROF/CPU%d/EM/IEMEmuSingle", "Profiling single instruction IEM execution."); 421 EM_REG_PROFILE(&pVCpu->em.s.StatIEMThenREM, "/PROF/CPU%d/EM/IEMThenRem", "Profiling IEM-then-REM instruction execution (by IEM)."); 423 422 EM_REG_PROFILE(&pVCpu->em.s.StatREMEmu, "/PROF/CPU%d/EM/REMEmuSingle", "Profiling single instruction REM execution."); 424 423 EM_REG_PROFILE(&pVCpu->em.s.StatREMExec, "/PROF/CPU%d/EM/REMExec", "Profiling REM execution."); … … 669 668 || pVCpu->em.s.enmState == EMSTATE_IEM 670 669 || pVCpu->em.s.enmState == EMSTATE_REM 670 || pVCpu->em.s.enmState == EMSTATE_IEM_THEN_REM 671 671 ? VINF_EM_RESCHEDULE 672 672 : VINF_SUCCESS; … … 778 778 case EMSTATE_DEBUG_HYPER: return "EMSTATE_DEBUG_HYPER"; 779 779 case EMSTATE_GURU_MEDITATION: return "EMSTATE_GURU_MEDITATION"; 780 case EMSTATE_IEM_THEN_REM: return "EMSTATE_IEM_THEN_REM"; 780 781 default: return "Unknown!"; 781 782 } … … 1249 1250 1250 1251 1252 static VBOXSTRICTRC emR3ExecuteIemThenRem(PVM pVM, PVMCPU pVCpu, bool *pfFFDone) 1253 { 1254 LogFlow(("emR3ExecuteIemThenRem: %04x:%RGv\n", CPUMGetGuestCS(pVCpu), CPUMGetGuestRIP(pVCpu))); 1255 *pfFFDone = false; 1256 1257 /* 1258 * Execute in IEM for a while. 1259 */ 1260 while (pVCpu->em.s.cIemThenRemInstructions < 1024) 1261 { 1262 VBOXSTRICTRC rcStrict = IEMExecLots(pVCpu); 1263 if (rcStrict != VINF_SUCCESS) 1264 { 1265 if ( rcStrict == VERR_IEM_ASPECT_NOT_IMPLEMENTED 1266 || rcStrict == VERR_IEM_INSTR_NOT_IMPLEMENTED) 1267 break; 1268 1269 pVCpu->em.s.cIemThenRemInstructions++; 1270 Log(("emR3ExecuteIemThenRem: returns %Rrc after %u instructions\n", 1271 VBOXSTRICTRC_VAL(rcStrict), pVCpu->em.s.cIemThenRemInstructions)); 1272 return rcStrict; 1273 } 1274 pVCpu->em.s.cIemThenRemInstructions++; 1275 1276 EMSTATE enmNewState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx); 1277 if (enmNewState != EMSTATE_REM && enmNewState != EMSTATE_IEM_THEN_REM) 1278 { 1279 LogFlow(("emR3ExecuteIemThenRem: -> %d (%s) after %u instructions\n", 1280 enmNewState, emR3GetStateName(enmNewState), pVCpu->em.s.cIemThenRemInstructions)); 1281 pVCpu->em.s.enmPrevState = pVCpu->em.s.enmState; 1282 pVCpu->em.s.enmState = enmNewState; 1283 return VINF_SUCCESS; 1284 } 1285 1286 /* 1287 * Check for pending actions. 1288 */ 1289 if ( VM_FF_IS_PENDING(pVM, VM_FF_ALL_REM_MASK) 1290 || VMCPU_FF_IS_PENDING(pVCpu, VMCPU_FF_ALL_REM_MASK)) 1291 return VINF_SUCCESS; 1292 } 1293 1294 /* 1295 * Switch to REM. 1296 */ 1297 Log(("emR3ExecuteIemThenRem: -> EMSTATE_REM (after %u instructions)\n", pVCpu->em.s.cIemThenRemInstructions)); 1298 pVCpu->em.s.enmState = EMSTATE_REM; 1299 return VINF_SUCCESS; 1300 } 1301 1302 1251 1303 /** 1252 1304 * Decides whether to execute RAW, HWACC or REM. … … 1295 1347 * turns off monitoring features essential for raw mode! 1296 1348 */ 1349 #ifdef VBOX_WITH_FIRST_IEM_STEP 1350 return EMSTATE_IEM_THEN_REM; 1351 #else 1297 1352 return EMSTATE_REM; 1353 #endif 1298 1354 } 1299 1355 … … 2058 2114 else 2059 2115 pVCpu->em.s.enmState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx); 2116 pVCpu->em.s.cIemThenRemInstructions = 0; 2060 2117 Log(("EMR3ExecuteVM: enmState=%s\n", emR3GetStateName(pVCpu->em.s.enmState))); 2061 2118 … … 2124 2181 */ 2125 2182 case VINF_EM_RESCHEDULE_REM: 2183 #ifdef VBOX_WITH_FIRST_IEM_STEP 2184 Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM); 2185 if (HMIsEnabled(pVM)) 2186 { 2187 Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_IEM_THEN_REM)\n", 2188 enmOldState, EMSTATE_IEM_THEN_REM)); 2189 if (pVCpu->em.s.enmState != EMSTATE_IEM_THEN_REM) 2190 { 2191 pVCpu->em.s.enmState = EMSTATE_IEM_THEN_REM; 2192 pVCpu->em.s.cIemThenRemInstructions = 0; 2193 } 2194 } 2195 else 2196 { 2197 Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n", enmOldState, EMSTATE_REM)); 2198 pVCpu->em.s.enmState = EMSTATE_REM; 2199 } 2200 #else 2126 2201 Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n", enmOldState, EMSTATE_REM)); 2127 2202 Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM); 2128 2203 pVCpu->em.s.enmState = EMSTATE_REM; 2204 #endif 2129 2205 break; 2130 2206 … … 2150 2226 EMSTATE enmState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx); 2151 2227 Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState))); 2228 if (pVCpu->em.s.enmState != enmState && enmState == EMSTATE_IEM_THEN_REM) 2229 pVCpu->em.s.cIemThenRemInstructions = 0; 2152 2230 pVCpu->em.s.enmState = enmState; 2153 2231 break; … … 2192 2270 EMSTATE enmState = emR3Reschedule(pVM, pVCpu, pVCpu->em.s.pCtx); 2193 2271 Log2(("EMR3ExecuteVM: VINF_EM_RESET: %d -> %d (%s)\n", enmOldState, enmState, emR3GetStateName(enmState))); 2272 if (pVCpu->em.s.enmState != enmState && enmState == EMSTATE_IEM_THEN_REM) 2273 pVCpu->em.s.cIemThenRemInstructions = 0; 2194 2274 pVCpu->em.s.enmState = enmState; 2195 2275 } … … 2328 2408 || enmNewState == EMSTATE_HM 2329 2409 || enmNewState == EMSTATE_REM 2410 || enmNewState == EMSTATE_IEM_THEN_REM 2330 2411 || enmNewState == EMSTATE_DEBUG_GUEST_RAW 2331 2412 || enmNewState == EMSTATE_DEBUG_GUEST_HM … … 2396 2477 } 2397 2478 fFFDone = false; 2479 break; 2480 } 2481 2482 /* 2483 * Execute in IEM, hoping we can quickly switch aback to HM 2484 * or RAW execution. If our hopes fail, we go to REM. 2485 */ 2486 case EMSTATE_IEM_THEN_REM: 2487 { 2488 STAM_PROFILE_START(&pVCpu->em.s.StatIEMThenREM, pIemThenRem); 2489 rc = VBOXSTRICTRC_TODO(emR3ExecuteIemThenRem(pVM, pVCpu, &fFFDone)); 2490 STAM_PROFILE_STOP(&pVCpu->em.s.StatIEMThenREM, pIemThenRem); 2398 2491 break; 2399 2492 } -
trunk/src/VBox/VMM/VMMR3/EMHM.cpp
r47790 r47807 206 206 # ifndef VBOX_WITH_FIRST_IEM_STEP 207 207 Log(("EMINS[rem]: %04x:%RGv RSP=%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp)); 208 # elif defined(DEBUG_bird)209 AssertFailed();208 //# elif defined(DEBUG_bird) 209 // AssertFailed(); 210 210 # endif 211 211 EMRemLock(pVM); -
trunk/src/VBox/VMM/include/EMInternal.h
r47788 r47807 337 337 typedef struct EMCPU 338 338 { 339 /** Offset to the VM structure.340 * See EMCPU2VM(). */341 RTUINT offVMCPU;342 343 339 /** Execution Manager State. */ 344 340 EMSTATE volatile enmState; … … 353 349 354 350 uint8_t u8Padding[3]; 351 352 /** The number of instructions we've executed in IEM since switching to the 353 * EMSTATE_IEM_THEN_REM state. */ 354 uint32_t cIemThenRemInstructions; 355 355 356 356 /** Inhibit interrupts for this instruction. Valid only when VM_FF_INHIBIT_INTERRUPTS is set. */ … … 413 413 STAMPROFILE StatHmExec; 414 414 STAMPROFILE StatIEMEmu; 415 STAMPROFILE StatIEMThenREM; 415 416 STAMPROFILE StatREMEmu; 416 417 STAMPROFILE StatREMExec; -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r46167 r47807 1333 1333 GEN_CHECK_OFF(VM, uCpuExecutionCap); 1334 1334 GEN_CHECK_OFF(VM, cbSelf); 1335 GEN_CHECK_OFF(VM, offVMCPU);1336 1335 GEN_CHECK_OFF(VM, pfnVMMRCToHostAsm); 1337 1336 GEN_CHECK_OFF(VM, pfnVMMRCToHostAsmNoReturn);
Note:
See TracChangeset
for help on using the changeset viewer.