VirtualBox

Changeset 78878 in vbox


Ignore:
Timestamp:
May 30, 2019 12:01:19 PM (6 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 Make unexpected error conditions as assertions for VM-exit handling.

File:
1 edited

Legend:

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

    r78877 r78878  
    1266512665        case VMX_EXIT_WBINVD:                   return hmR0VmxExitWbinvdNested(pVCpu, pVmxTransient);
    1266612666        case VMX_EXIT_MTF:                      return hmR0VmxExitMtfNested(pVCpu, pVmxTransient);
    12667 
    12668         case VMX_EXIT_APIC_ACCESS:
     12667        case VMX_EXIT_APIC_ACCESS:              return hmR0VmxExitApicAccessNested(pVCpu, pVmxTransient);
     12668
     12669        /** @todo NSTVMX: APIC-access, Xcpt or NMI, Mov CRx. */
    1266912670        case VMX_EXIT_XCPT_OR_NMI:
    1267012671        {
    12671             /** @todo NSTVMX: APIC-access, Xcpt or NMI, Mov CRx. */
    1267212672            return hmR0VmxExitErrUnexpected(pVCpu, pVmxTransient);
    1267312673        }
     
    1631216312    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    1631316313
    16314     /*
    16315      * All VMCS controls that cause APIC-access VM-exits (Virtualize APIC access,
    16316      * virtual-interrupt delivery, APIC-register virtualization) are all taken
    16317      * directly from the guest-hypervisor. So there should be no need to re-verify
    16318      * them here.
    16319      *
    16320      * Only the VM-exit qualification is relevant here.
    16321      */
     16314    Assert(CPUMIsGuestVmxProcCtls2Set(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_VIRT_APIC_ACCESS));
    1632216315    int rc = hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
    1632316316    AssertRCReturn(rc, rc);
     16317
    1632416318    return IEMExecVmxVmexit(pVCpu, pVmxTransient->uExitReason, pVmxTransient->uExitQual);
    1632516319}
     
    1633516329    HMVMX_VALIDATE_NESTED_EXIT_HANDLER_PARAMS(pVCpu, pVmxTransient);
    1633616330
    16337     if (CPUMIsGuestVmxProcCtls2Set(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_DESC_TABLE_EXIT))
    16338     {
    16339         int rc = hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
    16340         rc    |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
    16341         rc    |= hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
    16342         AssertRCReturn(rc, rc);
    16343 
    16344         VMXVEXITINFO ExitInfo;
    16345         RT_ZERO(ExitInfo);
    16346         ExitInfo.cbInstr   = pVmxTransient->cbInstr;
    16347         ExitInfo.u64Qual   = pVmxTransient->uExitQual;
    16348         ExitInfo.InstrInfo = pVmxTransient->ExitInstrInfo;
    16349         return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
    16350     }
    16351     return hmR0VmxExitErrUnexpected(pVCpu, pVmxTransient);
     16331    Assert(CPUMIsGuestVmxProcCtls2Set(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_DESC_TABLE_EXIT));
     16332    int rc = hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     16333    rc    |= hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     16334    rc    |= hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
     16335    AssertRCReturn(rc, rc);
     16336
     16337    VMXVEXITINFO ExitInfo;
     16338    RT_ZERO(ExitInfo);
     16339    ExitInfo.cbInstr   = pVmxTransient->cbInstr;
     16340    ExitInfo.u64Qual   = pVmxTransient->uExitQual;
     16341    ExitInfo.InstrInfo = pVmxTransient->ExitInstrInfo;
     16342    return IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
    1635216343}
    1635316344
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