VirtualBox

Changeset 91323 in vbox


Ignore:
Timestamp:
Sep 22, 2021 10:04:56 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
146984
Message:

VMM: bugref:10106 Fixed IA32_FEATURE_CONTROL MSR reported to the guest.

Location:
trunk
Files:
10 edited

Legend:

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

    r91306 r91323  
    14811481                                          uint32_t *pEax, uint32_t *pEbx, uint32_t *pEcx, uint32_t *pEdx);
    14821482VMMDECL(uint64_t)       CPUMGetGuestEFER(PCVMCPU pVCpu);
     1483VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32FeatCtrl(PCVMCPUCC pVCpu);
    14831484VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32MtrrCap(PCVMCPU pVCpu);
    14841485VMM_INT_DECL(uint64_t)  CPUMGetGuestIa32SmmMonitorCtl(PCVMCPU pVCpu);
  • trunk/include/VBox/vmm/hm_vmx.h

    r91120 r91323  
    11971197typedef struct VMXMSRS
    11981198{
    1199     /** VMX/SMX Feature control. */
    1200     uint64_t        u64FeatCtrl;
    12011199    /** Basic information. */
    12021200    uint64_t        u64Basic;
     
    12381236    uint64_t        u64ProcCtls3;
    12391237    /** Reserved for future. */
    1240     uint64_t        a_u64Reserved[8];
     1238    uint64_t        a_u64Reserved[9];
    12411239} VMXMSRS;
    12421240AssertCompileSizeAlignment(VMXMSRS, 8);
  • trunk/src/VBox/VMM/VMMAll/CPUMAllMsrs.cpp

    r91266 r91323  
    236236}
    237237
     238/**
     239 * Get IA32_FEATURE_CONTROL value for IEM, NEM and cpumMsrRd_Ia32FeatureControl.
     240 *
     241 * @returns IA32_FEATURE_CONTROL value.
     242 * @param   pVCpu           The cross context per CPU structure.
     243 */
     244VMM_INT_DECL(uint64_t) CPUMGetGuestIa32FeatCtrl(PCVMCPUCC pVCpu)
     245{
     246    uint64_t uFeatCtrlMsr = MSR_IA32_FEATURE_CONTROL_LOCK;
     247    if (pVCpu->CTX_SUFF(pVM)->cpum.s.GuestFeatures.fVmx)
     248        uFeatCtrlMsr |= MSR_IA32_FEATURE_CONTROL_VMXON;
     249    return uFeatCtrlMsr;
     250}
     251
    238252
    239253/** @callback_method_impl{FNCPUMRDMSR} */
     
    241255{
    242256    RT_NOREF_PV(idMsr); RT_NOREF_PV(pRange);
    243     *puValue = pVCpu->cpum.s.Guest.hwvirt.vmx.Msrs.u64FeatCtrl;
     257    *puValue = CPUMGetGuestIa32FeatCtrl(pVCpu);
    244258    return VINF_SUCCESS;
    245259}
  • trunk/src/VBox/VMM/VMMAll/HMAll.cpp

    r91271 r91323  
    821821    AssertReturnVoid(pHwvirtMsrs);
    822822    AssertReturnVoid(pVmxMsrs);
    823     pVmxMsrs->u64FeatCtrl      = pHwvirtMsrs->u.vmx.u64FeatCtrl;
    824823    pVmxMsrs->u64Basic         = pHwvirtMsrs->u.vmx.u64Basic;
    825824    pVmxMsrs->PinCtls.u        = pHwvirtMsrs->u.vmx.PinCtls.u;
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r91305 r91323  
    84958495
    84968496        /* Feature control MSR's LOCK and VMXON bits. */
    8497         uint64_t const uMsrFeatCtl = pVCpu->cpum.GstCtx.hwvirt.vmx.Msrs.u64FeatCtrl;
     8497        uint64_t const uMsrFeatCtl = CPUMGetGuestIa32FeatCtrl(pVCpu);
    84988498        if ((uMsrFeatCtl & (MSR_IA32_FEATURE_CONTROL_LOCK | MSR_IA32_FEATURE_CONTROL_VMXON))
    84998499                        == (MSR_IA32_FEATURE_CONTROL_LOCK | MSR_IA32_FEATURE_CONTROL_VMXON))
  • trunk/src/VBox/VMM/VMMR0/HMR0.cpp

    r91281 r91323  
    388388        g_uHmVmxHostMsrEfer = ASMRdMsr(MSR_K6_EFER);
    389389
    390         /* Get VMX MSRs for determining VMX features we can ultimately use. */
     390        /* Get VMX MSRs (and feature control MSR) for determining VMX features we can ultimately use. */
    391391        SUPR0GetHwvirtMsrs(&g_HmMsrs, SUPVTCAPS_VT_X, false /* fForce */);
    392392
     
    11781178        pVM->hm.s.ForR3.vmx.u64HostMsrEfer          = g_uHmVmxHostMsrEfer;
    11791179        pVM->hm.s.ForR3.vmx.u64HostSmmMonitorCtl    = g_uHmVmxHostSmmMonitorCtl;
     1180        pVM->hm.s.ForR3.vmx.u64HostFeatCtrl         = g_HmMsrs.u.vmx.u64FeatCtrl;
    11801181        HMGetVmxMsrsFromHwvirtMsrs(&g_HmMsrs, &pVM->hm.s.ForR3.vmx.Msrs);
    11811182        /* If you need to tweak host MSRs for testing VMX R0 code, do it here. */
  • trunk/src/VBox/VMM/VMMR0/NEMR0Native-win.cpp

    r91281 r91323  
    21152115        {
    21162116            Assert(pInput->Names[iReg] == HvX64RegisterIa32FeatureControl);
    2117             if (paValues[iReg].Reg64 != pCtx->hwvirt.vmx.Msrs.u64FeatCtrl)
    2118                 Log7(("NEM/%u: MSR FEATURE_CONTROL changed %RX64 -> %RX64 (!!)\n", pGVCpu->idCpu, pCtx->hwvirt.vmx.Msrs.u64FeatCtrl, paValues[iReg].Reg64));
     2117            uint64_t const uFeatCtrl = CPUMGetGuestIa32FeatCtrl(pVCpu);
     2118            if (paValues[iReg].Reg64 != uFeatCtrl)
     2119                Log7(("NEM/%u: MSR FEATURE_CONTROL changed %RX64 -> %RX64 (!!)\n", pGVCpu->idCpu, uFeatCtrl, paValues[iReg].Reg64));
    21192120            iReg++;
    21202121        }
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r91306 r91323  
    12771277     */
    12781278
    1279     /* Feature control. */
    1280     pGuestVmxMsrs->u64FeatCtrl = MSR_IA32_FEATURE_CONTROL_LOCK | MSR_IA32_FEATURE_CONTROL_VMXON;
    1281 
    12821279    /* Basic information. */
    12831280    {
     
    24072404            SSMR3PutU16(pSSM,      pGstCtx->hwvirt.vmx.offVirtApicWrite);
    24082405            SSMR3PutBool(pSSM,     pGstCtx->hwvirt.vmx.fVirtNmiBlocking);
    2409             SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.Msrs.u64FeatCtrl);
     2406            SSMR3PutU64(pSSM,      MSR_IA32_FEATURE_CONTROL_LOCK | MSR_IA32_FEATURE_CONTROL_VMXON); /* Deprecated since 2021/09/22. Value kept backwards compatibile with 6.1.26. */
    24102407            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.Msrs.u64Basic);
    24112408            SSMR3PutU64(pSSM,      pGstCtx->hwvirt.vmx.Msrs.PinCtls.u);
     
    26972694                        SSMR3GetU16(pSSM,      &pGstCtx->hwvirt.vmx.offVirtApicWrite);
    26982695                        SSMR3GetBool(pSSM,     &pGstCtx->hwvirt.vmx.fVirtNmiBlocking);
    2699                         SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.Msrs.u64FeatCtrl);
     2696                        SSMR3Skip(pSSM,        sizeof(uint64_t)); /* Unused - used to be IA32_FEATURE_CONTROL, see @bugref{10106}. */
    27002697                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.Msrs.u64Basic);
    27012698                        SSMR3GetU64(pSSM,      &pGstCtx->hwvirt.vmx.Msrs.PinCtls.u);
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r91270 r91323  
    10521052    {
    10531053        LogRel(("HM: Failed to initialize VT-x / AMD-V: %Rrc\n", pVM->hm.s.ForR3.rcInit));
    1054         LogRel(("HM: VMX MSR_IA32_FEATURE_CONTROL=%RX64\n", pVM->hm.s.ForR3.vmx.Msrs.u64FeatCtrl));
     1054        LogRel(("HM: VMX MSR_IA32_FEATURE_CONTROL=%RX64\n", pVM->hm.s.ForR3.vmx.u64HostFeatCtrl));
    10551055        switch (pVM->hm.s.ForR3.rcInit)
    10561056        {
     
    14931493
    14941494    LogFunc(("pVM->hm.s.vmx.fSupported = %d\n", pVM->hm.s.vmx.fSupported));
    1495     AssertLogRelReturn(pVM->hm.s.ForR3.vmx.Msrs.u64FeatCtrl != 0, VERR_HM_IPE_4);
     1495    AssertLogRelReturn(pVM->hm.s.ForR3.vmx.u64HostFeatCtrl != 0, VERR_HM_IPE_4);
    14961496
    14971497    LogRel(("HM: Using VT-x implementation 3.0\n"));
    14981498    LogRel(("HM: Max resume loops                  = %u\n",     pVM->hm.s.cMaxResumeLoopsCfg));
    14991499    LogRel(("HM: Host CR4                          = %#RX64\n", pVM->hm.s.ForR3.vmx.u64HostCr4));
    1500     LogRel(("HM: Host EFER                         = %#RX64\n", pVM->hm.s.ForR3.vmx.u64HostMsrEfer));
     1500    LogRel(("HM: MSR_IA32_EFER                     = %#RX64\n", pVM->hm.s.ForR3.vmx.u64HostMsrEfer));
    15011501    LogRel(("HM: MSR_IA32_SMM_MONITOR_CTL          = %#RX64\n", pVM->hm.s.ForR3.vmx.u64HostSmmMonitorCtl));
    15021502
    1503     hmR3VmxReportFeatCtlMsr(pVM->hm.s.ForR3.vmx.Msrs.u64FeatCtrl);
     1503    hmR3VmxReportFeatCtlMsr(pVM->hm.s.ForR3.vmx.u64HostFeatCtrl);
    15041504    hmR3VmxReportBasicMsr(pVM->hm.s.ForR3.vmx.Msrs.u64Basic);
    15051505
  • trunk/src/VBox/VMM/include/HMInternal.h

    r91265 r91323  
    545545            /** Host EFER value (set by ring-0 VMX init, for logging and guest NX). */
    546546            uint64_t                    u64HostMsrEfer;
     547            /** Host IA32_FEATURE_CONTROL MSR (set by ring-0 VMX init, for logging). */
     548            uint64_t                    u64HostFeatCtrl;
    547549
    548550            /** The first valid host LBR branch-from-IP stack range. */
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