VirtualBox

Changeset 87547 in vbox for trunk/src/VBox/VMM/VMMR0


Ignore:
Timestamp:
Feb 2, 2021 5:33:49 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
142573
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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)
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