VirtualBox

Changeset 76041 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Dec 7, 2018 8:35:21 AM (6 years ago)
Author:
vboxsync
Message:

VMM/IEM: Nested VMX: bugref:9180 VMLAUNCH/VMRESUME interface.

Location:
trunk/src/VBox/VMM/VMMAll
Files:
2 edited

Legend:

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

    r76004 r76041  
    1604416044
    1604516045/**
     16046 * Interface for HM and EM to emulate the VMLAUNCH/VMRESUME instruction.
     16047 *
     16048 * @returns Strict VBox status code.
     16049 * @param   pVCpu           The cross context virtual CPU structure of the calling EMT.
     16050 * @param   cbInstr         The instruction length in bytes.
     16051 * @param   uInstrId        The instruction ID (VMXINSTRID_VMLAUNCH or
     16052 *                          VMXINSTRID_VMRESUME).
     16053 * @thread  EMT(pVCpu)
     16054 */
     16055VMM_INT_DECL(VBOXSTRICTRC) IEMExecDecodedVmlaunchVmresume(PVMCPU pVCpu, uint8_t cbInstr, VMXINSTRID uInstrId)
     16056{
     16057    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
     16058    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMENTRY_MASK);
     16059
     16060    iemInitExec(pVCpu, false /*fBypassHandlers*/);
     16061    VBOXSTRICTRC rcStrict = iemVmxVmlaunchVmresume(pVCpu, cbInstr,  uInstrId);
     16062    if (pVCpu->iem.s.cActiveMappings)
     16063        iemMemRollback(pVCpu);
     16064    return iemExecStatusCodeFiddling(pVCpu, rcStrict);
     16065}
     16066
     16067
     16068/**
    1604616069 * Interface for HM and EM to emulate the VMXON instruction.
    1604716070 *
     
    1608016103{
    1608116104    IEMEXEC_ASSERT_INSTR_LEN_RETURN(cbInstr, 3);
    16082     IEM_CTX_ASSERT(pVCpu, CPUMCTX_EXTRN_HM_VMX_MASK);
     16105    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_EXEC_DECODED_NO_MEM_MASK | CPUMCTX_EXTRN_HM_VMX_MASK);
    1608316106
    1608416107    iemInitExec(pVCpu, false /*fBypassHandlers*/);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r76040 r76041  
    28312831    return VINF_EM_RAW_EMULATE_INSTR;
    28322832# else
     2833    IEM_CTX_ASSERT(pVCpu, IEM_CPUMCTX_EXTRN_VMX_VMEXIT_MASK);
     2834
    28332835    PVMXVVMCS pVmcs = pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs);
    28342836    Assert(pVmcs);
     
    71527154 * @param   uInstrId        The instruction identity (VMXINSTRID_VMLAUNCH or
    71537155 *                          VMXINSTRID_VMRESUME).
    7154  * @param   pExitInfo       Pointer to the VM-exit instruction information struct.
    7155  *                          Optional, can  be NULL.
    71567156 *
    71577157 * @remarks Common VMX instruction checks are already expected to by the caller,
    71587158 *          i.e. CR4.VMXE, Real/V86 mode, EFER/CS.L checks.
    71597159 */
    7160 IEM_STATIC VBOXSTRICTRC iemVmxVmlaunchVmresume(PVMCPU pVCpu, uint8_t cbInstr, VMXINSTRID uInstrId, PCVMXVEXITINFO pExitInfo)
     7160IEM_STATIC VBOXSTRICTRC iemVmxVmlaunchVmresume(PVMCPU pVCpu, uint8_t cbInstr, VMXINSTRID uInstrId)
    71617161{
    71627162# if defined(VBOX_WITH_NESTED_HWVIRT_ONLY_IN_IEM) && !defined(IN_RING3)
    7163     RT_NOREF4(pVCpu, cbInstr, uInstrId, pExitInfo);
     7163    RT_NOREF3(pVCpu, cbInstr, uInstrId);
    71647164    return VINF_EM_RAW_EMULATE_INSTR;
    71657165# else
     
    71707170    /* Nested-guest intercept. */
    71717171    if (IEM_VMX_IS_NON_ROOT_MODE(pVCpu))
    7172     {
    7173         if (pExitInfo)
    7174             return iemVmxVmexitInstrWithInfo(pVCpu, pExitInfo);
    7175         uint32_t const uExitReason = uInstrId == VMXINSTRID_VMRESUME ? VMX_EXIT_VMRESUME : VMX_EXIT_VMLAUNCH;
    7176         return iemVmxVmexitInstrNeedsInfo(pVCpu, uExitReason, uInstrId, cbInstr);
    7177     }
     7172        return iemVmxVmexitInstr(pVCpu, uInstrId == VMXINSTRID_VMRESUME ? VMX_EXIT_VMRESUME : VMX_EXIT_VMLAUNCH, cbInstr);
    71787173
    71797174    Assert(IEM_VMX_IS_ROOT_MODE(pVCpu));
     
    83848379IEM_CIMPL_DEF_0(iemCImpl_vmlaunch)
    83858380{
    8386     return iemVmxVmlaunchVmresume(pVCpu, cbInstr, VMXINSTRID_VMLAUNCH, NULL /* pExitInfo */);
     8381    return iemVmxVmlaunchVmresume(pVCpu, cbInstr, VMXINSTRID_VMLAUNCH);
    83878382}
    83888383
     
    83938388IEM_CIMPL_DEF_0(iemCImpl_vmresume)
    83948389{
    8395     return iemVmxVmlaunchVmresume(pVCpu, cbInstr, VMXINSTRID_VMRESUME, NULL /* pExitInfo */);
     8390    return iemVmxVmlaunchVmresume(pVCpu, cbInstr, VMXINSTRID_VMRESUME);
    83968391}
    83978392
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