Changeset 40447 in vbox for trunk/src/VBox/VMM/VMMAll/EMAll.cpp
- Timestamp:
- Mar 13, 2012 3:30:35 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76802
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/VMMAll/EMAll.cpp
r40446 r40447 488 488 * to worry about e.g. invalid modrm combinations (!) 489 489 */ 490 VMMDECL(VBOXSTRICTRC) EMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault , uint32_t *pcbSize)490 VMMDECL(VBOXSTRICTRC) EMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault) 491 491 { 492 492 LogFlow(("EMInterpretInstruction %RGv fault %RGv\n", (RTGCPTR)pRegFrame->rip, pvFault)); … … 513 513 { 514 514 Assert(cbOp == pDis->opsize); 515 rc = EMInterpretInstructionCPU(pVM, pVCpu, pDis, pRegFrame, pvFault, EMCODETYPE_SUPERVISOR, pcbSize); 515 uint32_t cbIgnored; 516 rc = EMInterpretInstructionCPU(pVM, pVCpu, pDis, pRegFrame, pvFault, EMCODETYPE_SUPERVISOR, &cbIgnored); 517 if (RT_SUCCESS(rc)) 518 pRegFrame->rip += cbOp; /* Move on to the next instruction. */ 519 520 return rc; 521 } 522 } 523 return VERR_EM_INTERPRETER; 524 #endif 525 } 526 527 528 /** 529 * Interprets the current instruction. 530 * 531 * @returns VBox status code. 532 * @retval VINF_* Scheduling instructions. 533 * @retval VERR_EM_INTERPRETER Something we can't cope with. 534 * @retval VERR_* Fatal errors. 535 * 536 * @param pVM The VM handle. 537 * @param pVCpu The VMCPU handle. 538 * @param pRegFrame The register frame. 539 * Updates the EIP if an instruction was executed successfully. 540 * @param pvFault The fault address (CR2). 541 * @param pcbWritten Size of the write (if applicable). 542 * 543 * @remark Invalid opcode exceptions have a higher priority than GP (see Intel 544 * Architecture System Developers Manual, Vol 3, 5.5) so we don't need 545 * to worry about e.g. invalid modrm combinations (!) 546 */ 547 VMMDECL(VBOXSTRICTRC) EMInterpretInstructionEx(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbWritten) 548 { 549 LogFlow(("EMInterpretInstructionEx %RGv fault %RGv\n", (RTGCPTR)pRegFrame->rip, pvFault)); 550 #ifdef VBOX_WITH_IEM 551 int rc = IEMExecOneEx(pVCpu, pRegFrame, IEM_EXEC_ONE_EX_FLAGS_, pcbWritten); 552 if (RT_FAILURE(rc)) 553 switch (rc) 554 { 555 case VERR_IEM_ASPECT_NOT_IMPLEMENTED: 556 case VERR_IEM_INSTR_NOT_IMPLEMENTED: 557 return VERR_EM_INTERPRETER; 558 } 559 return rc; 560 #else 561 RTGCPTR pbCode; 562 VBOXSTRICTRC rc = SELMToFlatEx(pVM, DIS_SELREG_CS, pRegFrame, pRegFrame->rip, 0, &pbCode); 563 if (RT_SUCCESS(rc)) 564 { 565 uint32_t cbOp; 566 PDISCPUSTATE pDis = &pVCpu->em.s.DisState; 567 pDis->mode = SELMGetCpuModeFromSelector(pVM, pRegFrame->eflags, pRegFrame->cs, &pRegFrame->csHid); 568 rc = emDisCoreOne(pVM, pVCpu, pDis, (RTGCUINTPTR)pbCode, &cbOp); 569 if (RT_SUCCESS(rc)) 570 { 571 Assert(cbOp == pDis->opsize); 572 rc = EMInterpretInstructionCPU(pVM, pVCpu, pDis, pRegFrame, pvFault, EMCODETYPE_SUPERVISOR, pcbWritten); 516 573 if (RT_SUCCESS(rc)) 517 574 pRegFrame->rip += cbOp; /* Move on to the next instruction. */
Note:
See TracChangeset
for help on using the changeset viewer.