VirtualBox

Changeset 87547 in vbox


Ignore:
Timestamp:
Feb 2, 2021 5:33:49 PM (4 years ago)
Author:
vboxsync
Message:

VMM/HMVMX: Moved fUnrestrictedGuest member from HM::vmx to HMR0PERVM::vmx. bugref:9217

Location:
trunk/src/VBox/VMM
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/HMAll.cpp

    r87543 r87547  
    648648    return HMIsEnabled(pVM)
    649649        && CTX_EXPR(pVM->hm.s.fNestedPagingCfg, pVM->hmr0.s.fNestedPaging, RT_NOTHING)
    650         && (   pVM->hm.s.vmx.fUnrestrictedGuest
     650        && (   CTX_EXPR(pVM->hm.s.vmx.fUnrestrictedGuestCfg, pVM->hmr0.s.vmx.fUnrestrictedGuest, RT_NOTHING)
    651651            || pVM->hm.s.svm.fSupported);
    652652}
  • trunk/src/VBox/VMM/VMMAll/HMVMXAll.cpp

    r87543 r87547  
    605605{
    606606    Assert(HMIsEnabled(pVM));
    607     Assert(   ( pVM->hm.s.vmx.fUnrestrictedGuest && !pVM->hm.s.vmx.pRealModeTSS)
    608            || (!pVM->hm.s.vmx.fUnrestrictedGuest && pVM->hm.s.vmx.pRealModeTSS));
     607    bool const fUnrestrictedGuest = CTX_EXPR(pVM->hm.s.vmx.fUnrestrictedGuestCfg, pVM->hmr0.s.vmx.fUnrestrictedGuest, RT_NOTHING);
     608    Assert(   ( fUnrestrictedGuest && !pVM->hm.s.vmx.pRealModeTSS)
     609           || (!fUnrestrictedGuest && pVM->hm.s.vmx.pRealModeTSS));
    609610
    610611    pVCpu->hm.s.fActive = false;
    611612
    612     bool const fSupportsRealMode = pVM->hm.s.vmx.fUnrestrictedGuest || PDMVmmDevHeapIsEnabled(pVM);
    613     if (!pVM->hm.s.vmx.fUnrestrictedGuest)
     613    bool const fSupportsRealMode = fUnrestrictedGuest || PDMVmmDevHeapIsEnabled(pVM);
     614    if (!fUnrestrictedGuest)
    614615    {
    615616        /*
  • trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp

    r87546 r87547  
    38793879
    38803880    /* Enable unrestricted guest execution. */
    3881     if (pVM->hm.s.vmx.fUnrestrictedGuest)
     3881    if (pVM->hmr0.s.vmx.fUnrestrictedGuest)
    38823882        fVal |= VMX_PROC_CTLS2_UNRESTRICTED_GUEST;
    38833883
     
    39713971    if (!pVM->hmr0.s.fNestedPaging)
    39723972    {
    3973         Assert(!pVM->hm.s.vmx.fUnrestrictedGuest);
     3973        Assert(!pVM->hmr0.s.vmx.fUnrestrictedGuest);
    39743974        fVal |= VMX_PROC_CTLS_INVLPG_EXIT
    39753975             |  VMX_PROC_CTLS_CR3_LOAD_EXIT
     
    40294029
    40304030    /* Sanity check, should not really happen. */
    4031     if (RT_LIKELY(!pVM->hm.s.vmx.fUnrestrictedGuest))
     4031    if (RT_LIKELY(!pVM->hmr0.s.vmx.fUnrestrictedGuest))
    40324032    { /* likely */ }
    40334033    else
     
    45124512
    45134513    /*
    4514      * Without unrestricted guest execution, pRealModeTSS and pNonPagingModeEPTPageTable *must*
    4515      * always be allocated. We no longer support the highly unlikely case of unrestricted guest
    4516      * without pRealModeTSS, see hmR3InitFinalizeR0Intel().
    4517      */
    4518     if (   !pVM->hm.s.vmx.fUnrestrictedGuest
    4519         &&  (   !pVM->hm.s.vmx.pNonPagingModeEPTPageTable
    4520              || !pVM->hm.s.vmx.pRealModeTSS))
    4521     {
    4522         LogRelFunc(("Invalid real-on-v86 state.\n"));
    4523         return VERR_INTERNAL_ERROR;
    4524     }
    4525 
    4526     /*
    45274514     * Check that nested paging is supported if enabled and copy over the flag to the
    45284515     * ring-0 only structure.
     
    45344521    pVM->hmr0.s.fNestedPaging = fNestedPaging;
    45354522    pVM->hmr0.s.fAllow64BitGuests = pVM->hm.s.fAllow64BitGuestsCfg;
     4523
     4524    /*
     4525     * Without unrestricted guest execution, pRealModeTSS and pNonPagingModeEPTPageTable *must*
     4526     * always be allocated. We no longer support the highly unlikely case of unrestricted guest
     4527     * without pRealModeTSS, see hmR3InitFinalizeR0Intel().
     4528     */
     4529    bool const fUnrestrictedGuest = pVM->hm.s.vmx.fUnrestrictedGuestCfg;
     4530    AssertReturn(   !fUnrestrictedGuest
     4531                || (   (g_HmMsrs.u.vmx.ProcCtls2.n.allowed1 & VMX_PROC_CTLS2_UNRESTRICTED_GUEST)
     4532                    && fNestedPaging),
     4533                    VERR_INCOMPATIBLE_CONFIG);
     4534    if (   !fUnrestrictedGuest
     4535        &&  (   !pVM->hm.s.vmx.pNonPagingModeEPTPageTable
     4536             || !pVM->hm.s.vmx.pRealModeTSS))
     4537    {
     4538        LogRelFunc(("Invalid real-on-v86 state.\n"));
     4539        return VERR_INTERNAL_ERROR;
     4540    }
     4541    pVM->hmr0.s.vmx.fUnrestrictedGuest = fUnrestrictedGuest;
    45364542
    45374543    /* Initialize these always, see hmR3InitFinalizeR0().*/
     
    56525658        uint64_t       fSetCr0 = g_HmMsrs.u.vmx.u64Cr0Fixed0;
    56535659        uint64_t const fZapCr0 = g_HmMsrs.u.vmx.u64Cr0Fixed1;
    5654         if (pVM->hm.s.vmx.fUnrestrictedGuest)
     5660        if (pVM->hmr0.s.vmx.fUnrestrictedGuest)
    56555661            fSetCr0 &= ~(uint64_t)(X86_CR0_PE | X86_CR0_PG);
    56565662        else
     
    56845690
    56855691                /* If we have unrestricted guest execution, we never have to intercept CR3 reads. */
    5686                 if (pVM->hm.s.vmx.fUnrestrictedGuest)
     5692                if (pVM->hmr0.s.vmx.fUnrestrictedGuest)
    56875693                    uProcCtls &= ~VMX_PROC_CTLS_CR3_STORE_EXIT;
    56885694            }
     
    58635869            uint64_t  u64GuestCr3;
    58645870            PCCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    5865             if (   pVM->hm.s.vmx.fUnrestrictedGuest
     5871            if (   pVM->hmr0.s.vmx.fUnrestrictedGuest
    58665872                || CPUMIsGuestPagingEnabledEx(pCtx))
    58675873            {
     
    59735979        {
    59745980            if (   !CPUMIsGuestPagingEnabledEx(pCtx)
    5975                 && !pVM->hm.s.vmx.fUnrestrictedGuest)
     5981                && !pVM->hmr0.s.vmx.fUnrestrictedGuest)
    59765982            {
    59775983                /* We use 4 MB pages in our identity mapping page table when the guest doesn't have paging. */
     
    62356241    PCCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    62366242    hmR0VmxImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_CR0);
    6237     if (   !pVM->hm.s.vmx.fUnrestrictedGuest
     6243    if (   !pVM->hmr0.s.vmx.fUnrestrictedGuest
    62386244        && (   !CPUMIsGuestInRealModeEx(pCtx)
    62396245            && !CPUMIsGuestInV86ModeEx(pCtx)))
     
    63416347    else if (   CPUMIsGuestInV86ModeEx(pCtx)
    63426348             || (   CPUMIsGuestInRealModeEx(pCtx)
    6343                  && !pVM->hm.s.vmx.fUnrestrictedGuest))
     6349                 && !pVM->hmr0.s.vmx.fUnrestrictedGuest))
    63446350    {
    63456351        /* Real and v86 mode checks. */
     
    67826788             */
    67836789            uint64_t uGuestEferMsr = pCtx->msrEFER;
    6784             if (!pVM->hm.s.vmx.fUnrestrictedGuest)
     6790            if (!pVM->hmr0.s.vmx.fUnrestrictedGuest)
    67856791            {
    67866792                if (!(pCtx->msrEFER & MSR_K6_EFER_LMA))
     
    78857891                {
    78867892                    /* CR0.PG bit changes are always intercepted, so it's up to date. */
    7887                     if (   pVM->hm.s.vmx.fUnrestrictedGuest
     7893                    if (   pVM->hmr0.s.vmx.fUnrestrictedGuest
    78887894                        || (   pVM->hmr0.s.fNestedPaging
    78897895                            && CPUMIsGuestPagingEnabledEx(pCtx)))
     
    87988804    if (CPUMIsGuestInRealModeEx(pCtx))     /* CR0.PE bit changes are always intercepted, so it's up to date. */
    87998805    {
    8800         if (pVCpu->CTX_SUFF(pVM)->hm.s.vmx.fUnrestrictedGuest)
     8806        if (pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fUnrestrictedGuest)
    88018807        {
    88028808            /*
     
    94859491     */
    94869492    PVMXVMCSINFOSHARED pVmcsInfoShared = pVmxTransient->pVmcsInfo->pShared;
    9487     if (    pVCpu->CTX_SUFF(pVM)->hm.s.vmx.fUnrestrictedGuest
     9493    if (    pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fUnrestrictedGuest
    94889494        || !CPUMIsGuestInRealModeEx(&pVCpu->cpum.GstCtx))
    94899495        pVmcsInfoShared->RealMode.fRealOnV86Active = false;
     
    96779683    uint32_t uError = VMX_IGS_ERROR;
    96789684    uint32_t u32IntrState = 0;
    9679     bool const fUnrestrictedGuest = pVM->hm.s.vmx.fUnrestrictedGuest;
     9685    bool const fUnrestrictedGuest = pVM->hmr0.s.vmx.fUnrestrictedGuest;
    96809686    do
    96819687    {
     
    98879893            else if (pCtx->cs.Attr.n.u4Type == 13 || pCtx->cs.Attr.n.u4Type == 15)
    98889894                HMVMX_CHECK_BREAK(pCtx->cs.Attr.n.u2Dpl <= pCtx->ss.Attr.n.u2Dpl, VMX_IGS_CS_SS_ATTR_DPL_MISMATCH);
    9889             else if (pVM->hm.s.vmx.fUnrestrictedGuest && pCtx->cs.Attr.n.u4Type == 3)
     9895            else if (fUnrestrictedGuest && pCtx->cs.Attr.n.u4Type == 3)
    98909896                HMVMX_CHECK_BREAK(pCtx->cs.Attr.n.u2Dpl == 0, VMX_IGS_CS_ATTR_DPL_INVALID);
    98919897            else
     
    98939899
    98949900            /* SS */
    9895             HMVMX_CHECK_BREAK(   pVM->hm.s.vmx.fUnrestrictedGuest
     9901            HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    98969902                              || (pCtx->ss.Sel & X86_SEL_RPL) == (pCtx->cs.Sel & X86_SEL_RPL), VMX_IGS_SS_CS_RPL_UNEQUAL);
    98979903            HMVMX_CHECK_BREAK(pCtx->ss.Attr.n.u2Dpl == (pCtx->ss.Sel & X86_SEL_RPL), VMX_IGS_SS_ATTR_DPL_RPL_UNEQUAL);
     
    99179923                HMVMX_CHECK_BREAK(pCtx->ds.Attr.n.u4Type & X86_SEL_TYPE_ACCESSED, VMX_IGS_DS_ATTR_A_INVALID);
    99189924                HMVMX_CHECK_BREAK(pCtx->ds.Attr.n.u1Present, VMX_IGS_DS_ATTR_P_INVALID);
    9919                 HMVMX_CHECK_BREAK(   pVM->hm.s.vmx.fUnrestrictedGuest
     9925                HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    99209926                                  || pCtx->ds.Attr.n.u4Type > 11
    99219927                                  || pCtx->ds.Attr.n.u2Dpl >= (pCtx->ds.Sel & X86_SEL_RPL), VMX_IGS_DS_ATTR_DPL_RPL_UNEQUAL);
     
    99339939                HMVMX_CHECK_BREAK(pCtx->es.Attr.n.u4Type & X86_SEL_TYPE_ACCESSED, VMX_IGS_ES_ATTR_A_INVALID);
    99349940                HMVMX_CHECK_BREAK(pCtx->es.Attr.n.u1Present, VMX_IGS_ES_ATTR_P_INVALID);
    9935                 HMVMX_CHECK_BREAK(   pVM->hm.s.vmx.fUnrestrictedGuest
     9941                HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    99369942                                  || pCtx->es.Attr.n.u4Type > 11
    99379943                                  || pCtx->es.Attr.n.u2Dpl >= (pCtx->es.Sel & X86_SEL_RPL), VMX_IGS_DS_ATTR_DPL_RPL_UNEQUAL);
     
    99499955                HMVMX_CHECK_BREAK(pCtx->fs.Attr.n.u4Type & X86_SEL_TYPE_ACCESSED, VMX_IGS_FS_ATTR_A_INVALID);
    99509956                HMVMX_CHECK_BREAK(pCtx->fs.Attr.n.u1Present, VMX_IGS_FS_ATTR_P_INVALID);
    9951                 HMVMX_CHECK_BREAK(   pVM->hm.s.vmx.fUnrestrictedGuest
     9957                HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    99529958                                  || pCtx->fs.Attr.n.u4Type > 11
    99539959                                  || pCtx->fs.Attr.n.u2Dpl >= (pCtx->fs.Sel & X86_SEL_RPL), VMX_IGS_FS_ATTR_DPL_RPL_UNEQUAL);
     
    99659971                HMVMX_CHECK_BREAK(pCtx->gs.Attr.n.u4Type & X86_SEL_TYPE_ACCESSED, VMX_IGS_GS_ATTR_A_INVALID);
    99669972                HMVMX_CHECK_BREAK(pCtx->gs.Attr.n.u1Present, VMX_IGS_GS_ATTR_P_INVALID);
    9967                 HMVMX_CHECK_BREAK(   pVM->hm.s.vmx.fUnrestrictedGuest
     9973                HMVMX_CHECK_BREAK(   fUnrestrictedGuest
    99689974                                  || pCtx->gs.Attr.n.u4Type > 11
    99699975                                  || pCtx->gs.Attr.n.u2Dpl >= (pCtx->gs.Sel & X86_SEL_RPL), VMX_IGS_GS_ATTR_DPL_RPL_UNEQUAL);
     
    1059910605     */
    1060010606    PVMXVMCSINFO pVmcsInfoNstGst = &pVCpu->hmr0.s.vmx.VmcsInfoNstGst;
    10601     Assert(pVM->hm.s.vmx.fUnrestrictedGuest);
     10607    Assert(pVM->hmr0.s.vmx.fUnrestrictedGuest);
    1060210608    Assert(g_HmMsrs.u.vmx.ProcCtls.n.allowed1 & VMX_PROC_CTLS_USE_SECONDARY_CTLS);
    1060310609    Assert(hmGetVmxActiveVmcsInfo(pVCpu) == pVmcsInfoNstGst);
     
    1431214318
    1431314319    Assert(CPUMIsGuestInRealModeEx(pCtx));
    14314     Assert(!pVCpu->CTX_SUFF(pVM)->hm.s.vmx.fUnrestrictedGuest);
     14320    Assert(!pVCpu->CTX_SUFF(pVM)->hmr0.s.vmx.fUnrestrictedGuest);
    1431514321    Assert(!pVmxTransient->fIsNestedGuest);
    1431614322
     
    1552515531            if (   iCrReg == 0
    1552615532                && rcStrict == VINF_SUCCESS
    15527                 && !pVM->hm.s.vmx.fUnrestrictedGuest
     15533                && !pVM->hmr0.s.vmx.fUnrestrictedGuest
    1552815534                && CPUMIsGuestInRealModeEx(&pVCpu->cpum.GstCtx)
    1552915535                && (uOldCr0 & X86_CR0_PE)
  • trunk/src/VBox/VMM/VMMR3/HM.cpp

    r87546 r87547  
    578578                    if (   fAllowUnrestricted
    579579                        && (fCaps & SUPVTCAPS_VTX_UNRESTRICTED_GUEST))
    580                         pVM->hm.s.vmx.fUnrestrictedGuest = true;
     580                        pVM->hm.s.vmx.fUnrestrictedGuestCfg = true;
    581581                    else
    582                         Assert(!pVM->hm.s.vmx.fUnrestrictedGuest);
     582                        Assert(!pVM->hm.s.vmx.fUnrestrictedGuestCfg);
    583583                }
    584584            }
     
    15661566                       || (pVM->hm.s.vmx.MsrsForRing3.ProcCtls2.n.allowed1 & VMX_PROC_CTLS2_EPT),
    15671567                       VERR_HM_IPE_1);
    1568     AssertLogRelReturn(   !pVM->hm.s.vmx.fUnrestrictedGuest
     1568    AssertLogRelReturn(   !pVM->hm.s.vmx.fUnrestrictedGuestCfg
    15691569                       || (   (pVM->hm.s.vmx.MsrsForRing3.ProcCtls2.n.allowed1 & VMX_PROC_CTLS2_UNRESTRICTED_GUEST)
    15701570                           && pVM->hm.s.fNestedPagingCfg),
     
    15831583    }
    15841584
    1585     if (!pVM->hm.s.vmx.fUnrestrictedGuest)
     1585    if (!pVM->hm.s.vmx.fUnrestrictedGuestCfg)
    15861586    {
    15871587        /* Allocate three pages for the TSS we need for real mode emulation. (2 pages for the IO bitmap) */
     
    17061706            LogRel(("HM:   EPT flush type                  = %#x\n", pVM->hm.s.vmx.enmTlbFlushEptForRing3));
    17071707
    1708         if (pVM->hm.s.vmx.fUnrestrictedGuest)
     1708        if (pVM->hm.s.vmx.fUnrestrictedGuestCfg)
    17091709            LogRel(("HM: Enabled unrestricted guest execution\n"));
    17101710
     
    17171717    }
    17181718    else
    1719         Assert(!pVM->hm.s.vmx.fUnrestrictedGuest);
     1719        Assert(!pVM->hm.s.vmx.fUnrestrictedGuestCfg);
    17201720
    17211721    if (pVM->hm.s.vmx.fVpidForRing3)
     
    26382638     */
    26392639    if (    pVM->hm.s.vmx.fEnabled
    2640         && !pVM->hm.s.vmx.fUnrestrictedGuest
     2640        && !pVM->hm.s.vmx.fUnrestrictedGuestCfg
    26412641        &&  CPUMIsGuestInRealModeEx(pCtx)
    26422642        && !PDMVmmDevHeapIsEnabled(pVM))
     
    28522852    PVM pVM = pUVM->pVM;
    28532853    VM_ASSERT_VALID_EXT_RETURN(pVM, false);
    2854     return pVM->hm.s.vmx.fUnrestrictedGuest
     2854    return pVM->hm.s.vmx.fUnrestrictedGuestCfg
    28552855        || pVM->hm.s.svm.fSupported;
    28562856}
  • trunk/src/VBox/VMM/include/HMInternal.h

    r87546 r87547  
    487487    struct
    488488    {
    489         /** Set by the ring-0 side of HM to indicate VMX is supported by the
    490          *  CPU. */
     489        /** Set by the ring-0 side of HM to indicate VMX is supported by the CPU. */
    491490        bool                        fSupported;
    492491        /** Set when we've enabled VMX. */
     
    498497        /** Set if unrestricted guest execution is in use (real and protected mode
    499498         *  without paging). */
    500         bool                        fUnrestrictedGuest;
     499        bool                        fUnrestrictedGuestCfg;
    501500        /** Set if the preemption timer is in use or not. */
    502501        bool                        fUsePreemptTimer;
     
    644643    struct HMR0VMXVM
    645644    {
     645        /** Set if unrestricted guest execution is in use (real and protected mode
     646         *  without paging). */
     647        bool                        fUnrestrictedGuest;
     648        bool                        afAlignment1[2];
    646649        /** Set if VPID is supported (copy in HM::vmx::fVpidForRing3). */
    647650        bool                        fVpid;
    648         bool                        afAlignment1[3];
    649 
    650651        /** Tagged-TLB flush type. */
    651652        VMXTLBFLUSHTYPE             enmTlbFlushType;
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