VirtualBox

Changeset 12786 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Sep 29, 2008 11:01:57 AM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
37131
Message:

Real-mode support for VT-x. (currently disabled)

File:
1 edited

Legend:

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

    r12773 r12786  
    396396        case OP_MOV_DR:     return "MovDRx";
    397397        case OP_LLDT:       return "LLdt";
     398        case OP_LGDT:       return "LGdt";
     399        case OP_LIDT:       return "LGdt";
    398400        case OP_CLTS:       return "Clts";
    399401        case OP_MONITOR:    return "Monitor";
     
    22402242    return VERR_EM_INTERPRETER;
    22412243}
     2244
     2245#ifdef IN_RING0
     2246/**
     2247 * LIDT/LGDT Emulation.
     2248 */
     2249static int emInterpretLIGdt(PVM pVM, PDISCPUSTATE pCpu, PCPUMCTXCORE pRegFrame, RTGCPTR pvFault, uint32_t *pcbSize)
     2250{
     2251    OP_PARAMVAL param1;
     2252    RTGCPTR     pParam1;
     2253    X86XDTR32   dtr32;
     2254
     2255    LogFlow(("Emulate %s at %VGv\n", emGetMnemonic(pCpu), pRegFrame->rip));
     2256
     2257    /* Only for the VT-x real-mode emulation case. */
     2258    if (!CPUMIsGuestInRealMode(pVM))
     2259        return VERR_EM_INTERPRETER;
     2260
     2261    int rc = DISQueryParamVal(pRegFrame, pCpu, &pCpu->param1, &param1, PARAM_SOURCE);
     2262    if(VBOX_FAILURE(rc))
     2263        return VERR_EM_INTERPRETER;
     2264
     2265    switch(param1.type)
     2266    {
     2267    case PARMTYPE_ADDRESS:
     2268        pParam1 = emConvertToFlatAddr(pVM, pRegFrame, pCpu, &pCpu->param1, param1.val.val16);
     2269        break;
     2270
     2271    default:
     2272        return VERR_EM_INTERPRETER;
     2273    }
     2274
     2275    rc = emRamRead(pVM, &dtr32, pParam1, sizeof(dtr32));
     2276    AssertRCReturn(rc, VERR_EM_INTERPRETER);
     2277
     2278    if (pCpu->pCurInstr->opcode == OP_LIDT)
     2279        CPUMSetGuestIDTR(pVM, dtr32.uAddr, dtr32.cb);
     2280    else
     2281        CPUMSetGuestGDTR(pVM, dtr32.uAddr, dtr32.cb);
     2282
     2283    return VINF_SUCCESS;
     2284}
     2285#endif
    22422286
    22432287
     
    27722816                STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); \
    27732817            return rc
     2818
     2819#define INTERPRET_CASE_EX_DUAL_PARAM2(opcode, Instr, InstrFn) \
     2820        case opcode:\
     2821            rc = emInterpret##InstrFn(pVM, pCpu, pRegFrame, pvFault, pcbSize); \
     2822            if (VBOX_SUCCESS(rc)) \
     2823                STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Instr)); \
     2824            else \
     2825                STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); \
     2826            return rc
     2827
    27742828#define INTERPRET_STAT_CASE(opcode, Instr) \
    27752829        case opcode: STAM_COUNTER_INC(&pVM->em.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,Failed##Instr)); return VERR_EM_INTERPRETER;
     
    27912845        INTERPRET_CASE(OP_MOV_DR,MovDRx);
    27922846        INTERPRET_CASE(OP_LLDT,LLdt);
     2847#ifdef IN_RING0
     2848        INTERPRET_CASE_EX_DUAL_PARAM2(OP_LIDT, LIdt, LIGdt);
     2849        INTERPRET_CASE_EX_DUAL_PARAM2(OP_LGDT, LGdt, LIGdt);
     2850#endif
    27932851        INTERPRET_CASE(OP_CLTS,Clts);
    27942852        INTERPRET_CASE(OP_MONITOR, Monitor);
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