VirtualBox

Changeset 78622 in vbox


Ignore:
Timestamp:
May 21, 2019 9:03:53 AM (6 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 hlt, invlpg, wbinvd, invpcid VM-exit handling.

File:
1 edited

Legend:

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

    r78615 r78622  
    1257712577        }
    1257812578
     12579        case VMX_EXIT_HLT:
     12580        {
     12581            int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12582            AssertRCReturn(rc, rc);
     12583            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_HLT_EXIT))
     12584                rcStrict = IEMExecVmxVmexitInstr(pVCpu, uExitReason, pVmxTransient->cbInstr);
     12585            else
     12586                rcStrict = hmR0VmxExitHlt(pVCpu, pVmxTransient);
     12587            break;
     12588        }
     12589
    1257912590        case VMX_EXIT_RDTSC:
    1258012591        {
     
    1265212663        }
    1265312664
     12665        case VMX_EXIT_INVLPG:
     12666        {
     12667            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INVLPG_EXIT))
     12668            {
     12669                int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12670                rc    |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     12671                AssertRCReturn(rc, rc);
     12672
     12673                VMXVEXITINFO ExitInfo;
     12674                RT_ZERO(ExitInfo);
     12675                ExitInfo.uReason   = uExitReason;
     12676                ExitInfo.cbInstr   = pVmxTransient->cbInstr;
     12677                ExitInfo.u64Qual   = pVmxTransient->uExitQual;
     12678                rcStrict = IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     12679            }
     12680            else
     12681                rcStrict = hmR0VmxExitInvlpg(pVCpu, pVmxTransient);
     12682            break;
     12683        }
     12684
     12685        case VMX_EXIT_INVPCID:
     12686        {
     12687            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_INVLPG_EXIT))
     12688            {
     12689                int rc  = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12690                rc     |= hmR0VmxReadExitQualVmcs(pVCpu, pVmxTransient);
     12691                rc     |= hmR0VmxReadExitInstrInfoVmcs(pVmxTransient);
     12692                AssertRCReturn(rc, rc);
     12693
     12694                VMXVEXITINFO ExitInfo;
     12695                RT_ZERO(ExitInfo);
     12696                ExitInfo.uReason   = uExitReason;
     12697                ExitInfo.cbInstr   = pVmxTransient->cbInstr;
     12698                ExitInfo.u64Qual   = pVmxTransient->uExitQual;
     12699                ExitInfo.InstrInfo = pVmxTransient->ExitInstrInfo;
     12700                rcStrict = IEMExecVmxVmexitInstrWithInfo(pVCpu, &ExitInfo);
     12701            }
     12702            else
     12703                rcStrict = hmR0VmxExitInvpcid(pVCpu, pVmxTransient);
     12704            break;
     12705        }
     12706
    1265412707        case VMX_EXIT_APIC_ACCESS:
    1265512708        case VMX_EXIT_XCPT_OR_NMI:
     
    1270112754        }
    1270212755
     12756        case VMX_EXIT_WBINVD:
     12757        {
     12758            if (CPUMIsGuestVmxProcCtls2Set(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_WBINVD_EXIT))
     12759            {
     12760                int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12761                AssertRCReturn(rc, rc);
     12762                rcStrict = IEMExecVmxVmexitInstr(pVCpu, uExitReason, pVmxTransient->cbInstr);
     12763            }
     12764            else
     12765                rcStrict = hmR0VmxExitInvpcid(pVCpu, pVmxTransient);
     12766            break;
     12767        }
     12768
    1270312769        case VMX_EXIT_MOV_DRX:
    12704         case VMX_EXIT_HLT:
    12705         case VMX_EXIT_INVLPG:
    1270612770        case VMX_EXIT_RSM:
    1270712771        case VMX_EXIT_MTF:
     
    1270912773        case VMX_EXIT_GDTR_IDTR_ACCESS:
    1271012774        case VMX_EXIT_LDTR_TR_ACCESS:
    12711         case VMX_EXIT_WBINVD:
    1271212775        case VMX_EXIT_RDRAND:
    12713         case VMX_EXIT_INVPCID:
    1271412776        case VMX_EXIT_RDPMC:
    1271512777        case VMX_EXIT_VMREAD:
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