- Timestamp:
- May 25, 2015 4:09:01 PM (10 years ago)
- Location:
- trunk/src/VBox/VMM
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/Makefile.kmk
r55966 r56064 33 33 # Can be prepended to by setting it in LocalConfig.kmk 34 34 VMM_COMMON_DEFS ?= VBOX_IN_VMM 35 ifdef VBOX_WITH_ FIRST_IEM_STEP36 VMM_COMMON_DEFS += VBOX_WITH_ FIRST_IEM_STEP35 ifdef VBOX_WITH_2ND_IEM_STEP 36 VMM_COMMON_DEFS += VBOX_WITH_2ND_IEM_STEP 37 37 endif 38 38 #ifdef VBOX_WITH_IEM -
trunk/src/VBox/VMM/VMMAll/IOMAllMMIO.cpp
r56063 r56064 2231 2231 2232 2232 2233 #if !defined(VBOX_WITH_FIRST_IEM_STEP) || defined(IN_RC)/* Latter for IOMRCIOPortHandler */2233 #ifdef IN_RC /* Latter for IOMRCIOPortHandler */ 2234 2234 /** 2235 2235 * [REP*] INSB/INSW/INSD … … 2274 2274 return IOMInterpretINSEx(pVM, pVCpu, pRegFrame, Port, pCpu->fPrefix, (DISCPUMODE)pCpu->uAddrMode, cb); 2275 2275 } 2276 #endif /* !IEM ||RC */2276 #endif /* RC */ 2277 2277 2278 2278 … … 2400 2400 2401 2401 2402 #if !defined(VBOX_WITH_FIRST_IEM_STEP) || defined(IN_RC)/* Latter for IOMRCIOPortHandler */2402 #ifdef IN_RC /* Latter for IOMRCIOPortHandler */ 2403 2403 /** 2404 2404 * [REP*] OUTSB/OUTSW/OUTSD … … 2445 2445 return IOMInterpretOUTSEx(pVM, pVCpu, pRegFrame, Port, pCpu->fPrefix, (DISCPUMODE)pCpu->uAddrMode, cb); 2446 2446 } 2447 #endif /* !IEM ||RC */2447 #endif /* RC */ 2448 2448 2449 2449 #ifndef IN_RC -
trunk/src/VBox/VMM/VMMR3/EM.cpp
r55036 r56064 387 387 388 388 EM_REG_COUNTER_USED(&pStats->StatIoRestarted, "/EM/CPU%d/R3/PrivInst/IoRestarted", "I/O instructions restarted in ring-3."); 389 # ifdef VBOX_WITH_FIRST_IEM_STEP390 389 EM_REG_COUNTER_USED(&pStats->StatIoIem, "/EM/CPU%d/R3/PrivInst/IoIem", "I/O instructions end to IEM in ring-3."); 391 # else392 EM_REG_COUNTER_USED(&pStats->StatIn, "/EM/CPU%d/R3/PrivInst/In", "Number of in instructions.");393 EM_REG_COUNTER_USED(&pStats->StatOut, "/EM/CPU%d/R3/PrivInst/Out", "Number of out instructions.");394 # endif395 390 EM_REG_COUNTER_USED(&pStats->StatCli, "/EM/CPU%d/R3/PrivInst/Cli", "Number of cli instructions."); 396 391 EM_REG_COUNTER_USED(&pStats->StatSti, "/EM/CPU%d/R3/PrivInst/Sti", "Number of sli instructions."); … … 1366 1361 * turns off monitoring features essential for raw mode! 1367 1362 */ 1368 #ifdef VBOX_WITH_FIRST_IEM_STEP1369 1363 return EMSTATE_IEM_THEN_REM; 1370 #else1371 return EMSTATE_REM;1372 #endif1373 1364 } 1374 1365 … … 2215 2206 */ 2216 2207 case VINF_EM_RESCHEDULE_REM: 2217 #ifdef VBOX_WITH_FIRST_IEM_STEP2218 2208 Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM); 2219 2209 if (HMIsEnabled(pVM)) … … 2232 2222 pVCpu->em.s.enmState = EMSTATE_REM; 2233 2223 } 2234 #else2235 Log2(("EMR3ExecuteVM: VINF_EM_RESCHEDULE_REM: %d -> %d (EMSTATE_REM)\n", enmOldState, EMSTATE_REM));2236 Assert(!pVM->em.s.fIemExecutesAll || pVCpu->em.s.enmState != EMSTATE_IEM);2237 pVCpu->em.s.enmState = EMSTATE_REM;2238 #endif2239 2224 break; 2240 2225 -
trunk/src/VBox/VMM/VMMR3/EMHM.cpp
r47807 r56064 193 193 * Once IEM gets mature enough, nothing should ever fall back. 194 194 */ 195 #if defined(VBOX_WITH_FIRST_IEM_STEP) || !defined(VBOX_WITH_REM)196 195 STAM_PROFILE_START(&pVCpu->em.s.StatIEMEmu, a); 197 196 rc = VBOXSTRICTRC_TODO(IEMExecOne(pVCpu)); … … 200 199 if ( rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED 201 200 || rc == VERR_IEM_INSTR_NOT_IMPLEMENTED) 202 #endif203 201 { 204 202 #ifdef VBOX_WITH_REM 205 203 STAM_PROFILE_START(&pVCpu->em.s.StatREMEmu, b); 206 # ifndef VBOX_WITH_FIRST_IEM_STEP207 Log(("EMINS[rem]: %04x:%RGv RSP=%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp));208 //# elif defined(DEBUG_bird)209 // AssertFailed();210 # endif211 204 EMRemLock(pVM); 212 205 /* Flush the recompiler TLB if the VCPU has changed. */ … … 277 270 RT_SUCCESS_NP(rcStrict) ? VERR_IPE_UNEXPECTED_INFO_STATUS : VBOXSTRICTRC_TODO(rcStrict)); 278 271 279 #ifdef VBOX_WITH_FIRST_IEM_STEP280 272 /* 281 273 * Hand it over to the interpreter. … … 286 278 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a); 287 279 return VBOXSTRICTRC_TODO(rcStrict); 288 289 #else290 /** @todo probably we should fall back to the recompiler; otherwise we'll go back and forth between HC & GC291 * as io instructions tend to come in packages of more than one292 */293 DISCPUSTATE Cpu;294 int rc2 = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &Cpu, "IO EMU");295 if (RT_SUCCESS(rc2))296 {297 rcStrict = VINF_EM_RAW_EMULATE_INSTR;298 299 if (!(Cpu.fPrefix & (DISPREFIX_REP | DISPREFIX_REPNE)))300 {301 switch (Cpu.pCurInstr->uOpcode)302 {303 case OP_IN:304 {305 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIn);306 rcStrict = IOMInterpretIN(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);307 break;308 }309 310 case OP_OUT:311 {312 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatOut);313 rcStrict = IOMInterpretOUT(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);314 break;315 }316 }317 }318 else if (Cpu.fPrefix & DISPREFIX_REP)319 {320 switch (Cpu.pCurInstr->uOpcode)321 {322 case OP_INSB:323 case OP_INSWD:324 {325 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIn);326 rcStrict = IOMInterpretINS(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);327 break;328 }329 330 case OP_OUTSB:331 case OP_OUTSWD:332 {333 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatOut);334 rcStrict = IOMInterpretOUTS(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);335 break;336 }337 }338 }339 340 /*341 * Handled the I/O return codes.342 * (The unhandled cases end up with rcStrict == VINF_EM_RAW_EMULATE_INSTR.)343 */344 if (IOM_SUCCESS(rcStrict))345 {346 pCtx->rip += Cpu.cbInstr;347 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);348 LogFlow(("emR3HmExecuteIOInstruction: %Rrc 1\n", VBOXSTRICTRC_VAL(rcStrict)));349 return VBOXSTRICTRC_TODO(rcStrict);350 }351 352 if (rcStrict == VINF_EM_RAW_GUEST_TRAP)353 {354 /* The active trap will be dispatched. */355 Assert(TRPMHasTrap(pVCpu));356 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);357 LogFlow(("emR3HmExecuteIOInstruction: VINF_SUCCESS 2\n"));358 return VINF_SUCCESS;359 }360 AssertMsg(rcStrict != VINF_TRPM_XCPT_DISPATCHED, ("Handle VINF_TRPM_XCPT_DISPATCHED\n"));361 362 if (RT_FAILURE(rcStrict))363 {364 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);365 LogFlow(("emR3HmExecuteIOInstruction: %Rrc 3\n", VBOXSTRICTRC_VAL(rcStrict)));366 return VBOXSTRICTRC_TODO(rcStrict);367 }368 AssertMsg(rcStrict == VINF_EM_RAW_EMULATE_INSTR || rcStrict == VINF_EM_RESCHEDULE_REM, ("rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));369 }370 371 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);372 int rc3 = emR3HmExecuteInstruction(pVM, pVCpu, "IO: ");373 LogFlow(("emR3HmExecuteIOInstruction: %Rrc 4 (rc2=%Rrc, rc3=%Rrc)\n", VBOXSTRICTRC_VAL(rcStrict), rc2, rc3));374 return rc3;375 #endif376 280 } 377 281 -
trunk/src/VBox/VMM/VMMR3/EMRaw.cpp
r55980 r56064 365 365 * Once IEM gets mature enough, nothing should ever fall back. 366 366 */ 367 #ifdef VBOX_WITH_FIRST_IEM_STEP 368 //# define VBOX_WITH_FIRST_IEM_STEP_B 369 #endif 367 //#define VBOX_WITH_FIRST_IEM_STEP_B 370 368 #if defined(VBOX_WITH_FIRST_IEM_STEP_B) || !defined(VBOX_WITH_REM) 371 369 Log(("EMINS: %04x:%RGv RSP=%RGv\n", pCtx->cs.Sel, (RTGCPTR)pCtx->rip, (RTGCPTR)pCtx->rsp)); … … 439 437 static int emR3RawExecuteIOInstruction(PVM pVM, PVMCPU pVCpu) 440 438 { 441 #ifdef VBOX_WITH_FIRST_IEM_STEP442 439 STAM_PROFILE_START(&pVCpu->em.s.StatIOEmu, a); 443 440 … … 448 445 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a); 449 446 return VBOXSTRICTRC_TODO(rcStrict); 450 451 #else452 PCPUMCTX pCtx = pVCpu->em.s.pCtx;453 454 STAM_PROFILE_START(&pVCpu->em.s.StatIOEmu, a);455 456 /** @todo probably we should fall back to the recompiler; otherwise we'll go back and forth between HC & GC457 * as io instructions tend to come in packages of more than one458 */459 DISCPUSTATE Cpu;460 int rc = CPUMR3DisasmInstrCPU(pVM, pVCpu, pCtx, pCtx->rip, &Cpu, "IO EMU");461 if (RT_SUCCESS(rc))462 {463 VBOXSTRICTRC rcStrict = VINF_EM_RAW_EMULATE_INSTR;464 465 if (!(Cpu.fPrefix & (DISPREFIX_REP | DISPREFIX_REPNE)))466 {467 switch (Cpu.pCurInstr->uOpcode)468 {469 case OP_IN:470 {471 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIn);472 rcStrict = IOMInterpretIN(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);473 break;474 }475 476 case OP_OUT:477 {478 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatOut);479 rcStrict = IOMInterpretOUT(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);480 break;481 }482 }483 }484 else if (Cpu.fPrefix & DISPREFIX_REP)485 {486 switch (Cpu.pCurInstr->uOpcode)487 {488 case OP_INSB:489 case OP_INSWD:490 {491 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatIn);492 rcStrict = IOMInterpretINS(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);493 break;494 }495 496 case OP_OUTSB:497 case OP_OUTSWD:498 {499 STAM_COUNTER_INC(&pVCpu->em.s.CTX_SUFF(pStats)->StatOut);500 rcStrict = IOMInterpretOUTS(pVM, pVCpu, CPUMCTX2CORE(pCtx), &Cpu);501 break;502 }503 }504 }505 506 /*507 * Handled the I/O return codes.508 * (The unhandled cases end up with rcStrict == VINF_EM_RAW_EMULATE_INSTR.)509 */510 if (IOM_SUCCESS(rcStrict))511 {512 pCtx->rip += Cpu.cbInstr;513 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);514 return VBOXSTRICTRC_TODO(rcStrict);515 }516 517 if (rcStrict == VINF_EM_RAW_GUEST_TRAP)518 {519 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);520 rcStrict = emR3RawGuestTrap(pVM, pVCpu);521 return VBOXSTRICTRC_TODO(rcStrict);522 }523 AssertMsg(rcStrict != VINF_TRPM_XCPT_DISPATCHED, ("Handle VINF_TRPM_XCPT_DISPATCHED\n"));524 525 if (RT_FAILURE(rcStrict))526 {527 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);528 return VBOXSTRICTRC_TODO(rcStrict);529 }530 AssertMsg(rcStrict == VINF_EM_RAW_EMULATE_INSTR || rcStrict == VINF_EM_RESCHEDULE_REM, ("rcStrict=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));531 }532 STAM_PROFILE_STOP(&pVCpu->em.s.StatIOEmu, a);533 return emR3RawExecuteInstruction(pVM, pVCpu, "IO: ");534 #endif535 447 } 536 448 -
trunk/src/VBox/VMM/include/EMHandleRCTmpl.h
r56047 r56064 277 277 278 278 case VINF_EM_RAW_INJECT_TRPM_EVENT: 279 #ifdef VBOX_WITH_FIRST_IEM_STEP280 279 rc = VBOXSTRICTRC_VAL(IEMInjectTrpmEvent(pVCpu)); 281 280 /* The following condition should be removed when IEM_IMPLEMENTS_TASKSWITCH becomes true. */ 282 281 if (rc == VERR_IEM_ASPECT_NOT_IMPLEMENTED) 283 282 rc = emR3ExecuteInstruction(pVM, pVCpu, "EVENT: "); 284 #else285 /* Do the same thing as VINF_EM_RAW_EMULATE_INSTR. */286 rc = emR3ExecuteInstruction(pVM, pVCpu, "EVENT: ");287 #endif288 283 break; 289 284 -
trunk/src/VBox/VMM/include/EMInternal.h
r49070 r56064 267 267 * @{ */ 268 268 STAMCOUNTER StatIoRestarted; 269 #ifdef VBOX_WITH_FIRST_IEM_STEP270 269 STAMCOUNTER StatIoIem; 271 #else272 STAMCOUNTER StatIn;273 STAMCOUNTER StatOut;274 #endif275 270 STAMCOUNTER StatCli; 276 271 STAMCOUNTER StatSti;
Note:
See TracChangeset
for help on using the changeset viewer.