VirtualBox

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


Ignore:
Timestamp:
May 30, 2019 11:17:41 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
130984
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 VMREAD VM-exit handling.

File:
1 edited

Legend:

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

    r78839 r78872  
    429429//static FNVMXEXITHANDLER            hmR0VmxExitVmptrld;
    430430//static FNVMXEXITHANDLER            hmR0VmxExitVmptrst;
    431 //static FNVMXEXITHANDLER            hmR0VmxExitVmread;
     431static FNVMXEXITHANDLER            hmR0VmxExitVmreadNested;
    432432//static FNVMXEXITHANDLER            hmR0VmxExitVmresume;
    433433//static FNVMXEXITHANDLER            hmR0VmxExitVmwrite;
     
    1269612696
    1269712697        case VMX_EXIT_RDPMC:                    return hmR0VmxExitRdpmcNested(pVCpu, pVmxTransient);
    12698         case VMX_EXIT_VMREAD:
     12698        case VMX_EXIT_VMREAD:                   return hmR0VmxExitVmreadNested(pVCpu, pVmxTransient);
    1269912699        case VMX_EXIT_VMWRITE:
    1270012700
     
    1589015890
    1589115891/**
     15892 * Nested-guest VM-exit handler for VMREAD (VMX_EXIT_VMREAD). Unconditional VM-exit.
     15893 */
     15894HMVMX_EXIT_DECL hmR0VmxExitVmreadNested(PVMCPU pVCpu, PVMXTRANSIENT pVmxTransient)
     15895{
     15896    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
     15897
     15898    int rc = hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
     15899    AssertRCReturn(rc, rc);
     15900
     15901    uint8_t const iGReg = pVmxTransient->ExitInstrInfo.VmreadVmwrite.iReg2;
     15902    Assert(iGReg < RT_ELEMENTS(pVCpu->cpum.GstCtx.aGRegs));
     15903    uint64_t u64FieldEnc = pVCpu->cpum.GstCtx.aGRegs[iGReg].u64;
     15904
     15905    HMVMX_CPUMCTX_ASSERT(pVCpu, CPUMCTX_EXTRN_EFER);
     15906    if (!CPUMIsGuestInLongModeEx(&pVCpu->cpum.GstCtx))
     15907        u64FieldEnc &= UINT64_C(0xffffffff);
     15908
     15909    if (CPUMIsGuestVmxVmreadVmwriteInterceptSet(pVCpu, pVmxTransient->uExitReason, u64FieldEnc))
     15910    {
     15911        rc |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     15912        rc |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     15913        AssertRCReturn(rc, rc);
     15914
     15915        VMXVEXITINFO ExitInfo;
     15916        RT_ZERO(ExitInfo);
     15917        ExitInfo.uReason   = pVmxTransient->uExitReason;
     15918        ExitInfo.cbInstr   = pVmxTransient->cbInstr;
     15919        ExitInfo.u64Qual   = pVmxTransient->uExitQual;
     15920        ExitInfo.InstrInfo = pVmxTransient->ExitInstrInfo;
     15921        return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     15922    }
     15923    return hmR0VmxExitVmread(pVCpu, pVmxTransient);
     15924}
     15925
     15926
     15927/**
    1589215928 * Nested-guest VM-exit handler for RDTSC (VMX_EXIT_RDTSC). Conditional VM-exit.
    1589315929 */
     
    1610316139        AssertRCReturn(rc, rc);
    1610416140
    16105         /* Make sure we don't use stale VMX-transient info. */
     16141        /* Make sure we don't use stale/uninitialized VMX-transient info. below. */
    1610616142        pVmxTransient->ExitInstrInfo.u  = 0;
    1610716143        pVmxTransient->uGuestLinearAddr = 0;
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