VirtualBox

Ignore:
Timestamp:
Mar 13, 2012 3:30:35 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76802
Message:

EM: More refactoring.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/EMAll.cpp

    r40446 r40447  
    488488 *          to worry about e.g. invalid modrm combinations (!)
    489489 */
    490 VMMDECL(VBOXSTRICTRC) EMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize)
     490VMMDECL(VBOXSTRICTRC) EMInterpretInstruction(PVM pVM, PVMCPU pVCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault)
    491491{
    492492    LogFlow(("EMInterpretInstruction %RGv fault %RGv\n", (RTGCPTR)pRegFrame->rip, pvFault));
     
    513513        {
    514514            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 */
     547VMMDECL(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);
    516573            if (RT_SUCCESS(rc))
    517574                pRegFrame->rip += cbOp; /* Move on to the next instruction. */
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette