VirtualBox

Ignore:
Timestamp:
May 14, 2019 5:46:35 AM (6 years ago)
Author:
vboxsync
Message:

VMM/HMVMXR0: Nested VMX: bugref:9180 rdmsr, wrmsr VM-exit handling.

File:
1 edited

Legend:

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

    r78492 r78493  
    1259612596        case VMX_EXIT_TASK_SWITCH:
    1259712597        case VMX_EXIT_PREEMPT_TIMER:
     12598
    1259812599        case VMX_EXIT_RDMSR:
     12600        {
     12601            uint32_t fMsrpm;
     12602            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_USE_MSR_BITMAPS))
     12603                fMsrpm = CPUMGetVmxMsrPermission(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvMsrBitmap), pVCpu->cpum.GstCtx.ecx);
     12604            else
     12605                fMsrpm = VMXMSRPM_EXIT_RD;
     12606
     12607            if (fMsrpm & VMXMSRPM_EXIT_RD)
     12608            {
     12609                int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12610                AssertRCReturn(rc, rc);
     12611                rcStrict = IEMExecVmxVmexitInstr(pVCpu, uExitReason, pVmxTransient->cbInstr);
     12612            }
     12613            else
     12614                rcStrict = hmR0VmxExitRdmsr(pVCpu, pVmxTransient);
     12615            break;
     12616        }
     12617
    1259912618        case VMX_EXIT_WRMSR:
     12619        {
     12620            uint32_t fMsrpm;
     12621            if (CPUMIsGuestVmxProcCtlsSet(pVCpu, &pVCpu->cpum.GstCtx, VMX_PROC_CTLS_USE_MSR_BITMAPS))
     12622                fMsrpm = CPUMGetVmxMsrPermission(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pvMsrBitmap), pVCpu->cpum.GstCtx.ecx);
     12623            else
     12624                fMsrpm = VMXMSRPM_EXIT_WR;
     12625
     12626            if (fMsrpm & VMXMSRPM_EXIT_WR)
     12627            {
     12628                int rc = hmR0VmxReadExitInstrLenVmcs(pVmxTransient);
     12629                AssertRCReturn(rc, rc);
     12630                rcStrict = IEMExecVmxVmexitInstr(pVCpu, uExitReason, pVmxTransient->cbInstr);
     12631            }
     12632            else
     12633                rcStrict = hmR0VmxExitWrmsr(pVCpu, pVmxTransient);
     12634            break;
     12635        }
     12636
    1260012637        case VMX_EXIT_VMCALL:
    1260112638        case VMX_EXIT_MOV_DRX:
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