VirtualBox

Changeset 96979 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 4, 2022 12:46:05 PM (2 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
153902
Message:

VMM/PGM,IEM,HM: Added a PGMPHYSHANDLER_F_NOT_IN_HM flag to better deal with a nested APIC access page. bugref:10092

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

Legend:

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

    r96978 r96979  
    39103910        if (IS_PART_INCLUDED(5))
    39113911        {
    3912             static const char s_achHandlerStates[4] = { '-', 't', 'w', 'a' };
    3913             szTmp[cch++] = s_achHandlerStates[PGM_PAGE_GET_HNDL_PHYS_STATE(pPage)];
     3912            static const char s_achHandlerStates[4*2] = { '-', 't', 'w', 'a' , '_', 'T', 'W', 'A' };
     3913            szTmp[cch++] = s_achHandlerStates[  PGM_PAGE_GET_HNDL_PHYS_STATE(pPage)
     3914                                              | ((uint8_t)PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage) << 2)];
    39143915        }
    39153916
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r96963 r96979  
    711711     * Any handlers for this page?
    712712     */
    713     if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     713    if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
    714714# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
    715715        return VBOXSTRICTRC_TODO(PGM_BTH_NAME(Trap0eHandlerDoAccessHandlers)(pVCpu, uErr, pRegFrame, pvFault, pPage, pfLockTaken,
     
    12531253    rc = pgmPhysGetPageEx(pVM, GCPhysPage, &pPage);
    12541254    AssertRCReturn(rc, rc);
    1255     if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     1255    if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
    12561256    {
    12571257        Log7Func(("MMIO: Calling NestedTrap0eHandlerDoAccessHandlers for GCPhys %RGp\n", GCPhysPage));
     
    17911791            )
    17921792    {
    1793 #   if defined(VBOX_WITH_NESTED_HWVIRT_VMX) && PGM_SHW_TYPE == PGM_TYPE_EPT && defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE)
    1794         /*
    1795          * If an "ALL" access handler has been registered for the VMX APIC-access page,
    1796          * we want to ensure EPT violations are triggered rather than EPT misconfigs
    1797          * as the former allows us to translate it to an APIC-access VM-exit. This is a
    1798          * weird case because this is not an MMIO page (it's regular guest RAM) but we
    1799          * want to treat it as an MMIO page wrt to trapping all accesses but we only
    1800          * want EPT violations for the reasons state above.
    1801          *
    1802          * NOTE! This is required even when the nested-hypervisor is not using EPT!
    1803          */
    1804         if (CPUMIsGuestVmxApicAccessPageAddr(pVCpu, GCPhysPage))
    1805         {
    1806             Log7Func(("SyncHandlerPte: VMX APIC-access page at %#RGp -> marking not present\n", GCPhysPage));
    1807             pPteDst->u = PGM_PAGE_GET_HCPHYS(pPage);
    1808             return;
    1809         }
    1810 #   endif
    1811 
    18121793        LogFlow(("SyncHandlerPte: MMIO page -> invalid \n"));
    18131794#   if PGM_SHW_TYPE == PGM_TYPE_EPT
     
    19401921            uint64_t fGstShwPteFlags = X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D;
    19411922# endif
    1942             if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    1943                 PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhysPage, fGstShwPteFlags, &PteDst);
    1944             else
     1923            if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
    19451924            {
    19461925# if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE)
     
    19931972                }
    19941973            }
     1974            else
     1975                PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhysPage, fGstShwPteFlags, &PteDst);
    19951976
    19961977            /*
     
    23112292                     */
    23122293                    SHWPTE PteDst;
    2313                     if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     2294                    if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
     2295                        SHW_PTE_SET(PteDst, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc) | PGM_PAGE_GET_HCPHYS(pPage));
     2296                    else
    23142297                        PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhys, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc), &PteDst);
    2315                     else
    2316                         SHW_PTE_SET(PteDst, GST_GET_BIG_PDE_SHW_FLAGS_4_PTE(pVCpu, PdeSrc) | PGM_PAGE_GET_HCPHYS(pPage));
    23172298
    23182299                    const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
     
    25252506#endif /* PGM_SHW_TYPE != PGM_TYPE_NONE */
    25262507
    2527 
    25282508#if !defined(IN_RING3) && defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) && PGM_SHW_TYPE == PGM_TYPE_EPT
     2509
    25292510/**
    25302511 * Sync a shadow page for a nested-guest page.
     
    25622543# ifndef VBOX_WITH_NEW_LAZY_PAGE_ALLOC
    25632544    /* Make the page writable if necessary. */
     2545    /** @todo This needs to be applied to the regular case below, not here. And,
     2546     *        no we should *NOT* make the page writble, instead we need to write
     2547     *        protect them if necessary. */
    25642548    if (   PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
    25652549        && PGM_PAGE_IS_ZERO(pPage)
     
    25822566    SHWPTE Pte;
    25832567    uint64_t const fGstShwPteFlags = pGstWalkAll->u.Ept.Pte.u & pVCpu->pgm.s.fGstEptShadowedPteMask;
    2584     if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    2585     {
     2568    if (!PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) || PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
     2569    {
     2570        /** @todo access bit. */
    25862571        Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags;
    2587 Log7Func(("regular page (%R[pgmpage]) at %RGp -> %RX64\n", pPage, GCPhysPage, Pte.u));
     2572        Log7Func(("regular page (%R[pgmpage]) at %RGp -> %RX64\n", pPage, GCPhysPage, Pte.u));
    25882573    }
    25892574    else if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
     
    25952580    else
    25962581    {
    2597 # if defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE)
    2598         if (CPUMIsGuestVmxApicAccessPageAddr(pVCpu, GCPhysPage))
    2599         {
    2600             Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags;
    2601             Log7Func(("APIC-access page at %RGp -> shadowing nested-hypervisor %RX64 (%RGp)\n", GCPhysPage, fGstShwPteFlags, pShwPage->GCPhys));
    2602         }
    2603 #  if 0 /** @todo r=bird: What on earth is the rational for this? */
    2604         else if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
    2605         {
    2606             if (fGstShwPteFlags & EPT_E_WRITE)
    2607             {
    2608                 PGMHandlerPhysicalPageTempOff(pVCpu->CTX_SUFF(pVM), GCPhysPage, GCPhysPage);
    2609                 Log7Func(("monitored page (%R[pgmpage]) at %RGp -> read-write, monitoring disabled\n", pPage, GCPhysPage));
    2610             }
    2611             Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags;
    2612             Log7Func(("monitored page (%R[pgmpage]) at %RGp -> shadowing nested-hypervisor %RX64\n", pPage, GCPhysPage, fGstShwPteFlags));
    2613         }
    2614 #  endif
    2615         else
    2616 # endif
    2617         {
    2618 # if defined(PGM_WITH_NESTED_APIC_ACCESS_PAGE)
    2619             /** @todo Track using fVirtVmxApicAccess bit in PGMPHYSHANDLER and maybe in PGMPAGE
    2620              *        too? */
    2621             /** @todo r=bird: this is wrong for device passthru among other scenarios.   */
    2622             PGMHandlerPhysicalDeregister(pVCpu->CTX_SUFF(pVM), GCPhysPage);
    2623             Pte.u = PGM_PAGE_GET_HCPHYS(pPage) | fGstShwPteFlags;
    2624             Log7Func(("MMIO at %RGp potentially former VMX APIC-access page -> unregistered\n", GCPhysPage));
    2625 # else
    2626             /** @todo Do MMIO optimizations here too? */
    2627             Log7Func(("mmio page (%R[pgmpage]) at %RGp -> 0\n", pPage, GCPhysPage));
    2628             Pte.u = 0;
    2629 # endif
    2630         }
     2582        /** @todo Do MMIO optimizations here too? */
     2583        Log7Func(("mmio/all page (%R[pgmpage]) at %RGp -> 0\n", pPage, GCPhysPage));
     2584        Pte.u = 0;
    26312585    }
    26322586
     
    29692923    return rc;
    29702924}
     2925
    29712926#endif  /* !IN_RING3 && VBOX_WITH_NESTED_HWVIRT_VMX_EPT && PGM_SHW_TYPE == PGM_TYPE_EPT*/
    2972 
    2973 
    29742927#if PGM_WITH_PAGING(PGM_GST_TYPE, PGM_SHW_TYPE) && PGM_SHW_TYPE != PGM_TYPE_NONE
    29752928
     
    30743027                    if (RT_LIKELY(pPage))
    30753028                    {
    3076                         if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     3029                        if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
    30773030                        {
    30783031                            //AssertMsgFailed(("%R[pgmpage] - we don't set PGM_PTFLAGS_TRACK_DIRTY for these pages\n", pPage));
     
    34963449# endif
    34973450
    3498                         if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
     3451                        if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage))
    34993452                            PGM_BTH_NAME(SyncHandlerPte)(pVM, pVCpu, pPage, GCPhys, SHW_PTE_GET_U(PteDstBase), &PteDst);
    35003453                        else if (PGM_PAGE_IS_BALLOONED(pPage))
     
    45984551
    45994552                            /* flags */
    4600                             if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPhysPage))
     4553                            if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPhysPage) && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage))
    46014554                            {
    46024555                                if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPhysPage))
     
    48384791                                    if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
    48394792                                    {
    4840                                         if (SHW_PTE_IS_RW(PteDst))
     4793                                        if (   SHW_PTE_IS_RW(PteDst)
     4794                                            && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage))
    48414795                                        {
    48424796                                            AssertMsgFailed(("WRITE access flagged at %RGv but the page is writable! pPhysPage=%R[pgmpage] PdeSrc=%#RX64 PteDst=%#RX64\n",
     
    48514805                                {
    48524806                                    if (   SHW_PTE_IS_P(PteDst)
     4807                                        && !PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPhysPage)
    48534808#  if PGM_SHW_TYPE == PGM_TYPE_EPT || PGM_SHW_TYPE == PGM_TYPE_PAE || PGM_SHW_TYPE == PGM_TYPE_AMD64
    48544809                                        && !PGM_PAGE_IS_MMIO(pPhysPage)
  • trunk/src/VBox/VMM/VMMAll/PGMAllHandler.cpp

    r96407 r96979  
    7070    /* .fRing0DevInsIdx = */    false,
    7171#ifdef IN_RING0
    72     /* .afPadding = */          {false},
     72    /* .fNotInHm = */           false,
    7373    /* .pfnHandler = */         pgmR0HandlerPhysicalHandlerToRing3,
    7474    /* .pfnPfHandler = */       pgmR0HandlerPhysicalPfHandlerToRing3,
    7575#elif defined(IN_RING3)
    7676    /* .fRing0Enabled = */      false,
     77    /* .fNotInHm = */           false,
    7778    /* .pfnHandler = */         pgmR3HandlerPhysicalHandlerInvalid,
    7879#else
     
    236237    {
    237238        case PGMPHYSHANDLERKIND_WRITE:
    238             break;
     239            if (!pType->fNotInHm)
     240                break;
     241            RT_FALL_THRU(); /* Simplification: fNotInHm can only be used with full pages */
    239242        case PGMPHYSHANDLERKIND_MMIO:
    240243        case PGMPHYSHANDLERKIND_ALL:
     
    384387        if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState)
    385388        {
    386             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState);
     389            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState, pCurType->fNotInHm);
    387390
    388391            const RTGCPHYS GCPhysPage = pRam->GCPhys + (i << GUEST_PAGE_SHIFT);
     
    685688    /*
    686689     * Update if we found something that is a higher priority state than the current.
     690     * Note! The PGMPHYSHANDLER_F_NOT_IN_HM can be ignored here as it requires whole pages.
    687691     */
    688692    if (uState != PGM_PAGE_HNDL_PHYS_STATE_NONE)
     
    690694        PPGMPAGE pPage;
    691695        int rc = pgmPhysGetPageWithHintEx(pVM, GCPhys, &pPage, ppRamHint);
    692         if (    RT_SUCCESS(rc)
    693             &&  PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState)
     696        if (   RT_SUCCESS(rc)
     697            && PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) < uState)
    694698        {
    695699            /* This should normally not be necessary. */
    696             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState);
    697             bool fFlushTLBs ;
     700            PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, uState);
     701            bool fFlushTLBs;
    698702            rc = pgmPoolTrackUpdateGCPhys(pVM, GCPhys, pPage, false /*fFlushPTEs*/, &fFlushTLBs);
    699703            if (RT_SUCCESS(rc) && fFlushTLBs)
     
    757761    PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ZERO);
    758762    PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID);
    759     PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_ALL);
     763    PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_ALL);
    760764
    761765    /* Flush its TLB entry. */
     
    839843                      ("%RGp %R[pgmpage]\n", GCPhys, pPage));
    840844#endif
    841             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE);
     845            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE, false);
    842846
    843847#ifdef VBOX_WITH_NATIVE_NEM
     
    13991403            if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
    14001404            {
    1401                 PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
     1405                PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
    14021406                pCur->cTmpOffPages++;
    14031407
     
    16031607            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED);
    16041608            PGM_PAGE_SET_PAGEID(pVM, pPage, PGM_PAGE_GET_PAGEID(pPageRemap));
    1605             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
     1609            PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
    16061610            pCur->cAliasedPages++;
    16071611            Assert(pCur->cAliasedPages <= pCur->cPages);
     
    17271731            PGM_PAGE_SET_STATE(pVM, pPage, PGM_PAGE_STATE_ALLOCATED);
    17281732            PGM_PAGE_SET_PAGEID(pVM, pPage, NIL_GMM_PAGEID);
    1729             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
     1733            PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(pPage, PGM_PAGE_HNDL_PHYS_STATE_DISABLED);
    17301734            pCur->cAliasedPages++;
    17311735            Assert(pCur->cAliasedPages <= pCur->cPages);
     
    19081912                    {
    19091913                        PCPGMPHYSHANDLERTYPEINT pPhysType = pgmHandlerPhysicalTypeHandleToPtr(pVM, pPhys->hType);
    1910                         unsigned uState = pPhysType->uState;
     1914                        unsigned   uState   = pPhysType->uState;
     1915                        bool const fNotInHm = pPhysType->fNotInHm; /* whole pages, so no need to accumulate sub-page configs. */
    19111916
    19121917                        /* more? */
     
    19341939                            State.cErrors++;
    19351940                        }
     1941                        AssertMsgStmt(PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage) == fNotInHm,
     1942                                      ("ram range vs phys handler flags mismatch. GCPhys=%RGp fNotInHm=%d, %d %s\n",
     1943                                       State.GCPhys, PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(pPage), fNotInHm, pPhysType->pszDesc),
     1944                                      State.cErrors++);
    19361945                    }
    19371946                    else
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r96966 r96979  
    33713371            if (!fFlushPTEs)
    33723372            {
     3373                /* Note! Disregarding the PGMPHYSHANDLER_F_NOT_IN_HM bit here. Should be harmless. */
    33733374                switch (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage))
    33743375                {
     
    34473448            if (!fFlushPTEs)
    34483449            {
     3450                /* Note! Disregarding the PGMPHYSHANDLER_F_NOT_IN_HM bit here. Should be harmless. */
    34493451                switch (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage))
    34503452                {
  • trunk/src/VBox/VMM/VMMR0/IEMR0.cpp

    r96407 r96979  
    5353    if (pGVM->cpum.ro.GuestFeatures.fVmx)
    5454    {
    55         int rc = PGMR0HandlerPhysicalTypeSetUpContext(pGVM, PGMPHYSHANDLERKIND_ALL, 0 /*fFlags*/,
     55        int rc = PGMR0HandlerPhysicalTypeSetUpContext(pGVM, PGMPHYSHANDLERKIND_ALL, PGMPHYSHANDLER_F_NOT_IN_HM,
    5656                                                      iemVmxApicAccessPageHandler, iemVmxApicAccessPagePfHandler,
    5757                                                      "VMX APIC-access page", pGVM->iem.s.hVmxApicAccessPage);
  • trunk/src/VBox/VMM/VMMR0/PGMR0.cpp

    r96735 r96979  
    895895                    VERR_INVALID_HANDLE);
    896896    AssertMsgReturn(pTypeR3->fKeepPgmLock == RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK),
    897                     ("%#x: %d, fFlags=%d\n", hType, pTypeR3->fKeepPgmLock, fFlags),
     897                    ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fKeepPgmLock, fFlags),
    898898                    VERR_INVALID_HANDLE);
    899899    AssertMsgReturn(pTypeR3->fRing0DevInsIdx == RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX),
    900                     ("%#x: %d, fFlags=%d\n", hType, pTypeR3->fRing0DevInsIdx, fFlags),
     900                    ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fRing0DevInsIdx, fFlags),
     901                    VERR_INVALID_HANDLE);
     902    AssertMsgReturn(pTypeR3->fNotInHm == RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM),
     903                    ("%#x: %d, fFlags=%#x\n", hType, pTypeR3->fNotInHm, fFlags),
    901904                    VERR_INVALID_HANDLE);
    902905
     
    909912    pTypeR0->fKeepPgmLock     = RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK);
    910913    pTypeR0->fRing0DevInsIdx  = RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX);
     914    pTypeR0->fNotInHm         = RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM);
    911915    pTypeR0->pfnHandler       = pfnHandler;
    912916    pTypeR0->pfnPfHandler     = pfnPfHandler;
     
    12961300    {
    12971301        PCPGMPHYSHANDLERTYPEINT pHandlerType = PGMPHYSHANDLER_GET_TYPE_NO_NULL(pGVM, pHandler);
    1298         if (RT_LIKELY(pHandlerType->enmKind != PGMPHYSHANDLERKIND_WRITE))
     1302        if (RT_LIKELY(   pHandlerType->enmKind != PGMPHYSHANDLERKIND_WRITE
     1303                      && !pHandlerType->fNotInHm /*paranoia*/ ))
    12991304        {
    13001305            /*
  • trunk/src/VBox/VMM/VMMR3/IEMR3.cpp

    r96811 r96979  
    246246    if (pVM->cpum.ro.GuestFeatures.fVmx)
    247247    {
    248         rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_ALL, 0 /*fFlags*/,
     248        rc = PGMR3HandlerPhysicalTypeRegister(pVM, PGMPHYSHANDLERKIND_ALL, PGMPHYSHANDLER_F_NOT_IN_HM,
    249249                                              iemVmxApicAccessPageHandler,
    250250                                              "VMX APIC-access page", &pVM->iem.s.hVmxApicAccessPage);
  • trunk/src/VBox/VMM/VMMR3/PGMHandler.cpp

    r96407 r96979  
    128128    pType->fKeepPgmLock     = RT_BOOL(fFlags & PGMPHYSHANDLER_F_KEEP_PGM_LOCK);
    129129    pType->fRing0DevInsIdx  = RT_BOOL(fFlags & PGMPHYSHANDLER_F_R0_DEVINS_IDX);
     130    pType->fNotInHm         = RT_BOOL(fFlags & PGMPHYSHANDLER_F_NOT_IN_HM);
    130131    pType->pfnHandler       = pfnHandler;
    131132    pType->pszDesc          = pszDesc;
     
    182183        if (RT_SUCCESS(rc))
    183184        {
    184             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE);
     185            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, PGM_PAGE_HNDL_PHYS_STATE_NONE, false);
    185186
    186187#ifdef VBOX_WITH_NATIVE_NEM
     
    228229        if (RT_SUCCESS(rc))
    229230        {
    230             PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState);
     231            PGM_PAGE_SET_HNDL_PHYS_STATE(pPage, uState, pType->fNotInHm);
    231232
    232233#ifdef VBOX_WITH_NATIVE_NEM
  • trunk/src/VBox/VMM/include/PGMInternal.h

    r96958 r96979  
    8686
    8787/**
    88  * Enables the nested APIC access page support tweaks in PGM.
    89  * If disabled, the nested VM's APIC accesses will by MMIO based in VT-x mode.
    90  */
    91 //#define PGM_WITH_NESTED_APIC_ACCESS_PAGE
    92 
    93 /**
    9488 * Enables optimizations for MMIO handlers that exploits X86_TRAP_PF_RSVD and
    9589 * VMX_EXIT_EPT_MISCONFIG.
     
    526520     * @sa PGMPHYSHANDLER_F_R0_DEVINS_IDX  */
    527521    bool                                fRing0DevInsIdx;
    528     bool                                afPadding[1];
     522    /** See PGMPHYSHANDLER_F_NOT_IN_HM. */
     523    bool                                fNotInHm : 1;
    529524    /** Pointer to the ring-0 callback function. */
    530525    R0PTRTYPE(PFNPGMPHYSHANDLER)        pfnHandler;
     
    557552    /** Set by ring-0 if the handler is ring-0 enabled (for debug). */
    558553    bool                                fRing0Enabled : 1;
     554    /** See PGMPHYSHANDLER_F_NOT_IN_HM. */
     555    bool                                fNotInHm : 1;
    559556    /** Pointer to the ring-3 callback function. */
    560557    R3PTRTYPE(PFNPGMPHYSHANDLER)        pfnHandler;
     
    662659         * (PGM_PAGE_PDE_TYPE_*). */
    663660        uint64_t    u2PDETypeY          : 2;
    664         /** 4     - Unused (was used by FTE for dirty tracking). */
    665         uint64_t    fUnused1            : 1;
     661        /** 4     - Don't apply the physical handler in HM mode (nested APIC hack). */
     662        uint64_t    fHandlerPhysNotInHm : 1;
    666663        /** 5     - Flag indicating that a write monitored page was written to
    667664         *  when set. */
     
    10601057 * @param   a_pPage     Pointer to the physical guest page tracking structure.
    10611058 * @param   a_uState    The new state value.
    1062  */
    1063 #define PGM_PAGE_SET_HNDL_PHYS_STATE(a_pPage, a_uState) \
     1059 * @param   a_fNotIHm   The PGMPHYSHANDLER_F_NOT_HM bit.
     1060 */
     1061#define PGM_PAGE_SET_HNDL_PHYS_STATE(a_pPage, a_uState, a_fNotInHm) \
     1062    do { (a_pPage)->s.u2HandlerPhysStateY = (a_uState);  (a_pPage)->s.fHandlerPhysNotInHm = (a_fNotInHm); } while (0)
     1063
     1064/**
     1065 * Sets the physical access handler state of a page.
     1066 * @param   a_pPage     Pointer to the physical guest page tracking structure.
     1067 * @param   a_uState    The new state value.
     1068 */
     1069#define PGM_PAGE_SET_HNDL_PHYS_STATE_ONLY(a_pPage, a_uState) \
    10641070    do { (a_pPage)->s.u2HandlerPhysStateY = (a_uState); } while (0)
    10651071
     
    11041110    ( PGM_PAGE_GET_HNDL_PHYS_STATE(a_pPage) == PGM_PAGE_HNDL_PHYS_STATE_ALL )
    11051111
     1112/** @def PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM
     1113 * Checks if the physical handlers of the page should be ignored in shadow page
     1114 * tables and such.
     1115 * @returns true/false
     1116 * @param   a_pPage     Pointer to the physical guest page tracking structure.
     1117 */
     1118#define PGM_PAGE_IS_HNDL_PHYS_NOT_IN_HM(a_pPage) ((a_pPage)->s.fHandlerPhysNotInHm)
    11061119
    11071120/** @def PGM_PAGE_GET_TRACKING
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r96511 r96979  
    436436    CHECK_EXPR(PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(&Page) == false);
    437437
    438     PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_ALL);
     438    PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_ALL, false);
    439439    CHECK_EXPR(PGM_PAGE_GET_HNDL_PHYS_STATE(&Page) == PGM_PAGE_HNDL_PHYS_STATE_ALL);
    440440    CHECK_EXPR(PGM_PAGE_HAS_ANY_HANDLERS(&Page) == true);
     
    442442    CHECK_EXPR(PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(&Page) == true);
    443443
    444     PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_WRITE);
     444    PGM_PAGE_SET_HNDL_PHYS_STATE(&Page, PGM_PAGE_HNDL_PHYS_STATE_WRITE, false);
    445445    CHECK_EXPR(PGM_PAGE_GET_HNDL_PHYS_STATE(&Page) == PGM_PAGE_HNDL_PHYS_STATE_WRITE);
    446446    CHECK_EXPR(PGM_PAGE_HAS_ANY_HANDLERS(&Page) == true);
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