VirtualBox

Changeset 93290 in vbox


Ignore:
Timestamp:
Jan 18, 2022 5:31:29 AM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 Mind the union reporting VMX MSRs.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpum.h

    r93213 r93290  
    14951495VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32FeatCtrl(PCVMCPUCC pVCpu);
    14961496VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32MtrrCap(PCVMCPU pVCpu);
    1497 VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32SmmMonitorCtl(PCVMCPU pVCpu);
    1498 VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32VmxEptVpidCap(PCVMCPU pVCpu);
     1497VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32SmmMonitorCtl(PCVMCPUCC pVCpu);
     1498VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32VmxEptVpidCap(PCVMCPUCC pVCpu);
    14991499VMMDECL(VBOXSTRICTRC)   CPUMQueryGuestMsr(PVMCPUCC pVCpu, uint32_t idMsr, uint64_t *puValue);
    15001500VMMDECL(VBOXSTRICTRC)   CPUMSetGuestMsr(PVMCPUCC pVCpu, uint32_t idMsr, uint64_t uValue);
  • trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp

    r93115 r93290  
    312312 * @param   pVCpu           The cross context per CPU structure.
    313313 */
    314 VMM_INT_DECL(uint64_t) CPUMGetGuestIa32SmmMonitorCtl(PCVMCPU pVCpu)
     314VMM_INT_DECL(uint64_t) CPUMGetGuestIa32SmmMonitorCtl(PCVMCPUCC pVCpu)
    315315{
    316316    /* We do not support dual-monitor treatment for SMI and SMM. */
     
    13361336{
    13371337    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1338     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Basic;
     1338    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1339        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Basic;
     1340    else
     1341        *puValue = 0;
    13391342    return VINF_SUCCESS;
    13401343}
     
    13451348{
    13461349    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1347     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.PinCtls.u;
     1350    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1351        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.PinCtls.u;
     1352    else
     1353        *puValue = 0;
    13481354    return VINF_SUCCESS;
    13491355}
     
    13531359{
    13541360    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1355     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls.u;
     1361    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1362        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls.u;
     1363    else
     1364        *puValue = 0;
    13561365    return VINF_SUCCESS;
    13571366}
     
    13621371{
    13631372    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1364     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ExitCtls.u;
     1373    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1374        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ExitCtls.u;
     1375    else
     1376        *puValue = 0;
    13651377    return VINF_SUCCESS;
    13661378}
     
    13711383{
    13721384    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1373     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.EntryCtls.u;
     1385    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1386        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.EntryCtls.u;
     1387    else
     1388        *puValue = 0;
    13741389    return VINF_SUCCESS;
    13751390}
     
    13811396{
    13821397    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1383     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Misc;
     1398    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1399        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Misc;
     1400    else
     1401        *puValue = 0;
    13841402    return VINF_SUCCESS;
    13851403}
     
    13991417{
    14001418    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1401     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr0Fixed1;
     1419    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1420        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr0Fixed1;
     1421    else
     1422        *puValue = 0;
    14021423    return VINF_SUCCESS;
    14031424}
     
    14081429{
    14091430    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1410     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed0;
     1431    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1432        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed0;
     1433    else
     1434        *puValue = 0;
    14111435    return VINF_SUCCESS;
    14121436}
     
    14171441{
    14181442    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1419     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed1;
     1443    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1444        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64Cr4Fixed1;
     1445    else
     1446        *puValue = 0;
    14201447    return VINF_SUCCESS;
    14211448}
     
    14261453{
    14271454    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1428     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmcsEnum;
     1455    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1456        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmcsEnum;
     1457    else
     1458        *puValue = 0;
    14291459    return VINF_SUCCESS;
    14301460}
     
    14351465{
    14361466    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1437     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls2.u;
     1467    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1468        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.ProcCtls2.u;
     1469    else
     1470        *puValue = 0;
    14381471    return VINF_SUCCESS;
    14391472}
     
    14461479 * @param   pVCpu           The cross context per CPU structure.
    14471480 */
    1448 VMM_INT_DECL(uint64_t) CPUMGetGuestIa32VmxEptVpidCap(PCVMCPU pVCpu)
    1449 {
    1450     RT_NOREF_PV(pVCpu);
    1451     return pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64EptVpidCaps;
     1481VMM_INT_DECL(uint64_t) CPUMGetGuestIa32VmxEptVpidCap(PCVMCPUCC pVCpu)
     1482{
     1483    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1484        return pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64EptVpidCaps;
     1485    return 0;
    14521486}
    14531487
     
    14561490static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxEptVpidCap(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
    14571491{
    1458     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
     1492    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    14591493    *puValue = CPUMGetGuestIa32VmxEptVpidCap(pVCpu);
    14601494    return VINF_SUCCESS;
     
    14651499static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTruePinbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
    14661500{
    1467     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1468     *puValue = 0;
     1501    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
     1502    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1503        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TruePinCtls.u;
     1504    else
     1505        *puValue = 0;
    14691506    return VINF_SUCCESS;
    14701507}
     
    14741511static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueProcbasedCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
    14751512{
    1476     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1477     *puValue = 0;
     1513    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
     1514    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1515        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueProcCtls.u;
     1516    else
     1517        *puValue = 0;
    14781518    return VINF_SUCCESS;
    14791519}
     
    14831523static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueExitCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
    14841524{
    1485     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1486     *puValue = 0;
     1525    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
     1526    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1527        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueExitCtls.u;
     1528    else
     1529        *puValue = 0;
    14871530    return VINF_SUCCESS;
    14881531}
     
    14921535static DECLCALLBACK(VBOXSTRICTRC) cpumMsrRd_Ia32VmxTrueEntryCtls(PVMCPUCC pVCpu, uint32_t idMsr, PCCPUMMSRRANGE pRange, uint64_t *puValue)
    14931536{
    1494     RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1495     *puValue = 0;
     1537    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
     1538    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1539        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.TrueEntryCtls.u;
     1540    else
     1541        *puValue = 0;
    14961542    return VINF_SUCCESS;
    14971543}
     
    15021548{
    15031549    RT_NOREF_PV(pVCpu); RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    1504     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmFunc;
     1550    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     1551        *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64VmFunc;
     1552    else
     1553        *puValue = 0;
    15051554    return VINF_SUCCESS;
    15061555}
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