VirtualBox

Changeset 73987 in vbox


Ignore:
Timestamp:
Aug 31, 2018 9:18:10 AM (6 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Use IEMExecDecodedVmread from the VMX R0 code.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r73985 r73987  
    1341813418    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    1341913419
    13420     /** @todo NSTVMX: Vmread. */
    13421     hmR0VmxSetPendingXcptUD(pVCpu);
    13422     return VINF_SUCCESS;
    13423 }
    13424 
    13425 
    13426 /**
    13427  * VM-exit handler for VMRESUME (VMX_EXIT_VMRESUME). Unconditional VM-exit.
    13428  */
    13429 HMVMX_EXIT_DECL hmR0VmxExitVmresume(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    13430 {
    13431     HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    13432 
    13433     /** @todo NSTVMX: Vmresume. */
    13434     hmR0VmxSetPendingXcptUD(pVCpu);
    13435     return VINF_SUCCESS;
    13436 }
    13437 
    13438 
    13439 /**
    13440  * VM-exit handler for VMWRITE (VMX_EXIT_VMWRITE). Unconditional VM-exit.
    13441  */
    13442 HMVMX_EXIT_DECL hmR0VmxExitVmwrite(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    13443 {
    13444     HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    13445 
    1344613420    int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
    1344713421    rc    |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_SREG_MASK | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     
    1348013454    }
    1348113455
    13482     VBOXSTRICTRC rcStrict = IEMExecDecodedVmwrite(pVCpu, &ExitInfo);
     13456    VBOXSTRICTRC rcStrict = IEMExecDecodedVmread(pVCpu, &ExitInfo);
    1348313457    if (RT_LIKELY(rcStrict == VINF_SUCCESS))
    1348413458        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS | HM_CHANGED_GUEST_HWVIRT);
     
    1348913463    }
    1349013464    return rcStrict;
    13491 }
    13492 
    13493 
    13494 /**
    13495  * VM-exit handler for VMXOFF (VMX_EXIT_VMXOFF). Unconditional VM-exit.
    13496  */
    13497 HMVMX_EXIT_DECL hmR0VmxExitVmxoff(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     13465
     13466
     13467    return VINF_SUCCESS;
     13468}
     13469
     13470
     13471/**
     13472 * VM-exit handler for VMRESUME (VMX_EXIT_VMRESUME). Unconditional VM-exit.
     13473 */
     13474HMVMX_EXIT_DECL hmR0VmxExitVmresume(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    1349813475{
    1349913476    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    1350013477
    13501     int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
    13502     rc    |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
    13503     AssertRCReturn(rc, rc);
    13504 
    13505     HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason);
    13506 
    13507     VBOXSTRICTRC rcStrict = IEMExecDecodedVmxoff(pVCpu, pVmxTransient->cbInstr);
    13508     if (RT_LIKELY(rcStrict == VINF_SUCCESS))
    13509     {
    13510         /* VMXOFF on success changes the internal hwvirt state but not anything that's visible to the guest. */
    13511         ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_HWVIRT);
    13512     }
    13513     else if (rcStrict == VINF_IEM_RAISED_XCPT)
    13514     {
    13515         ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
    13516         rcStrict = VINF_SUCCESS;
    13517     }
    13518     return rcStrict;
    13519 }
    13520 
    13521 
    13522 /**
    13523  * VM-exit handler for VMXON (VMX_EXIT_VMXON). Unconditional VM-exit.
    13524  */
    13525 HMVMX_EXIT_DECL hmR0VmxExitVmxon(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     13478    /** @todo NSTVMX: Vmresume. */
     13479    hmR0VmxSetPendingXcptUD(pVCpu);
     13480    return VINF_SUCCESS;
     13481}
     13482
     13483
     13484/**
     13485 * VM-exit handler for VMWRITE (VMX_EXIT_VMWRITE). Unconditional VM-exit.
     13486 */
     13487HMVMX_EXIT_DECL hmR0VmxExitVmwrite(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
    1352613488{
    1352713489    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     
    1354113503    ExitInfo.InstrInfo.u = pVmxTransient->ExitInstrInfo.u;
    1354213504    ExitInfo.cbInstr     = pVmxTransient->cbInstr;
     13505    if (!ExitInfo.InstrInfo.VmreadVmwrite.fIsRegOperand)
     13506    {
     13507        RTGCPTR GCPtrVal;
     13508        VBOXSTRICTRC rcStrict = hmR0VmxDecodeMemOperand(pVCpu, &ExitInfo.InstrInfo, ExitInfo.u64Qual, false /* fIsDstOperand */,
     13509                                                         &GCPtrVal);
     13510        if (rcStrict == VINF_SUCCESS)
     13511        { /* likely */ }
     13512        else if (rcStrict == VINF_HM_PENDING_XCPT)
     13513        {
     13514            Assert(pVCpu->hm.s.Event.fPending);
     13515            Log4Func(("Memory operand decoding failed, raising xcpt %#x\n",
     13516                      VMX_ENTRY_INT_INFO_VECTOR(pVCpu->hm.s.Event.u64IntInfo)));
     13517            return VINF_SUCCESS;
     13518        }
     13519        else
     13520        {
     13521            Log4Func(("hmR0VmxCheckExitDueToVmxInstr failed. rc=%Rrc\n", VBOXSTRICTRC_VAL(rcStrict)));
     13522            return rcStrict;
     13523        }
     13524        ExitInfo.GCPtrEffAddr = GCPtrVal;
     13525    }
     13526
     13527    VBOXSTRICTRC rcStrict = IEMExecDecodedVmwrite(pVCpu, &ExitInfo);
     13528    if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     13529        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS | HM_CHANGED_GUEST_HWVIRT);
     13530    else if (rcStrict == VINF_IEM_RAISED_XCPT)
     13531    {
     13532        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
     13533        rcStrict = VINF_SUCCESS;
     13534    }
     13535    return rcStrict;
     13536}
     13537
     13538
     13539/**
     13540 * VM-exit handler for VMXOFF (VMX_EXIT_VMXOFF). Unconditional VM-exit.
     13541 */
     13542HMVMX_EXIT_DECL hmR0VmxExitVmxoff(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     13543{
     13544    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     13545
     13546    int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     13547    rc    |= hmR0VmxImportGuestState(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     13548    AssertRCReturn(rc, rc);
     13549
     13550    HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason);
     13551
     13552    VBOXSTRICTRC rcStrict = IEMExecDecodedVmxoff(pVCpu, pVmxTransient->cbInstr);
     13553    if (RT_LIKELY(rcStrict == VINF_SUCCESS))
     13554    {
     13555        /* VMXOFF on success changes the internal hwvirt state but not anything that's visible to the guest. */
     13556        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_GUEST_HWVIRT);
     13557    }
     13558    else if (rcStrict == VINF_IEM_RAISED_XCPT)
     13559    {
     13560        ASMAtomicUoOrU64(&pVCpu->hm.s.fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
     13561        rcStrict = VINF_SUCCESS;
     13562    }
     13563    return rcStrict;
     13564}
     13565
     13566
     13567/**
     13568 * VM-exit handler for VMXON (VMX_EXIT_VMXON). Unconditional VM-exit.
     13569 */
     13570HMVMX_EXIT_DECL hmR0VmxExitVmxon(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     13571{
     13572    HMVMX_VALIDATE_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     13573
     13574    int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     13575    rc    |= hmR0VmxImportGuestState(pVCpu, CPUMCTX_EXTRN_SREG_MASK | IEM_CPUMCTX_EXTRN_EXEC_DECODED_MEM_MASK);
     13576    rc    |= hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
     13577    rc    |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     13578    AssertRCReturn(rc, rc);
     13579
     13580    HMVMX_CHECK_EXIT_DUE_TO_VMX_INSTR(pVCpu, pVmxTransient->uExitReason);
     13581
     13582    VMXVEXITINFO ExitInfo;
     13583    RT_ZERO(ExitInfo);
     13584    ExitInfo.uReason     = pVmxTransient->uExitReason;
     13585    ExitInfo.u64Qual     = pVmxTransient->uExitQual;
     13586    ExitInfo.InstrInfo.u = pVmxTransient->ExitInstrInfo.u;
     13587    ExitInfo.cbInstr     = pVmxTransient->cbInstr;
    1354313588
    1354413589    RTGCPTR GCPtrVmxon;
Note: See TracChangeset for help on using the changeset viewer.

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