VirtualBox

Changeset 31775 in vbox


Ignore:
Timestamp:
Aug 19, 2010 9:48:24 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
64961
Message:

PGM: Wrap up all access to PAE/LM PTEs so that we can treat the invalid entries used by PGM_WITH_MMIO_OPTIMIZATIONS as not-present.

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/PGM.cpp

    r31684 r31775  
    35583558 * @param   pHlp        Pointer to the output functions.
    35593559 */
    3560 static int  pgmR3DumpHierarchyHCPaePT(PVM pVM, PX86PTPAE pPT, uint64_t u64Address, bool fLongMode, unsigned cMaxDepth, PCDBGFINFOHLP pHlp)
     3560static int  pgmR3DumpHierarchyHCPaePT(PVM pVM, PCPGMSHWPTPAE pPT, uint64_t u64Address, bool fLongMode, unsigned cMaxDepth, PCDBGFINFOHLP pHlp)
    35613561{
    35623562    for (unsigned i = 0; i < RT_ELEMENTS(pPT->a); i++)
    3563     {
    3564         X86PTEPAE Pte = pPT->a[i];
    3565         if (Pte.n.u1Present)
     3563        if (PGMSHWPTEPAE_IS_P(pPT->a[i]))
    35663564        {
     3565            X86PTEPAE Pte;
     3566            Pte.u = PGMSHWPTEPAE_GET_U(pPT->a[i]);
    35673567            pHlp->pfnPrintf(pHlp,
    35683568                            fLongMode       /*P R  S  A  D  G  WT CD AT NX 4M a p ?  */
     
    35843584                            Pte.u & X86_PTE_PAE_PG_MASK);
    35853585        }
    3586     }
    35873586    return VINF_SUCCESS;
    35883587}
     
    36593658                {
    36603659                    /** @todo what about using the page pool for mapping PTs? */
    3661                     uint64_t    u64AddressPT = u64Address + ((uint64_t)i << X86_PD_PAE_SHIFT);
    3662                     RTHCPHYS    HCPhysPT     = Pde.u & X86_PDE_PAE_PG_MASK;
    3663                     PX86PTPAE   pPT          = NULL;
     3660                    uint64_t        u64AddressPT = u64Address + ((uint64_t)i << X86_PD_PAE_SHIFT);
     3661                    RTHCPHYS        HCPhysPT     = Pde.u & X86_PDE_PAE_PG_MASK;
     3662                    PPGMSHWPTPAE    pPT          = NULL;
    36643663                    if (!(Pde.u & PGM_PDFLAGS_MAPPING))
    3665                         pPT = (PX86PTPAE)MMPagePhys2Page(pVM, HCPhysPT);
     3664                        pPT = (PPGMSHWPTPAE)MMPagePhys2Page(pVM, HCPhysPT);
    36663665                    else
    36673666                    {
  • trunk/src/VBox/VMM/PGMGstDefs.h

    r31080 r31775  
    7373#  define BTH_IS_NP_ACTIVE(pVM)                 (true)
    7474# else
    75 #  define GSTPT                                 SHWPT
    76 #  define PGSTPT                                PSHWPT
    77 #  define GSTPTE                                SHWPTE
    78 #  define PGSTPTE                               PSHWPTE
    79 #  define GSTPD                                 SHWPD
    80 #  define PGSTPD                                PSHWPD
    81 #  define GSTPDE                                SHWPDE
    82 #  define PGSTPDE                               PSHWPDE
    83 #  define GST_PTE_PG_MASK                       SHW_PTE_PG_MASK
     75#  if PGM_SHW_TYPE == PGM_TYPE_32BIT /* Same as shadow paging, but no PGMSHWPTEPAE. */
     76#   define GSTPT                                X86PT
     77#   define PGSTPT                               PX86PT
     78#   define GSTPTE                               X86PTE
     79#   define PGSTPTE                              PX86PTE
     80#   define GSTPD                                X86PD
     81#   define PGSTPD                               PX86PD
     82#   define GSTPDE                               X86PDE
     83#   define PGSTPDE                              PX86PDE
     84#   define GST_PTE_PG_MASK                      X86_PTE_PG_MASK
     85#  else
     86#   define GSTPT                                X86PTPAE
     87#   define PGSTPT                               PX86PTPAE
     88#   define GSTPTE                               X86PTEPAE
     89#   define PGSTPTE                              PX86PTEPAE
     90#   define GSTPD                                X86PDPAE
     91#   define PGSTPD                               PX86PDPAE
     92#   define GSTPDE                               X86PDEPAE
     93#   define PGSTPDE                              PX86PDEPAE
     94#   define GST_PTE_PG_MASK                      X86_PTE_PAE_PG_MASK
     95#  endif
    8496#  define GST_IS_NX_ACTIVE(pVCpu)               (pgmGstIsNoExecuteActive(pVCpu))
    8597#  if PGM_GST_TYPE == PGM_TYPE_PROT             /* (comment at top of PGMAllBth.h) */
  • trunk/src/VBox/VMM/PGMInternal.h

    r31657 r31775  
    413413# define PGM_INVL_ALL_VCPU_TLBS(pVM)            HWACCMFlushTLBOnAllVCpus(pVM)
    414414#endif
     415
     416
     417/** @name Safer Shadow PAE PT/PTE
     418 * For helping avoid misinterpreting invalid PAE/AMD64 page table entries as
     419 * present.
     420 *
     421 * @{
     422 */
     423#if 1
     424/**
     425 * For making sure that u1Present and X86_PTE_P checks doesn't mistake
     426 * invalid entries for present.
     427 * @sa X86PTEPAE.
     428 */
     429typedef union PGMSHWPTEPAE
     430{
     431    /** Unsigned integer view */
     432    X86PGPAEUINT    uCareful;
     433#if 0
     434    /* Not bit field view. */
     435    /** 32-bit view. */
     436    uint32_t        au32[2];
     437    /** 16-bit view. */
     438    uint16_t        au16[4];
     439    /** 8-bit view. */
     440    uint8_t         au8[8];
     441#endif
     442} PGMSHWPTEPAE;
     443
     444# define PGMSHWPTEPAE_IS_P(Pte)                 ( ((Pte).uCareful & (X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == X86_PTE_P )
     445# define PGMSHWPTEPAE_IS_RW(Pte)                ( !!((Pte).uCareful & X86_PTE_RW))
     446# define PGMSHWPTEPAE_IS_US(Pte)                ( !!((Pte).uCareful & X86_PTE_US))
     447# define PGMSHWPTEPAE_IS_A(Pte)                 ( !!((Pte).uCareful & X86_PTE_A))
     448# define PGMSHWPTEPAE_IS_D(Pte)                 ( !!((Pte).uCareful & X86_PTE_D))
     449# define PGMSHWPTEPAE_IS_TRACK_DIRTY(Pte)       ( !!((Pte).uCareful & PGM_PTFLAGS_TRACK_DIRTY) )
     450# define PGMSHWPTEPAE_IS_P_RW(Pte)              ( ((Pte).uCareful & (X86_PTE_P | X86_PTE_RW | X86_PTE_PAE_MBZ_MASK_NX)) == (X86_PTE_P | X86_PTE_RW) )
     451# define PGMSHWPTEPAE_GET_LOG(Pte)              ( (Pte).uCareful )
     452# define PGMSHWPTEPAE_GET_HCPHYS(Pte)           ( (Pte).uCareful & X86_PTE_PAE_PG_MASK )
     453# define PGMSHWPTEPAE_GET_U(Pte)                ( (Pte).uCareful ) /**< Use with care. */
     454# define PGMSHWPTEPAE_SET(Pte, uVal)            do { (Pte).uCareful = (uVal); } while (0)
     455# define PGMSHWPTEPAE_SET2(Pte, Pte2)           do { (Pte).uCareful = (Pte2).uCareful; } while (0)
     456# define PGMSHWPTEPAE_ATOMIC_SET(Pte, uVal)     do { ASMAtomicWriteU64(&(Pte).uCareful, (uVal)); } while (0)
     457# define PGMSHWPTEPAE_ATOMIC_SET2(Pte, Pte2)    do { ASMAtomicWriteU64(&(Pte).uCareful, (Pte2).uCareful); } while (0)
     458# define PGMSHWPTEPAE_SET_RO(Pte)               do { (Pte).uCareful &= ~(X86PGPAEUINT)X86_PTE_RW; } while (0)
     459# define PGMSHWPTEPAE_SET_RW(Pte)               do { (Pte).uCareful |= X86_PTE_RW; } while (0)
     460
     461/**
     462 * For making sure that u1Present and X86_PTE_P checks doesn't mistake
     463 * invalid entries for present.
     464 * @sa X86PTPAE.
     465 */
     466typedef struct PGMSHWPTPAE
     467{
     468    PGMSHWPTEPAE  a[X86_PG_PAE_ENTRIES];
     469} PGMSHWPTPAE;
     470
     471#else
     472typedef X86PTEPAE           PGMSHWPTEPAE;
     473typedef X86PTPAE            PGMSHWPTPAE;
     474# define PGMSHWPTEPAE_IS_P(Pte)                 ( (Pte).n.u1Present )
     475# define PGMSHWPTEPAE_IS_RW(Pte)                ( (Pte).n.u1Write )
     476# define PGMSHWPTEPAE_IS_US(Pte)                ( (Pte).n.u1User )
     477# define PGMSHWPTEPAE_IS_A(Pte)                 ( (Pte).n.u1Accessed )
     478# define PGMSHWPTEPAE_IS_D(Pte)                 ( (Pte).n.u1Dirty )
     479# define PGMSHWPTEPAE_IS_TRACK_DIRTY(Pte)       ( !!((Pte).u & PGM_PTFLAGS_TRACK_DIRTY) )
     480# define PGMSHWPTEPAE_IS_P_RW(Pte)              ( ((Pte).u & (X86_PTE_P | X86_PTE_RW)) == (X86_PTE_P | X86_PTE_RW) )
     481# define PGMSHWPTEPAE_GET_LOG(Pte)              ( (Pte).u )
     482# define PGMSHWPTEPAE_GET_HCPHYS(Pte)           ( (Pte).u & X86_PTE_PAE_PG_MASK )
     483# define PGMSHWPTEPAE_GET_U(Pte)                ( (Pte).u ) /**< Use with care. */
     484# define PGMSHWPTEPAE_SET(Pte, uVal)            do { (Pte).u = (uVal); } while (0)
     485# define PGMSHWPTEPAE_SET2(Pte, Pte2)           do { (Pte).u = (Pte2).u; } while (0)
     486# define PGMSHWPTEPAE_ATOMIC_SET(Pte, uVal)     do { ASMAtomicWriteU64(&(Pte).u, (uVal)); } while (0)
     487# define PGMSHWPTEPAE_ATOMIC_SET2(Pte, Pte2)    do { ASMAtomicWriteU64(&(Pte).u, (Pte2).u); } while (0)
     488# define PGMSHWPTEPAE_SET_RO(Pte)               do { (Pte).u &= ~(X86PGPAEUINT)X86_PTE_RW; } while (0)
     489# define PGMSHWPTEPAE_SET_RW(Pte)               do { (Pte).u |= X86_PTE_RW; } while (0)
     490
     491#endif
     492
     493/** Pointer to a shadow PAE PTE.  */
     494typedef PGMSHWPTEPAE       *PPGMSHWPTEPAE;
     495/** Pointer to a const shadow PAE PTE.  */
     496typedef PGMSHWPTEPAE const *PCPGMSHWPTEPAE;
     497
     498/** Pointer to a shadow PAE page table.  */
     499typedef PGMSHWPTPAE        *PPGMSHWPTPAE;
     500/** Pointer to a const shadow PAE page table.  */
     501typedef PGMSHWPTPAE const  *PCPGMSHWPTPAE;
     502/** @}  */
     503
    415504
    416505/** Size of the GCPtrConflict array in PGMMAPPING.
     
    467556        R3PTRTYPE(PX86PT)               pPTR3;
    468557        /** The HC virtual address of the two PAE page table. (i.e 1024 entries instead of 512) */
    469         R3PTRTYPE(PX86PTPAE)            paPaePTsR3;
     558        R3PTRTYPE(PPGMSHWPTPAE)         paPaePTsR3;
    470559        /** The RC virtual address of the 32-bit page table. */
    471560        RCPTRTYPE(PX86PT)               pPTRC;
    472561        /** The RC virtual address of the two PAE page table. */
    473         RCPTRTYPE(PX86PTPAE)            paPaePTsRC;
     562        RCPTRTYPE(PPGMSHWPTPAE)         paPaePTsRC;
    474563        /** The R0 virtual address of the 32-bit page table. */
    475564        R0PTRTYPE(PX86PT)               pPTR0;
    476565        /** The R0 virtual address of the two PAE page table. */
    477         R0PTRTYPE(PX86PTPAE)            paPaePTsR0;
     566        R0PTRTYPE(PPGMSHWPTPAE)         paPaePTsR0;
    478567    } aPTs[1];
    479568} PGMMAPPING;
     
    23182407 * PGMPOOL_TD_CREFS_SHIFT. */
    23192408#define PGMPOOL_TD_CREFS_MASK           0x3
    2320 /** The cRef value used to indiciate that the idx is the head of a
     2409/** The cRefs value used to indiciate that the idx is the head of a
    23212410 * physical cross reference list. */
    23222411#define PGMPOOL_TD_CREFS_PHYSEXT        PGMPOOL_TD_CREFS_MASK
     
    29173006    RCPTRTYPE(PX86PTE)              paDynPageMap32BitPTEsGC;
    29183007    /** Pointer to the page table entries for the dynamic page mapping area - GCPtr. */
    2919     RCPTRTYPE(PX86PTEPAE)           paDynPageMapPaePTEsGC;
     3008    RCPTRTYPE(PPGMSHWPTEPAE)        paDynPageMapPaePTEsGC;
    29203009
    29213010
  • trunk/src/VBox/VMM/PGMMap.cpp

    r31123 r31775  
    172172        pNew->aPTs[i].HCPhysPaePT0 = MMR3HyperHCVirt2HCPhys(pVM, pbPTs);
    173173        pNew->aPTs[i].HCPhysPaePT1 = MMR3HyperHCVirt2HCPhys(pVM, pbPTs + PAGE_SIZE);
    174         pNew->aPTs[i].paPaePTsR3 = (PX86PTPAE)pbPTs;
     174        pNew->aPTs[i].paPaePTsR3 = (PPGMSHWPTPAE)pbPTs;
    175175        pNew->aPTs[i].paPaePTsRC = MMHyperR3ToRC(pVM, pbPTs);
    176176        pNew->aPTs[i].paPaePTsR0 = MMHyperR3ToR0(pVM, pbPTs);
     
    14051405            while (cb > 0 && iPTE < RT_ELEMENTS(CTXALLSUFF(pCur->aPTs[iPT].pPT)->a))
    14061406            {
    1407                 if (!CTXALLSUFF(pCur->aPTs[iPT].paPaePTs)[iPTE / 512].a[iPTE % 512].n.u1Present)
     1407                PCPGMSHWPTEPAE pPte = &pCur->aPTs[iPT].CTXALLSUFF(paPaePTs)[iPTE / 512].a[iPTE % 512];
     1408                if (!PGMSHWPTEPAE_IS_P(*pPte))
    14081409                    return VERR_PAGE_NOT_PRESENT;
    1409                 RTHCPHYS HCPhys = CTXALLSUFF(pCur->aPTs[iPT].paPaePTs)[iPTE / 512].a[iPTE % 512].u & X86_PTE_PAE_PG_MASK;
     1410                RTHCPHYS HCPhys = PGMSHWPTEPAE_GET_HCPHYS(*pPte);
    14101411
    14111412                /*
  • trunk/src/VBox/VMM/PGMPool.cpp

    r31170 r31775  
    650650                            {
    651651                                bool fFoundFirst = false;
    652                                 PX86PTPAE pPT = (PX86PTPAE)pvShw;
     652                                PPGMSHWPTPAE pPT = (PPGMSHWPTPAE)pvShw;
    653653                                for (unsigned ptIndex = 0; ptIndex < RT_ELEMENTS(pPT->a); ptIndex++)
    654654                                {
     
    662662                                            fFoundFirst = true;
    663663                                        }
    664                                         if (pPT->a[ptIndex].n.u1Present)
     664                                        if (PGMSHWPTEPAE_IS_P(pPT->a[ptIndex]))
    665665                                        {
    666                                             pgmPoolTracDerefGCPhysHint(pPool, pPage, pPT->a[ptIndex].u & X86_PTE_PAE_PG_MASK, NIL_RTGCPHYS);
     666                                            pgmPoolTracDerefGCPhysHint(pPool, pPage, PGMSHWPTEPAE_GET_HCPHYS(pPT->a[ptIndex]), NIL_RTGCPHYS);
    667667                                            if (pPage->iFirstPresent == ptIndex)
    668668                                                pPage->iFirstPresent = NIL_PGMPOOL_PRESENT_INDEX;
     
    848848        if (pPage->enmKind == PGMPOOLKIND_PAE_PT_FOR_PAE_PT)
    849849        {
    850             PX86PTPAE pShwPT = (PX86PTPAE)PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pPage);
     850            PPGMSHWPTPAE pShwPT = (PPGMSHWPTPAE)PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pPage);
    851851            {
    852852                PX86PTPAE pGstPT;
     
    857857                for (unsigned j = 0; j < RT_ELEMENTS(pShwPT->a); j++)
    858858                {
    859                     if (pShwPT->a[j].n.u1Present)
     859                    if (PGMSHWPTEPAE_IS_P(pShwPT->a[j]))
    860860                    {
    861861                        RTHCPHYS HCPhys = NIL_RTHCPHYS;
    862862                        rc = PGMPhysGCPhys2HCPhys(pPool->CTX_SUFF(pVM), pGstPT->a[j].u & X86_PTE_PAE_PG_MASK, &HCPhys);
    863                         if (    rc != VINF_SUCCESS
    864                             ||  (pShwPT->a[j].u & X86_PTE_PAE_PG_MASK) != HCPhys)
     863                        if (   rc != VINF_SUCCESS
     864                            || PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[j]) != HCPhys)
    865865                        {
    866866                            if (fFirstMsg)
     
    869869                                fFirstMsg = false;
    870870                            }
    871                             pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch HCPhys: rc=%d idx=%d guest %RX64 shw=%RX64 vs %RHp\n", rc, j, pGstPT->a[j].u, pShwPT->a[j].u, HCPhys);
     871                            pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch HCPhys: rc=%Rrc idx=%d guest %RX64 shw=%RX64 vs %RHp\n", rc, j, pGstPT->a[j].u, PGMSHWPTEPAE_GET_LOG(pShwPT->a[j]), HCPhys);
    872872                        }
    873                         else
    874                         if (    pShwPT->a[j].n.u1Write
    875                             &&  !pGstPT->a[j].n.u1Write)
     873                        else if (   PGMSHWPTEPAE_IS_RW(pShwPT->a[j])
     874                                 && !pGstPT->a[j].n.u1Write)
    876875                        {
    877876                            if (fFirstMsg)
     
    880879                                fFirstMsg = false;
    881880                            }
    882                             pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch r/w gst/shw: idx=%d guest %RX64 shw=%RX64 vs %RHp\n", j, pGstPT->a[j].u, pShwPT->a[j].u, HCPhys);
     881                            pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch r/w gst/shw: idx=%d guest %RX64 shw=%RX64 vs %RHp\n", j, pGstPT->a[j].u, PGMSHWPTEPAE_GET_LOG(pShwPT->a[j]), HCPhys);
    883882                        }
    884883                    }
     
    899898                    if (pTempPage->enmKind == PGMPOOLKIND_PAE_PT_FOR_PAE_PT)
    900899                    {
    901                         PX86PTPAE pShwPT2 = (PX86PTPAE)PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pTempPage);
     900                        PPGMSHWPTPAE pShwPT2 = (PPGMSHWPTPAE)PGMPOOL_PAGE_2_PTR(pPool->CTX_SUFF(pVM), pTempPage);
    902901
    903902                        for (unsigned k = 0; k < RT_ELEMENTS(pShwPT->a); k++)
    904903                        {
    905                             if (    pShwPT2->a[k].n.u1Present
    906                                 &&  pShwPT2->a[k].n.u1Write
     904                            if (    PGMSHWPTEPAE_IS_P_RW(pShwPT2->a[k])
    907905# ifdef PGMPOOL_WITH_OPTIMIZED_DIRTY_PT
    908906                                &&  !pPage->fDirty
    909907# endif
    910                                 &&  ((pShwPT2->a[k].u & X86_PTE_PAE_PG_MASK) == HCPhysPT))
     908                                &&  PGMSHWPTEPAE_GET_HCPHYS(pShwPT2->a[k]) == HCPhysPT)
    911909                            {
    912910                                if (fFirstMsg)
     
    915913                                    fFirstMsg = false;
    916914                                }
    917                                 pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch: r/w: GCPhys=%RGp idx=%d shw %RX64 %RX64\n", pTempPage->GCPhys, k, pShwPT->a[k].u, pShwPT2->a[k].u);
     915                                pCmdHlp->pfnPrintf(pCmdHlp, NULL, "Mismatch: r/w: GCPhys=%RGp idx=%d shw %RX64 %RX64\n", pTempPage->GCPhys, k, PGMSHWPTEPAE_GET_LOG(pShwPT->a[k]), PGMSHWPTEPAE_GET_LOG(pShwPT2->a[k]));
    918916                            }
    919917                        }
  • trunk/src/VBox/VMM/PGMShw.h

    r31066 r31775  
    7979
    8080#else
    81 # define SHWPT                  X86PTPAE
    82 # define PSHWPT                 PX86PTPAE
    83 # define SHWPTE                 X86PTEPAE
    84 # define PSHWPTE                PX86PTEPAE
     81# define SHWPT                  PGMSHWPTPAE
     82# define PSHWPT                 PPGMSHWPTPAE
     83# define SHWPTE                 PGMSHWPTEPAE
     84# define PSHWPTE                PPGMSHWPTEPAE
    8585# define SHWPD                  X86PDPAE
    8686# define PSHWPD                 PX86PDPAE
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r31657 r31775  
    14441444 * @param   pPage       The page in question.
    14451445 * @param   fPteSrc     The flags of the source PTE.
    1446  * @param   pPteDst     The shadow PTE (output).
     1446 * @param   pPteDst     The shadow PTE (output).  This is temporary storage and
     1447 *                      does not need to be set atomically.
    14471448 */
    14481449DECLINLINE(void) PGM_BTH_NAME(SyncHandlerPte)(PVM pVM, PCPGMPAGE pPage, uint32_t fPteSrc, PSHWPTE pPteDst)
     
    14611462        /* PteDst.n.u1Write = 0 && PteDst.n.u1Size = 0 */
    14621463#else
    1463         pPteDst->u = (fPteSrc & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
    1464                    | PGM_PAGE_GET_HCPHYS(pPage);
     1464        SHW_PTE_SET(*pPteDst,
     1465                      (fPteSrc & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
     1466                    | PGM_PAGE_GET_HCPHYS(pPage));
    14651467#endif
    14661468    }
     
    14871489#  else
    14881490        /* Set high page frame bits that MBZ (bankers on PAE, CPU dependent on AMD64).  */
    1489         pPteDst->u = pVM->pgm.s.HCPhysInvMmioPg | X86_PTE_PAE_MBZ_MASK_NO_NX | X86_PTE_P;
     1491        SHW_PTE_SET(*pPteDst, pVM->pgm.s.HCPhysInvMmioPg | X86_PTE_PAE_MBZ_MASK_NO_NX | X86_PTE_P);
    14901492#  endif
    14911493    }
     
    14951497    {
    14961498        LogFlow(("SyncHandlerPte: monitored page (%R[pgmpage]) -> mark not present\n", pPage));
    1497         pPteDst->u = 0;
     1499        SHW_PTE_SET(*pPteDst, 0);
    14981500    }
    14991501    /** @todo count these kinds of entries. */
     
    15501552            if (PGM_PAGE_IS_BALLOONED(pPage))
    15511553            {
    1552                 Assert(!pPteDst->n.u1Present); /** @todo user tracking needs updating if this triggers. */
     1554                Assert(!SHW_PTE_IS_P(*pPteDst)); /** @todo user tracking needs updating if this triggers. */
    15531555                return;
    15541556            }
     
    15951597                    LogFlow(("SyncPageWorker: page and or page directory not accessed -> mark not present\n"));
    15961598                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,AccessedPage));
    1597                     PteDst.u = 0;
     1599                    SHW_PTE_SET(PteDst, 0);
    15981600                }
    15991601                /*
     
    16041606                {
    16051607                    STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,DirtyPage));
    1606                     PteDst.u = (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
    1607                              | PGM_PAGE_GET_HCPHYS(pPage)
    1608                              | PGM_PTFLAGS_TRACK_DIRTY;
     1608                    SHW_PTE_SET(PteDst,
     1609                                  (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT | X86_PTE_RW))
     1610                                | PGM_PAGE_GET_HCPHYS(pPage)
     1611                                | PGM_PTFLAGS_TRACK_DIRTY);
    16091612                }
    16101613                else
     
    16211624                    /* PteDst.n.u1Size = 0 */
    16221625#else
    1623                     PteDst.u = (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT))
    1624                              | PGM_PAGE_GET_HCPHYS(pPage);
     1626                    SHW_PTE_SET(PteDst,
     1627                                  (PteSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT))
     1628                                | PGM_PAGE_GET_HCPHYS(pPage));
    16251629#endif
    16261630                }
     
    16291633                 * Make sure only allocated pages are mapped writable.
    16301634                 */
    1631                 if (    PteDst.n.u1Write
    1632                     &&  PteDst.n.u1Present
     1635                if (    SHW_PTE_IS_P_RW(PteDst)
    16331636                    &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED)
    16341637                {
    16351638                    /* Still applies to shared pages. */
    16361639                    Assert(!PGM_PAGE_IS_ZERO(pPage));
    1637                     PteDst.n.u1Write = 0;   /** @todo this isn't quite working yet. Why, isn't it? */
     1640                    SHW_PTE_SET_RO(PteDst);   /** @todo this isn't quite working yet. Why, isn't it? */
    16381641                    Log3(("SyncPageWorker: write-protecting %RGp pPage=%R[pgmpage]at iPTDst=%d\n", (RTGCPHYS)(PteSrc.u & X86_PTE_PAE_PG_MASK), pPage, iPTDst));
    16391642                }
     
    16431646             * Keep user track up to date.
    16441647             */
    1645             if (PteDst.n.u1Present)
     1648            if (SHW_PTE_IS_P(PteDst))
    16461649            {
    1647                 if (!pPteDst->n.u1Present)
     1650                if (!SHW_PTE_IS_P(*pPteDst))
    16481651                    PGM_BTH_NAME(SyncPageWorkerTrackAddref)(pVCpu, pShwPage, PGM_PAGE_GET_TRACKING(pPage), pPage, iPTDst);
    1649                 else if ((pPteDst->u & SHW_PTE_PG_MASK) != (PteDst.u & SHW_PTE_PG_MASK))
     1652                else if (SHW_PTE_GET_HCPHYS(*pPteDst) != SHW_PTE_GET_HCPHYS(PteDst))
    16501653                {
    1651                     Log2(("SyncPageWorker: deref! *pPteDst=%RX64 PteDst=%RX64\n", (uint64_t)pPteDst->u, (uint64_t)PteDst.u));
    1652                     PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, pPteDst->u & SHW_PTE_PG_MASK, iPTDst);
     1654                    Log2(("SyncPageWorker: deref! *pPteDst=%RX64 PteDst=%RX64\n", SHW_PTE_LOG64(*pPteDst), SHW_PTE_LOG64(PteDst)));
     1655                    PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, SHW_PTE_GET_HCPHYS(*pPteDst), iPTDst);
    16531656                    PGM_BTH_NAME(SyncPageWorkerTrackAddref)(pVCpu, pShwPage, PGM_PAGE_GET_TRACKING(pPage), pPage, iPTDst);
    16541657                }
    16551658            }
    1656             else if (pPteDst->n.u1Present)
     1659            else if (SHW_PTE_IS_P(*pPteDst))
    16571660            {
    1658                 Log2(("SyncPageWorker: deref! *pPteDst=%RX64\n", (uint64_t)pPteDst->u));
    1659                 PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, pPteDst->u & SHW_PTE_PG_MASK, iPTDst);
     1661                Log2(("SyncPageWorker: deref! *pPteDst=%RX64\n", SHW_PTE_LOG64(*pPteDst)));
     1662                PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, SHW_PTE_GET_HCPHYS(*pPteDst), iPTDst);
    16601663            }
    16611664
     
    16671670                pShwPage->fSeenNonGlobal = true;
    16681671#endif
    1669             ASMAtomicWriteSize(pPteDst, PteDst.u);
     1672            SHW_PTE_ATOMIC_SET2(*pPteDst, PteDst);
    16701673            return;
    16711674        }
     
    16831686     * an empty entry, making sure to keep the user tracking up to date.
    16841687     */
    1685     if (pPteDst->n.u1Present)
    1686     {
    1687         Log2(("SyncPageWorker: deref! *pPteDst=%RX64\n", (uint64_t)pPteDst->u));
    1688         PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, pPteDst->u & SHW_PTE_PG_MASK, iPTDst);
    1689     }
    1690     ASMAtomicWriteSize(pPteDst, 0);
     1688    if (SHW_PTE_IS_P(*pPteDst))
     1689    {
     1690        Log2(("SyncPageWorker: deref! *pPteDst=%RX64\n", SHW_PTE_LOG64(*pPteDst)));
     1691        PGM_BTH_NAME(SyncPageWorkerTrackDeref)(pVCpu, pShwPage, SHW_PTE_GET_HCPHYS(*pPteDst), iPTDst);
     1692    }
     1693    SHW_PTE_ATOMIC_SET(*pPteDst, 0);
    16911694}
    16921695
     
    18621865                        for (; iPTDst < iPTDstEnd; iPTDst++)
    18631866                        {
    1864                             if (!pPTDst->a[iPTDst].n.u1Present)
     1867                            if (!SHW_PTE_IS_P(pPTDst->a[iPTDst]))
    18651868                            {
    18661869                                GSTPTE PteSrc = pPTSrc->a[offPTSrc + iPTDst];
     
    18871890                                      PteSrc.n.u1User & PdeSrc.n.u1User,
    18881891                                      (uint64_t)PteSrc.u,
    1889                                       (uint64_t)pPTDst->a[iPTDst].u,
    1890                                       pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
     1892                                      SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     1893                                      SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
    18911894                            }
    18921895                        }
     
    19041907                              PteSrc.n.u1User & PdeSrc.n.u1User,
    19051908                              (uint64_t)PteSrc.u,
    1906                               (uint64_t)pPTDst->a[iPTDst].u,
    1907                               pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
     1909                              SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     1910                              SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
    19081911                    }
    19091912                }
     
    19111914                {
    19121915                    LogFlow(("PGM_GCPHYS_2_PTR %RGp failed with %Rrc\n", GCPhys, rc));
    1913                     Assert(!pPTDst->a[(GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK].n.u1Present);
     1916                    Assert(!SHW_PTE_IS_P(pPTDst->a[(GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK]));
    19141917                }
    19151918            }
     
    19601963                                                     &PteDst);
    19611964                    else
    1962                         PteDst.u = (PdeSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT))
    1963                                  | PGM_PAGE_GET_HCPHYS(pPage);
     1965                        SHW_PTE_SET(PteDst,
     1966                                      (PdeSrc.u & ~(X86_PTE_PAE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT))
     1967                                    | PGM_PAGE_GET_HCPHYS(pPage));
    19641968
    19651969                    const unsigned iPTDst = (GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK;
    1966                     if (    PteDst.n.u1Present
    1967                         &&  !pPTDst->a[iPTDst].n.u1Present)
     1970                    if (    SHW_PTE_IS_P(PteDst)
     1971                        &&  !SHW_PTE_IS_P(pPTDst->a[iPTDst]))
    19681972                        PGM_BTH_NAME(SyncPageWorkerTrackAddref)(pVCpu, pShwPage, PGM_PAGE_GET_TRACKING(pPage), pPage, iPTDst);
    19691973
    19701974                    /* Make sure only allocated pages are mapped writable. */
    1971                     if (    PteDst.n.u1Write
    1972                         &&  PteDst.n.u1Present
     1975                    if (    SHW_PTE_IS_P_RW(PteDst)
    19731976                        &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED)
    19741977                    {
    19751978                        /* Still applies to shared pages. */
    19761979                        Assert(!PGM_PAGE_IS_ZERO(pPage));
    1977                         PteDst.n.u1Write = 0;   /** @todo this isn't quite working yet... */
     1980                        SHW_PTE_SET_RO(PteDst);   /** @todo this isn't quite working yet... */
    19781981                        Log3(("SyncPage: write-protecting %RGp pPage=%R[pgmpage] at %RGv\n", GCPhys, pPage, GCPtrPage));
    19791982                    }
    19801983
    1981                     ASMAtomicWriteSize(&pPTDst->a[iPTDst], PteDst.u);
     1984                    SHW_PTE_ATOMIC_SET2(pPTDst->a[iPTDst], PteDst);
    19821985
    19831986                    /*
     
    21282131        for (; iPTDst < iPTDstEnd; iPTDst++)
    21292132        {
    2130             if (!pPTDst->a[iPTDst].n.u1Present)
     2133            if (!SHW_PTE_IS_P(pPTDst->a[iPTDst]))
    21312134            {
    21322135                RTGCPTR GCPtrCurPage = (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT);
     
    21522155                      PteSrc.n.u1User & PdeSrc.n.u1User,
    21532156                      (uint64_t)PteSrc.u,
    2154                       (uint64_t)pPTDst->a[iPTDst].u,
    2155                       pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
     2157                      SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     2158                      SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
    21562159
    21572160                if (RT_UNLIKELY(VM_FF_ISPENDING(pVM, VM_FF_PGM_NO_MEMORY)))
     
    21592162            }
    21602163            else
    2161                 Log4(("%RGv iPTDst=%x pPTDst->a[iPTDst] %RX64\n", (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT), iPTDst, pPTDst->a[iPTDst].u));
     2164                Log4(("%RGv iPTDst=%x pPTDst->a[iPTDst] %RX64\n", (GCPtrPage & ~(RTGCPTR)(SHW_PT_MASK << SHW_PT_SHIFT)) | (iPTDst << PAGE_SHIFT), iPTDst, SHW_PTE_LOG64(pPTDst->a[iPTDst]) ));
    21622165        }
    21632166    }
     
    21912194              PteSrc.n.u1User & PdeSrc.n.u1User,
    21922195              (uint64_t)PteSrc.u,
    2193               (uint64_t)pPTDst->a[iPTDst].u,
    2194               pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
     2196              SHW_PTE_LOG64(pPTDst->a[iPTDst]),
     2197              SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : ""));
    21952198    }
    21962199    return VINF_SUCCESS;
     
    23252328                PSHWPT      pPTDst   = (PSHWPT)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPage);
    23262329                PSHWPTE     pPteDst  = &pPTDst->a[(GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK];
    2327                 if (    pPteDst->n.u1Present
    2328                     &&  pPteDst->n.u1Write)
     2330                if (SHW_PTE_IS_P_RW(*pPteDst))
    23292331                {
    23302332                    /* Stale TLB entry. */
     
    23732375            PSHWPT      pPTDst   = (PSHWPT)PGMPOOL_PAGE_2_PTR_V2(pVM, pVCpu, pShwPage);
    23742376            PSHWPTE     pPteDst  = &pPTDst->a[(GCPtrPage >> SHW_PT_SHIFT) & SHW_PT_MASK];
    2375             if (pPteDst->n.u1Present)    /** @todo Optimize accessed bit emulation? */
     2377            if (SHW_PTE_IS_P(*pPteDst))    /** @todo Optimize accessed bit emulation? */
    23762378            {
    2377                 if (pPteDst->u & PGM_PTFLAGS_TRACK_DIRTY)
     2379                if (SHW_PTE_IS_TRACK_DIRTY(*pPteDst))
    23782380                {
    23792381                    PPGMPAGE pPage  = pgmPhysGetPage(&pVM->pgm.s, pPteSrc->u & GST_PTE_PG_MASK);
     
    23962398                            Assert(!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage));
    23972399                            /* Assuming write handlers here as the PTE is present (otherwise we wouldn't be here). */
    2398                             PteDst.n.u1Write = 0;
     2400                            SHW_PTE_SET_RO(PteDst);
    23992401                        }
    24002402                        else
     
    24072409                            }
    24082410                            if (PGM_PAGE_GET_STATE(pPage) == PGM_PAGE_STATE_ALLOCATED)
    2409                                 PteDst.n.u1Write = 1;
     2411                                SHW_PTE_SET_RW(PteDst);
    24102412                            else
    24112413                            {
    24122414                                /* Still applies to shared pages. */
    24132415                                Assert(!PGM_PAGE_IS_ZERO(pPage));
    2414                                 PteDst.n.u1Write = 0;
     2416                                SHW_PTE_SET_RO(PteDst);
    24152417                            }
    24162418                        }
    24172419                    }
    24182420                    else
    2419                         PteDst.n.u1Write = 1;  /** @todo r=bird: This doesn't make sense to me. */
    2420 
    2421                     PteDst.n.u1Dirty    = 1;
    2422                     PteDst.n.u1Accessed = 1;
    2423                     PteDst.au32[0]     &= ~PGM_PTFLAGS_TRACK_DIRTY;
    2424                     ASMAtomicWriteSize(pPteDst, PteDst.u);
     2421                        SHW_PTE_SET_RW(PteDst);  /** @todo r=bird: This doesn't make sense to me. */
     2422
     2423                    SHW_PTE_SET(PteDst, (SHW_PTE_GET_U(PteDst) | X86_PTE_D | X86_PTE_A) & ~(uint64_t)PGM_PTFLAGS_TRACK_DIRTY);
     2424                    SHW_PTE_ATOMIC_SET2(*pPteDst, PteDst);
    24252425                    PGM_INVL_PG(pVCpu, GCPtrPage);
    24262426                    return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
     
    24302430                /* Check for stale TLB entry; only applies to the SMP guest case. */
    24312431                if (    pVM->cCpus > 1
    2432                     &&  pPteDst->n.u1Write == 1
    2433                     &&  pPteDst->n.u1Accessed == 1)
     2432                    &&  SHW_PTE_IS_RW(*pPteDst)
     2433                    &&  SHW_PTE_IS_A(*pPteDst))
    24342434                {
    24352435                    /* Stale TLB entry. */
     
    27392739                              PteSrc.n.u1User & PdeSrc.n.u1User,
    27402740                              (uint64_t)PteSrc.u,
    2741                               pPTDst->a[iPTDst].u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : "", pPTDst->a[iPTDst].u, iPTSrc, PdeSrc.au32[0],
     2741                              SHW_PTE_IS_TRACK_DIRTY(pPTDst->a[iPTDst]) ? " Track-Dirty" : "", SHW_PTE_LOG64(pPTDst->a[iPTDst]), iPTSrc, PdeSrc.au32[0],
    27422742                              (RTGCPHYS)((PdeSrc.u & GST_PDE_PG_MASK) + iPTSrc*sizeof(PteSrc)) ));
    27432743                    }
     
    27922792            /* Get address and flags from the source PDE. */
    27932793            SHWPTE PteDstBase;
    2794             PteDstBase.u = PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT);
     2794            SHW_PTE_SET(PteDstBase, PdeSrc.u & ~(GST_PDE_PG_MASK | X86_PTE_AVL_MASK | X86_PTE_PAT | X86_PTE_PCD | X86_PTE_PWT));
    27952795
    27962796            /* Loop thru the entries in the shadow PT. */
     
    28202820                        if (    PGM_PAGE_GET_TYPE(pPage)  == PGMPAGETYPE_RAM
    28212821                            &&  (   PGM_PAGE_IS_ZERO(pPage)
    2822                                  || (   PteDstBase.n.u1Write
     2822                                 || (   SHW_PTE_IS_RW(PteDstBase)
    28232823                                     && PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED
    28242824#  ifdef VBOX_WITH_REAL_WRITE_MONITORED_PAGES
     
    28412841                        if (PGM_PAGE_HAS_ACTIVE_HANDLERS(pPage))
    28422842                        {
     2843/** @todo call SyncHandlerPte !!
     2844 *  FIXME FIXME FIXME */
    28432845                            if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPage))
    28442846                            {
    2845                                 PteDst.u = PGM_PAGE_GET_HCPHYS(pPage) | PteDstBase.u;
    2846                                 PteDst.n.u1Write = 0;
     2847                                SHW_PTE_SET(PteDst, PGM_PAGE_GET_HCPHYS(pPage) | SHW_PTE_GET_U(PteDstBase));
     2848                                SHW_PTE_SET_RO(PteDst);
    28472849                            }
    28482850                            else
    2849                                 PteDst.u = 0;
     2851                                SHW_PTE_SET(PteDst, 0);
    28502852                        }
    28512853                        else if (PGM_PAGE_IS_BALLOONED(pPage))
    2852                         {
    2853                             /* Skip ballooned pages. */
    2854                             PteDst.u = 0;
    2855                         }
     2854                            SHW_PTE_SET(PteDst, 0); /* Handle ballooned pages at #PF time. */
    28562855# ifndef IN_RING0
    28572856                        /*
     
    28622861                        else if (    !PdeSrc.n.u1User
    28632862                                 &&  CSAMDoesPageNeedScanning(pVM, GCPtr | (iPTDst << SHW_PT_SHIFT)))
    2864                             PteDst.u = 0;
     2863                            SHW_PTE_SET(PteDst, 0);
    28652864# endif
    28662865                        else
    2867                             PteDst.u = PGM_PAGE_GET_HCPHYS(pPage) | PteDstBase.u;
     2866                            SHW_PTE_SET(PteDst, PGM_PAGE_GET_HCPHYS(pPage) | SHW_PTE_GET_U(PteDstBase));
    28682867
    28692868                        /* Only map writable pages writable. */
    2870                         if (    PteDst.n.u1Write
    2871                             &&  PteDst.n.u1Present
     2869                        if (    SHW_PTE_IS_P_RW(PteDst)
    28722870                            &&  PGM_PAGE_GET_STATE(pPage) != PGM_PAGE_STATE_ALLOCATED)
    28732871                        {
    28742872                            /* Still applies to shared pages. */
    28752873                            Assert(!PGM_PAGE_IS_ZERO(pPage));
    2876                             PteDst.n.u1Write = 0;   /** @todo this isn't quite working yet... */
     2874                            SHW_PTE_SET_RO(PteDst);   /** @todo this isn't quite working yet... */
    28772875                            Log3(("SyncPT: write-protecting %RGp pPage=%R[pgmpage] at %RGv\n", GCPhys, pPage, (RTGCPTR)(GCPtr | (iPTDst << SHW_PT_SHIFT))));
    28782876                        }
    28792877
    2880                         if (PteDst.n.u1Present)
     2878                        if (SHW_PTE_IS_P(PteDst))
    28812879                            PGM_BTH_NAME(SyncPageWorkerTrackAddref)(pVCpu, pShwPage, PGM_PAGE_GET_TRACKING(pPage), pPage, iPTDst);
    28822880
    2883                         /* commit it */
     2881                        /* commit it (not atomic, new table) */
    28842882                        pPTDst->a[iPTDst] = PteDst;
    28852883                        Log4(("SyncPT: BIG %RGv PteDst:{P=%d RW=%d U=%d raw=%08llx}%s\n",
    2886                               (RTGCPTR)(GCPtr | (iPTDst << SHW_PT_SHIFT)), PteDst.n.u1Present, PteDst.n.u1Write, PteDst.n.u1User, (uint64_t)PteDst.u,
    2887                               PteDst.u & PGM_PTFLAGS_TRACK_DIRTY ? " Track-Dirty" : ""));
     2884                              (RTGCPTR)(GCPtr | (iPTDst << SHW_PT_SHIFT)), SHW_PTE_IS_P(PteDst), SHW_PTE_IS_RW(PteDst), SHW_PTE_IS_US(PteDst), SHW_PTE_LOG64(PteDst),
     2885                              SHW_PTE_IS_TRACK_DIRTY(PteDst) ? " Track-Dirty" : ""));
    28882886
    28892887                        /* advance */
     
    28992897                    do
    29002898                    {
    2901                         pPTDst->a[iPTDst].u = 0; /* MMIO or invalid page, we must handle them manually. */
     2899                        SHW_PTE_SET(pPTDst->a[iPTDst], 0); /* Invalid page, we must handle them manually. */
    29022900                        GCPhys += PAGE_SIZE;
    29032901                        iPTDst++;
     
    29092907                    Log(("Invalid pages at %RGp (2)\n", GCPhys));
    29102908                    for ( ; iPTDst < RT_ELEMENTS(pPTDst->a); iPTDst++)
    2911                         pPTDst->a[iPTDst].u = 0; /* MMIO or invalid page, we must handle them manually. */
     2909                        SHW_PTE_SET(pPTDst->a[iPTDst], 0); /* Invalid page, we must handle them manually. */
    29122910                }
    29132911            } /* while more PTEs */
     
    39303928                            const SHWPTE PteDst = pPTDst->a[iPT];
    39313929
    3932                             /* skip not-present entries. */
    3933                             if (!(PteDst.u & (X86_PTE_P | PGM_PTFLAGS_TRACK_DIRTY))) /** @todo deal with ALL handlers and CSAM !P pages! */
     3930                            /* skip not-present and dirty tracked entries. */
     3931                            if (!(SHW_PTE_GET_U(PteDst) & (X86_PTE_P | PGM_PTFLAGS_TRACK_DIRTY))) /** @todo deal with ALL handlers and CSAM !P pages! */
    39343932                                continue;
    3935                             Assert(PteDst.n.u1Present);
     3933                            Assert(SHW_PTE_IS_P(PteDst));
    39363934
    39373935                            const GSTPTE PteSrc = pPTSrc->a[iPT + offPTSrc];
     
    39433941# endif
    39443942                                AssertMsgFailed(("Out of sync (!P) PTE at %RGv! PteSrc=%#RX64 PteDst=%#RX64 pPTSrc=%RGv iPTSrc=%x PdeSrc=%x physpte=%RGp\n",
    3945                                                 GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u, pPTSrc, iPT + offPTSrc, PdeSrc.au32[0],
     3943                                                GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst), pPTSrc, iPT + offPTSrc, PdeSrc.au32[0],
    39463944                                                (PdeSrc.u & GST_PDE_PG_MASK) + (iPT + offPTSrc)*sizeof(PteSrc)));
    39473945                                cErrors++;
     
    39553953
    39563954                            /* match the physical addresses */
    3957                             HCPhysShw = PteDst.u & SHW_PTE_PG_MASK;
     3955                            HCPhysShw = SHW_PTE_GET_HCPHYS(PteDst);
    39583956                            GCPhysGst = PteSrc.u & GST_PTE_PG_MASK;
    39593957
     
    39653963                                {
    39663964                                    AssertMsgFailed(("Cannot find guest physical address %RGp at %RGv! PteSrc=%#RX64 PteDst=%#RX64\n",
    3967                                                     GCPhysGst, GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     3965                                                     GCPhysGst, GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    39683966                                    cErrors++;
    39693967                                    continue;
     
    39733971                            {
    39743972                                AssertMsgFailed(("Out of sync (phys) at %RGv! HCPhysShw=%RHp HCPhys=%RHp GCPhysGst=%RGp PteSrc=%#RX64 PteDst=%#RX64\n",
    3975                                                 GCPtr + off, HCPhysShw, HCPhys, GCPhysGst, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     3973                                                 GCPtr + off, HCPhysShw, HCPhys, GCPhysGst, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    39763974                                cErrors++;
    39773975                                continue;
     
    39863984                                {
    39873985                                    AssertMsgFailed(("Cannot find guest physical address %RGp at %RGv! PteSrc=%#RX64 PteDst=%#RX64\n",
    3988                                                     GCPhysGst, GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     3986                                                     GCPhysGst, GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    39893987                                    cErrors++;
    39903988                                    continue;
    39913989                                }
    39923990# endif
    3993                                 if (PteDst.n.u1Write)
     3991                                if (SHW_PTE_IS_RW(PteDst))
    39943992                                {
    39953993                                    AssertMsgFailed(("Invalid guest page at %RGv is writable! GCPhysGst=%RGp PteSrc=%#RX64 PteDst=%#RX64\n",
    3996                                                     GCPtr + off, GCPhysGst, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     3994                                                     GCPtr + off, GCPhysGst, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    39973995                                    cErrors++;
    39983996                                }
     
    40024000                            {
    40034001                                AssertMsgFailed(("Out of sync (phys) at %RGv! HCPhysShw=%RHp pPhysPage:%R[pgmpage] GCPhysGst=%RGp PteSrc=%#RX64 PteDst=%#RX64\n",
    4004                                                 GCPtr + off, HCPhysShw, pPhysPage, GCPhysGst, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4002                                                GCPtr + off, HCPhysShw, pPhysPage, GCPhysGst, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40054003                                cErrors++;
    40064004                                continue;
     
    40124010                                if (!PGM_PAGE_HAS_ACTIVE_ALL_HANDLERS(pPhysPage))
    40134011                                {
    4014                                     if (PteDst.n.u1Write)
     4012                                    if (SHW_PTE_IS_RW(PteDst))
    40154013                                    {
    40164014                                        AssertMsgFailed(("WRITE access flagged at %RGv but the page is writable! pPhysPage=%R[pgmpage] PteSrc=%#RX64 PteDst=%#RX64\n",
    4017                                                         GCPtr + off, pPhysPage, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4015                                                         GCPtr + off, pPhysPage, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40184016                                        cErrors++;
    40194017                                        continue;
     
    40234021                                else
    40244022                                {
    4025                                     if (   PteDst.n.u1Present
     4023                                    if (   SHW_PTE_IS_P(PteDst)
    40264024# if PGM_SHW_TYPE == PGM_TYPE_EPT || PGM_SHW_TYPE == PGM_TYPE_PAE || PGM_SHW_TYPE == PGM_TYPE_AMD64
    40274025                                        && !PGM_PAGE_IS_MMIO(pPhysPage)
     
    40304028                                    {
    40314029                                        AssertMsgFailed(("ALL access flagged at %RGv but the page is present! pPhysPage=%R[pgmpage] PteSrc=%#RX64 PteDst=%#RX64\n",
    4032                                                         GCPtr + off, pPhysPage, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4030                                                         GCPtr + off, pPhysPage, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40334031                                        cErrors++;
    40344032                                        continue;
     
    40414039                                if (!PteSrc.n.u1Dirty && PteSrc.n.u1Write)
    40424040                                {
    4043                                     if (PteDst.n.u1Write)
     4041                                    if (SHW_PTE_IS_RW(PteDst))
    40444042                                    {
    40454043                                        AssertMsgFailed(("!DIRTY page at %RGv is writable! PteSrc=%#RX64 PteDst=%#RX64\n",
    4046                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4044                                                         GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40474045                                        cErrors++;
    40484046                                        continue;
    40494047                                    }
    4050                                     if (!(PteDst.u & PGM_PTFLAGS_TRACK_DIRTY))
     4048                                    if (!SHW_PTE_IS_TRACK_DIRTY(PteDst))
    40514049                                    {
    40524050                                        AssertMsgFailed(("!DIRTY page at %RGv is not marked TRACK_DIRTY! PteSrc=%#RX64 PteDst=%#RX64\n",
    4053                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4051                                                         GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40544052                                        cErrors++;
    40554053                                        continue;
    40564054                                    }
    4057                                     if (PteDst.n.u1Dirty)
     4055                                    if (SHW_PTE_IS_D(PteDst))
    40584056                                    {
    40594057                                        AssertMsgFailed(("!DIRTY page at %RGv is marked DIRTY! PteSrc=%#RX64 PteDst=%#RX64\n",
    4060                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4058                                                         GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40614059                                        cErrors++;
    40624060                                    }
     
    40654063                                    {
    40664064                                        AssertMsgFailed(("!DIRTY page at %RGv is has mismatching accessed bit! PteSrc=%#RX64 PteDst=%#RX64\n",
    4067                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4065                                                        GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40684066                                        cErrors++;
    40694067                                    }
     
    40734071# endif
    40744072                                }
    4075                                 else if (PteDst.u & PGM_PTFLAGS_TRACK_DIRTY)
     4073                                else if (SHW_PTE_IS_TRACK_DIRTY(PteDst))
    40764074                                {
    40774075                                    /* access bit emulation (not implemented). */
    4078                                     if (PteSrc.n.u1Accessed || PteDst.n.u1Present)
     4076                                    if (PteSrc.n.u1Accessed || SHW_PTE_IS_P(PteDst))
    40794077                                    {
    40804078                                        AssertMsgFailed(("PGM_PTFLAGS_TRACK_DIRTY set at %RGv but no accessed bit emulation! PteSrc=%#RX64 PteDst=%#RX64\n",
    4081                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4079                                                         GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40824080                                        cErrors++;
    40834081                                        continue;
    40844082                                    }
    4085                                     if (!PteDst.n.u1Accessed)
     4083                                    if (!SHW_PTE_IS_A(PteDst))
    40864084                                    {
    40874085                                        AssertMsgFailed(("!ACCESSED page at %RGv is has the accessed bit set! PteSrc=%#RX64 PteDst=%#RX64\n",
    4088                                                         GCPtr + off, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4086                                                         GCPtr + off, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    40894087                                        cErrors++;
    40904088                                    }
     
    40964094                            }
    40974095
    4098                             if (    (PteSrc.u & ~fIgnoreFlags) != (PteDst.u & ~fIgnoreFlags)
    4099                                 &&  (PteSrc.u & ~(fIgnoreFlags | X86_PTE_RW)) != (PteDst.u & ~fIgnoreFlags)
     4096                            if (    (PteSrc.u & ~fIgnoreFlags)                != (SHW_PTE_GET_U(PteDst) & ~fIgnoreFlags)
     4097                                &&  (PteSrc.u & ~(fIgnoreFlags | X86_PTE_RW)) != (SHW_PTE_GET_U(PteDst) & ~fIgnoreFlags)
    41004098                            )
    41014099                            {
    41024100                                AssertMsgFailed(("Flags mismatch at %RGv! %#RX64 != %#RX64 fIgnoreFlags=%#RX64 PteSrc=%#RX64 PteDst=%#RX64\n",
    4103                                                 GCPtr + off, (uint64_t)PteSrc.u & ~fIgnoreFlags, (uint64_t)PteDst.u & ~fIgnoreFlags,
    4104                                                 fIgnoreFlags, (uint64_t)PteSrc.u, (uint64_t)PteDst.u));
     4101                                                 GCPtr + off, (uint64_t)PteSrc.u & ~fIgnoreFlags, SHW_PTE_LOG64(PteDst) & ~fIgnoreFlags,
     4102                                                 fIgnoreFlags, (uint64_t)PteSrc.u, SHW_PTE_LOG64(PteDst)));
    41054103                                cErrors++;
    41064104                                continue;
     
    41764174                            const SHWPTE PteDst = pPTDst->a[iPT];
    41774175
    4178                             if (PteDst.u & PGM_PTFLAGS_TRACK_DIRTY)
     4176                            if (SHW_PTE_IS_TRACK_DIRTY(PteDst))
    41794177                            {
    41804178                                AssertMsgFailed(("The PTE at %RGv emulating a 2/4M page is marked TRACK_DIRTY! PdeSrc=%#RX64 PteDst=%#RX64\n",
    4181                                                 GCPtr + off, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4179                                                 GCPtr + off, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    41824180                                cErrors++;
    41834181                            }
    41844182
    41854183                            /* skip not-present entries. */
    4186                             if (!PteDst.n.u1Present) /** @todo deal with ALL handlers and CSAM !P pages! */
     4184                            if (!SHW_PTE_IS_P(PteDst)) /** @todo deal with ALL handlers and CSAM !P pages! */
    41874185                                continue;
    41884186
     
    41904188
    41914189                            /* match the physical addresses */
    4192                             HCPhysShw = PteDst.u & X86_PTE_PAE_PG_MASK;
     4190                            HCPhysShw = SHW_PTE_GET_HCPHYS(PteDst);
    41934191
    41944192# ifdef IN_RING3
     
    41994197                                {
    42004198                                    AssertMsgFailed(("Cannot find guest physical address %RGp at %RGv! PdeSrc=%#RX64 PteDst=%#RX64\n",
    4201                                                     GCPhysGst, GCPtr + off, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4199                                                     GCPhysGst, GCPtr + off, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42024200                                    cErrors++;
    42034201                                }
     
    42064204                            {
    42074205                                AssertMsgFailed(("Out of sync (phys) at %RGv! HCPhysShw=%RHp HCPhys=%RHp GCPhysGst=%RGp PdeSrc=%#RX64 PteDst=%#RX64\n",
    4208                                                 GCPtr + off, HCPhysShw, HCPhys, GCPhysGst, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4206                                                 GCPtr + off, HCPhysShw, HCPhys, GCPhysGst, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42094207                                cErrors++;
    42104208                                continue;
     
    42184216                                {
    42194217                                    AssertMsgFailed(("Cannot find guest physical address %RGp at %RGv! PdeSrc=%#RX64 PteDst=%#RX64\n",
    4220                                                     GCPhysGst, GCPtr + off, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4218                                                     GCPhysGst, GCPtr + off, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42214219                                    cErrors++;
    42224220                                    continue;
    42234221                                }
    42244222# endif
    4225                                 if (PteDst.n.u1Write)
     4223                                if (SHW_PTE_IS_RW(PteDst))
    42264224                                {
    42274225                                    AssertMsgFailed(("Invalid guest page at %RGv is writable! GCPhysGst=%RGp PdeSrc=%#RX64 PteDst=%#RX64\n",
    4228                                                     GCPtr + off, GCPhysGst, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4226                                                     GCPtr + off, GCPhysGst, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42294227                                    cErrors++;
    42304228                                }
     
    42344232                            {
    42354233                                AssertMsgFailed(("Out of sync (phys) at %RGv! HCPhysShw=%RHp pPhysPage=%R[pgmpage] GCPhysGst=%RGp PdeSrc=%#RX64 PteDst=%#RX64\n",
    4236                                                 GCPtr + off, HCPhysShw, pPhysPage, GCPhysGst, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4234                                                 GCPtr + off, HCPhysShw, pPhysPage, GCPhysGst, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42374235                                cErrors++;
    42384236                                continue;
     
    42464244                                    if (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage) != PGM_PAGE_HNDL_PHYS_STATE_DISABLED)
    42474245                                    {
    4248                                         if (PteDst.n.u1Write)
     4246                                        if (SHW_PTE_IS_RW(PteDst))
    42494247                                        {
    42504248                                            AssertMsgFailed(("WRITE access flagged at %RGv but the page is writable! pPhysPage=%R[pgmpage] PdeSrc=%#RX64 PteDst=%#RX64\n",
    4251                                                             GCPtr + off, pPhysPage, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4249                                                             GCPtr + off, pPhysPage, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42524250                                            cErrors++;
    42534251                                            continue;
     
    42584256                                else
    42594257                                {
    4260                                     if (   PteDst.n.u1Present
     4258                                    if (   SHW_PTE_IS_P(PteDst)
    42614259# if PGM_SHW_TYPE == PGM_TYPE_EPT || PGM_SHW_TYPE == PGM_TYPE_PAE || PGM_SHW_TYPE == PGM_TYPE_AMD64
    42624260                                        && !PGM_PAGE_IS_MMIO(pPhysPage)
     
    42654263                                    {
    42664264                                        AssertMsgFailed(("ALL access flagged at %RGv but the page is present! pPhysPage=%R[pgmpage] PdeSrc=%#RX64 PteDst=%#RX64\n",
    4267                                                         GCPtr + off, pPhysPage, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4265                                                         GCPtr + off, pPhysPage, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42684266                                        cErrors++;
    42694267                                        continue;
     
    42734271                            }
    42744272
    4275                             if (    (PdeSrc.u & ~fIgnoreFlags) != (PteDst.u & ~fIgnoreFlags)
    4276                                 &&  (PdeSrc.u & ~(fIgnoreFlags | X86_PTE_RW)) != (PteDst.u & ~fIgnoreFlags) /* lazy phys handler dereg. */
     4273                            if (    (PdeSrc.u & ~fIgnoreFlags)                != (SHW_PTE_GET_U(PteDst) & ~fIgnoreFlags)
     4274                                &&  (PdeSrc.u & ~(fIgnoreFlags | X86_PTE_RW)) != (SHW_PTE_GET_U(PteDst) & ~fIgnoreFlags) /* lazy phys handler dereg. */
    42774275                            )
    42784276                            {
    42794277                                AssertMsgFailed(("Flags mismatch (BT) at %RGv! %#RX64 != %#RX64 fIgnoreFlags=%#RX64 PdeSrc=%#RX64 PteDst=%#RX64\n",
    4280                                                 GCPtr + off, (uint64_t)PdeSrc.u & ~fIgnoreFlags, (uint64_t)PteDst.u & ~fIgnoreFlags,
    4281                                                 fIgnoreFlags, (uint64_t)PdeSrc.u, (uint64_t)PteDst.u));
     4278                                                 GCPtr + off, (uint64_t)PdeSrc.u & ~fIgnoreFlags, SHW_PTE_LOG64(PteDst) & ~fIgnoreFlags,
     4279                                                 fIgnoreFlags, (uint64_t)PdeSrc.u, SHW_PTE_LOG64(PteDst)));
    42824280                                cErrors++;
    42834281                                continue;
  • trunk/src/VBox/VMM/VMMAll/PGMAllMap.cpp

    r31402 r31775  
    9090
    9191                /* pae */
    92                 pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPageNo / 512].a[iPageNo % 512].u = Pte.u;
     92                PGMSHWPTEPAE_SET(pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPageNo / 512].a[iPageNo % 512], Pte.u);
    9393
    9494                /* next */
     
    144144     * Validate input.
    145145     */
    146     AssertMsg(!(fFlags & X86_PTE_PAE_PG_MASK), ("fFlags=%#x\n", fFlags));
     146    AssertMsg(!(fFlags & (X86_PTE_PAE_PG_MASK | X86_PTE_PAE_MBZ_MASK_NX)), ("fFlags=%#x\n", fFlags));
    147147    Assert(cb);
    148148
     
    182182
    183183                    /* PAE */
    184                     pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPTE / 512].a[iPTE % 512].u &= fMask | X86_PTE_PAE_PG_MASK;
    185                     pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPTE / 512].a[iPTE % 512].u |= fFlags & ~X86_PTE_PAE_PG_MASK;
     184                    PPGMSHWPTEPAE pPtePae = &pCur->aPTs[iPT].CTX_SUFF(paPaePTs)[iPTE / 512].a[iPTE % 512];
     185                    PGMSHWPTEPAE_SET(*pPtePae,
     186                                       (  PGMSHWPTEPAE_GET_U(*pPtePae)
     187                                        & (fMask | X86_PTE_PAE_PG_MASK))
     188                                     | (fFlags & ~(X86_PTE_PAE_PG_MASK | X86_PTE_PAE_MBZ_MASK_NX)));
    186189
    187190                    /* invalidate tls */
  • trunk/src/VBox/VMM/VMMAll/PGMAllPool.cpp

    r31715 r31775  
    3939#include <iprt/asm-amd64-x86.h>
    4040#include <iprt/string.h>
    41 
    42 
    43 /*******************************************************************************
    44 *   Defined Constants And Macros                                               *
    45 *******************************************************************************/
    46 /**
    47  * Checks if a PAE PTE entry is actually present and not just invalid because
    48  * of the MMIO optimization.
    49  * @todo Move this to PGMInternal.h if necessary.
    50  */
    51 #ifdef PGM_WITH_MMIO_OPTIMIZATIONS
    52 # define PGM_POOL_IS_PAE_PTE_PRESENT(Pte) \
    53     ( ((Pte).u & (X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == X86_PTE_P)
    54 #else
    55 # define PGM_POOL_IS_PAE_PTE_PRESENT(Pte) \
    56     ( (Pte).n.u1Present )
    57 #endif
    58 
    59 /**
    60  * Checks if a EPT PTE entry is actually present and not just invalid
    61  * because of the MMIO optimization.
    62  * @todo Move this to PGMInternal.h if necessary.
    63  */
    64 #define PGM_POOL_IS_EPT_PTE_PRESENT(Pte) \
    65     ( (Pte).n.u1Present )
    6641
    6742
     
    8358#endif
    8459#if defined(VBOX_STRICT) && defined(PGMPOOL_WITH_OPTIMIZED_DIRTY_PT)
    85 static void pgmPoolTrackCheckPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT, PCX86PTPAE pGstPT);
     60static void pgmPoolTrackCheckPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT, PCX86PTPAE pGstPT);
    8661#endif
    8762
     
    209184       union
    210185        {
    211             void       *pv;
    212             PX86PT      pPT;
    213             PX86PTPAE   pPTPae;
    214             PX86PD      pPD;
    215             PX86PDPAE   pPDPae;
    216             PX86PDPT    pPDPT;
    217             PX86PML4    pPML4;
     186            void           *pv;
     187            PX86PT          pPT;
     188            PPGMSHWPTPAE    pPTPae;
     189            PX86PD          pPD;
     190            PX86PDPAE       pPDPae;
     191            PX86PDPT        pPDPT;
     192            PX86PML4        pPML4;
    218193        } uShw;
    219194
     
    254229                    const unsigned iShw = (off / sizeof(X86PTE)) & (X86_PG_PAE_ENTRIES - 1);
    255230                    LogFlow(("PGMPOOLKIND_PAE_PT_FOR_32BIT_PT iShw=%x\n", iShw));
    256                     if (PGM_POOL_IS_PAE_PTE_PRESENT(uShw.pPTPae->a[iShw]))
     231                    if (PGMSHWPTEPAE_IS_P(uShw.pPTPae->a[iShw]))
    257232                    {
    258233                        X86PTE GstPte;
     
    262237                        Log4(("pgmPoolMonitorChainChanging pae_32: deref %016RX64 GCPhys %08RX32\n", uShw.pPT->a[iShw].u & X86_PTE_PAE_PG_MASK, GstPte.u & X86_PTE_PG_MASK));
    263238                        pgmPoolTracDerefGCPhysHint(pPool, pPage,
    264                                                    uShw.pPTPae->a[iShw].u & X86_PTE_PAE_PG_MASK,
     239                                                   PGMSHWPTEPAE_GET_HCPHYS(uShw.pPTPae->a[iShw]),
    265240                                                   GstPte.u & X86_PTE_PG_MASK,
    266241                                                   iShw);
    267                         ASMAtomicWriteSize(&uShw.pPTPae->a[iShw], 0);
     242                        PGMSHWPTEPAE_ATOMIC_SET(uShw.pPTPae->a[iShw], 0);
    268243                    }
    269244                }
     
    345320                const unsigned iShw = off / sizeof(X86PTEPAE);
    346321                STAM_COUNTER_INC(&pPool->CTX_MID_Z(StatMonitor,FaultPT));
    347                 if (PGM_POOL_IS_PAE_PTE_PRESENT(uShw.pPTPae->a[iShw]))
     322                if (PGMSHWPTEPAE_IS_P(uShw.pPTPae->a[iShw]))
    348323                {
    349324                    X86PTEPAE GstPte;
     
    351326                    AssertRC(rc);
    352327
    353                     Log4(("pgmPoolMonitorChainChanging pae: deref %016RX64 GCPhys %016RX64\n", uShw.pPTPae->a[iShw].u & X86_PTE_PAE_PG_MASK, GstPte.u & X86_PTE_PAE_PG_MASK));
     328                    Log4(("pgmPoolMonitorChainChanging pae: deref %016RX64 GCPhys %016RX64\n", PGMSHWPTEPAE_GET_HCPHYS(uShw.pPTPae->a[iShw]), GstPte.u & X86_PTE_PAE_PG_MASK));
    354329                    pgmPoolTracDerefGCPhysHint(pPool, pPage,
    355                                                uShw.pPTPae->a[iShw].u & X86_PTE_PAE_PG_MASK,
     330                                               PGMSHWPTEPAE_GET_HCPHYS(uShw.pPTPae->a[iShw]),
    356331                                               GstPte.u & X86_PTE_PAE_PG_MASK,
    357332                                               iShw);
    358                     ASMAtomicWriteSize(&uShw.pPTPae->a[iShw].u, 0);
     333                    PGMSHWPTEPAE_ATOMIC_SET(uShw.pPTPae->a[iShw], 0);
    359334                }
    360335
     
    366341                    AssertBreak(iShw2 < RT_ELEMENTS(uShw.pPTPae->a));
    367342
    368                     if (PGM_POOL_IS_PAE_PTE_PRESENT(uShw.pPTPae->a[iShw2]))
     343                    if (PGMSHWPTEPAE_IS_P(uShw.pPTPae->a[iShw2]))
    369344                    {
    370345                        X86PTEPAE GstPte;
     
    375350#   endif
    376351                        AssertRC(rc);
    377                         Log4(("pgmPoolMonitorChainChanging pae: deref %016RX64 GCPhys %016RX64\n", uShw.pPTPae->a[iShw2].u & X86_PTE_PAE_PG_MASK, GstPte.u & X86_PTE_PAE_PG_MASK));
     352                        Log4(("pgmPoolMonitorChainChanging pae: deref %016RX64 GCPhys %016RX64\n", PGMSHWPTEPAE_GET_HCPHYS(uShw.pPTPae->a[iShw2]), GstPte.u & X86_PTE_PAE_PG_MASK));
    378353                        pgmPoolTracDerefGCPhysHint(pPool, pPage,
    379                                                    uShw.pPTPae->a[iShw2].u & X86_PTE_PAE_PG_MASK,
     354                                                   PGMSHWPTEPAE_GET_HCPHYS(uShw.pPTPae->a[iShw2]),
    380355                                                   GstPte.u & X86_PTE_PAE_PG_MASK,
    381356                                                   iShw2);
    382                         ASMAtomicWriteSize(&uShw.pPTPae->a[iShw2].u ,0);
     357                        PGMSHWPTEPAE_ATOMIC_SET(uShw.pPTPae->a[iShw2], 0);
    383358                    }
    384359                }
     
    10361011             * it's fairly safe to assume the guest is reusing the PT.
    10371012             */
    1038             if (PGM_POOL_IS_PAE_PTE_PRESENT(GstPte))
     1013            if (PGMSHWPTEPAE_IS_P(GstPte))
    10391014            {
    10401015                RTHCPHYS HCPhys = -1;
     
    11031078        void *pvGst;
    11041079        int rc = PGM_GCPHYS_2_PTR(pPool->CTX_SUFF(pVM), pPage->GCPhys, &pvGst); AssertReleaseRC(rc);
    1105         pgmPoolTrackCheckPTPaePae(pPool, pPage, (PX86PTPAE)pvShw, (PCX86PTPAE)pvGst);
     1080        pgmPoolTrackCheckPTPaePae(pPool, pPage, (PPGMSHWPTPAE)pvShw, (PCX86PTPAE)pvGst);
    11061081        PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvGst);
    11071082        PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvShw);
     
    13741349 * @param   pGstPT      The guest page table.
    13751350 */
    1376 static void pgmPoolTrackCheckPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT, PCX86PTPAE pGstPT)
     1351static void pgmPoolTrackCheckPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT, PCX86PTPAE pGstPT)
    13771352{
    13781353    unsigned cErrors    = 0;
     
    13841359#ifdef VBOX_STRICT
    13851360    for (unsigned i = 0; i < RT_MIN(RT_ELEMENTS(pShwPT->a), pPage->iFirstPresent); i++)
    1386         AssertMsg(!PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]), ("Unexpected PTE: idx=%d %RX64 (first=%d)\n", i, pShwPT->a[i].u,  pPage->iFirstPresent));
     1361        AssertMsg(!PGMSHWPTEPAE_IS_P(pShwPT->a[i]), ("Unexpected PTE: idx=%d %RX64 (first=%d)\n", i, PGMSHWPTEPAE_GET_LOG(pShwPT->a[i]),  pPage->iFirstPresent));
    13871362#endif
    13881363    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pShwPT->a); i++)
    13891364    {
    1390         if (PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]))
     1365        if (PGMSHWPTEPAE_IS_P(pShwPT->a[i]))
    13911366        {
    13921367            RTHCPHYS HCPhys = NIL_RTHCPHYS;
    13931368            int rc = PGMPhysGCPhys2HCPhys(pVM, pGstPT->a[i].u & X86_PTE_PAE_PG_MASK, &HCPhys);
    13941369            if (    rc != VINF_SUCCESS
    1395                 ||  (pShwPT->a[i].u & X86_PTE_PAE_PG_MASK) != HCPhys)
    1396             {
    1397                 Log(("rc=%d idx=%d guest %RX64 shw=%RX64 vs %RHp\n", rc, i, pGstPT->a[i].u, pShwPT->a[i].u, HCPhys));
     1370                ||  PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]) != HCPhys)
     1371            {
     1372                Log(("rc=%d idx=%d guest %RX64 shw=%RX64 vs %RHp\n", rc, i, pGstPT->a[i].u, PGMSHWPTEPAE_GET_LOG(pShwPT->a[i]), HCPhys));
    13981373                LastPTE     = i;
    13991374                LastRc      = rc;
     
    14111386                    if (pTempPage->enmKind == PGMPOOLKIND_PAE_PT_FOR_PAE_PT)
    14121387                    {
    1413                         PX86PTPAE pShwPT2 = (PX86PTPAE)PGMPOOL_PAGE_2_PTR(pVM, pTempPage);
     1388                        PPGMSHWPTPAE pShwPT2 = (PPGMSHWPTPAE)PGMPOOL_PAGE_2_PTR(pVM, pTempPage);
    14141389
    14151390                        for (unsigned j = 0; j < RT_ELEMENTS(pShwPT->a); j++)
    14161391                        {
    1417                             if (   PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT2->a[j])
    1418                                 && pShwPT2->a[j].n.u1Write
    1419                                 && (pShwPT2->a[j].u & X86_PTE_PAE_PG_MASK) == HCPhysPT)
     1392                            if (   PGMSHWPTEPAE_IS_P_RW(pShwPT2->a[j])
     1393                                && PGMSHWPTEPAE_GET_HCPHYS(pShwPT2->a[j]) == HCPhysPT)
    14201394                            {
    1421                                 Log(("GCPhys=%RGp idx=%d %RX64 vs %RX64\n", pTempPage->GCPhys, j, pShwPT->a[j].u, pShwPT2->a[j].u));
     1395                                Log(("GCPhys=%RGp idx=%d %RX64 vs %RX64\n", pTempPage->GCPhys, j, PGMSHWPTEPAE_GET_LOG(pShwPT->a[j]), PGMSHWPTEPAE_GET_LOG(pShwPT2->a[j])));
    14221396                            }
    14231397                        }
     
    14291403        }
    14301404    }
    1431     AssertMsg(!cErrors, ("cErrors=%d: last rc=%d idx=%d guest %RX64 shw=%RX64 vs %RHp\n", cErrors, LastRc, LastPTE, pGstPT->a[LastPTE].u, pShwPT->a[LastPTE].u, LastHCPhys));
     1405    AssertMsg(!cErrors, ("cErrors=%d: last rc=%d idx=%d guest %RX64 shw=%RX64 vs %RHp\n", cErrors, LastRc, LastPTE, pGstPT->a[LastPTE].u, PGMSHWPTEPAE_GET_LOG(pShwPT->a[LastPTE]), LastHCPhys));
    14321406}
    14331407#  endif /* VBOX_STRICT */
     
    14451419 * @param   pfFlush         Flush reused page table (out)
    14461420 */
    1447 DECLINLINE(unsigned) pgmPoolTrackFlushPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT, PCX86PTPAE pGstPT,
     1421DECLINLINE(unsigned) pgmPoolTrackFlushPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT, PCX86PTPAE pGstPT,
    14481422                                               PCX86PTPAE pOldGstPT, bool fAllowRemoval, bool *pfFlush)
    14491423{
     
    14521426#ifdef VBOX_STRICT
    14531427    for (unsigned i = 0; i < RT_MIN(RT_ELEMENTS(pShwPT->a), pPage->iFirstPresent); i++)
    1454         AssertMsg(!PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]), ("Unexpected PTE: idx=%d %RX64 (first=%d)\n", i, pShwPT->a[i].u,  pPage->iFirstPresent));
     1428        AssertMsg(!PGMSHWPTEPAE_IS_P(pShwPT->a[i]), ("Unexpected PTE: idx=%d %RX64 (first=%d)\n", i, PGMSHWPTEPAE_GET_LOG(pShwPT->a[i]),  pPage->iFirstPresent));
    14551429#endif
    14561430    *pfFlush = false;
     
    14701444            }
    14711445        }
    1472         if (PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]))
     1446        if (PGMSHWPTEPAE_IS_P(pShwPT->a[i]))
    14731447        {
    14741448            /* If the old cached PTE is identical, then there's no need to flush the shadow copy. */
     
    14781452                RTHCPHYS HCPhys = NIL_RTGCPHYS;
    14791453                int rc = PGMPhysGCPhys2HCPhys(pPool->CTX_SUFF(pVM), pGstPT->a[i].u & X86_PTE_PAE_PG_MASK, &HCPhys);
    1480                 AssertMsg(rc == VINF_SUCCESS && (pShwPT->a[i].u & X86_PTE_PAE_PG_MASK) == HCPhys, ("rc=%d guest %RX64 old %RX64 shw=%RX64 vs %RHp\n", rc, pGstPT->a[i].u, pOldGstPT->a[i].u, pShwPT->a[i].u, HCPhys));
     1454                AssertMsg(rc == VINF_SUCCESS && PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]) == HCPhys, ("rc=%d guest %RX64 old %RX64 shw=%RX64 vs %RHp\n", rc, pGstPT->a[i].u, pOldGstPT->a[i].u, PGMSHWPTEPAE_GET_LOG(pShwPT->a[i]), HCPhys));
    14811455#endif
    1482                 uint64_t uHostAttr  = pShwPT->a[i].u & (X86_PTE_P | X86_PTE_US | X86_PTE_A | X86_PTE_D | X86_PTE_G | X86_PTE_PAE_NX);
    1483                 bool     fHostRW    = !!(pShwPT->a[i].u & X86_PTE_RW);
     1456                uint64_t uHostAttr  = PGMSHWPTEPAE_GET_U(pShwPT->a[i]) & (X86_PTE_P | X86_PTE_US | X86_PTE_A | X86_PTE_D | X86_PTE_G | X86_PTE_PAE_NX);
     1457                bool     fHostRW    = !!(PGMSHWPTEPAE_GET_U(pShwPT->a[i]) & X86_PTE_RW);
    14841458                uint64_t uGuestAttr = pGstPT->a[i].u & (X86_PTE_P | X86_PTE_US | X86_PTE_A | X86_PTE_D | X86_PTE_G | X86_PTE_PAE_NX);
    14851459                bool     fGuestRW   = !!(pGstPT->a[i].u & X86_PTE_RW);
     
    14921466            /* Something was changed, so flush it. */
    14931467            Log4(("pgmPoolTrackDerefPTPaePae: i=%d pte=%RX64 hint=%RX64\n",
    1494                   i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pOldGstPT->a[i].u & X86_PTE_PAE_PG_MASK));
    1495             pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pOldGstPT->a[i].u & X86_PTE_PAE_PG_MASK, i);
    1496             ASMAtomicWriteSize(&pShwPT->a[i].u, 0);
     1468                  i, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pOldGstPT->a[i].u & X86_PTE_PAE_PG_MASK));
     1469            pgmPoolTracDerefGCPhysHint(pPool, pPage, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pOldGstPT->a[i].u & X86_PTE_PAE_PG_MASK, i);
     1470            PGMSHWPTEPAE_ATOMIC_SET(pShwPT->a[i], 0);
    14971471        }
    14981472    }
     
    15551529    rc = PGM_GCPHYS_2_PTR(pVM, pPage->GCPhys, &pvGst); AssertReleaseRC(rc);
    15561530    bool  fFlush;
    1557     unsigned cChanges = pgmPoolTrackFlushPTPaePae(pPool, pPage, (PX86PTPAE)pvShw, (PCX86PTPAE)pvGst,
     1531    unsigned cChanges = pgmPoolTrackFlushPTPaePae(pPool, pPage, (PPGMSHWPTPAE)pvShw, (PCX86PTPAE)pvGst,
    15581532                                                  (PCX86PTPAE)&pPool->aDirtyPages[idxSlot][0], fAllowRemoval, &fFlush);
    15591533    PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvGst);
     
    16311605#ifdef VBOX_STRICT
    16321606    void *pvShw = PGMPOOL_PAGE_2_PTR(pVM, pPage);
    1633     pgmPoolTrackCheckPTPaePae(pPool, pPage, (PX86PTPAE)pvShw, (PCX86PTPAE)pvGst);
     1607    pgmPoolTrackCheckPTPaePae(pPool, pPage, (PPGMSHWPTPAE)pvShw, (PCX86PTPAE)pvGst);
    16341608    PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvShw);
    16351609#endif
     
    30042978                        break;
    30052979                    default:
     2980                        /* (shouldn't be here, will assert below) */
    30062981                        STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    30072982                        break;
     
    30543029        {
    30553030            const uint64_t  u64 = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PTE_P;
    3056             PX86PTPAE       pPT = (PX86PTPAE)PGMPOOL_PAGE_2_PTR(pVM, pPage);
     3031            PPGMSHWPTPAE    pPT = (PPGMSHWPTPAE)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    30573032            uint64_t        u64OrMask  = 0;
    30583033            uint64_t        u64AndMask = 0;
     
    30623037                switch (PGM_PAGE_GET_HNDL_PHYS_STATE(pPhysPage))
    30633038                {
    3064                     case PGM_PAGE_HNDL_PHYS_STATE_NONE:         /** No handler installed. */
    3065                     case PGM_PAGE_HNDL_PHYS_STATE_DISABLED:     /** Monitoring is temporarily disabled. */
     3039                    case PGM_PAGE_HNDL_PHYS_STATE_NONE:         /* No handler installed. */
     3040                    case PGM_PAGE_HNDL_PHYS_STATE_DISABLED:     /* Monitoring is temporarily disabled. */
    30663041                        u64OrMask = X86_PTE_RW;
    30673042                        u64AndMask = UINT64_MAX;
     
    30703045                        break;
    30713046
    3072                     case PGM_PAGE_HNDL_PHYS_STATE_WRITE:        /** Write access is monitored. */
     3047                    case PGM_PAGE_HNDL_PHYS_STATE_WRITE:        /* Write access is monitored. */
    30733048                        u64OrMask = 0;
    30743049                        u64AndMask = ~((uint64_t)X86_PTE_RW);
     
    30783053
    30793054                    default:
     3055                        /* (shouldn't be here, will assert below) */
    30803056                        STAM_COUNTER_INC(&pPool->StatTrackFlushEntry);
    30813057                        break;
     
    30943070            }
    30953071
    3096             if ((pPT->a[iPte].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
     3072            if ((PGMSHWPTEPAE_GET_U(pPT->a[iPte]) & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
    30973073            {
    30983074                X86PTEPAE Pte;
    30993075
    3100                 Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64\n", iPte, pPT->a[iPte]));
    3101                 Pte.u = (pPT->a[iPte].u & u64AndMask) | u64OrMask;
     3076                Log4(("pgmPoolTrackFlushGCPhysPTs: i=%d pte=%RX64\n", iPte, PGMSHWPTEPAE_GET_LOG(pPT->a[iPte])));
     3077                Pte.u = (PGMSHWPTEPAE_GET_U(pPT->a[iPte]) & u64AndMask) | u64OrMask;
    31023078                if (Pte.u & PGM_PTFLAGS_TRACK_DIRTY)
    31033079                    Pte.n.u1Write = 0;    /* need to disallow writes when dirty bit tracking is still active. */
    31043080
    3105                 ASMAtomicWriteSize(&pPT->a[iPte].u, Pte.u);
     3081                PGMSHWPTEPAE_ATOMIC_SET(pPT->a[iPte], Pte.u);
    31063082                PGM_DYNMAP_UNUSED_HINT_VM(pVM, pPT);
    31073083                return fRet;
     
    31093085#ifdef LOG_ENABLED
    31103086            Log(("iFirstPresent=%d cPresent=%d\n", pPage->iFirstPresent, pPage->cPresent));
    3111             Log(("Found %RX64 expected %RX64\n", pPT->a[iPte].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P), u64));
     3087            Log(("Found %RX64 expected %RX64\n", PGMSHWPTEPAE_GET_U(pPT->a[iPte]) & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX), u64));
    31123088            for (unsigned i = 0, cFound = 0; i < RT_ELEMENTS(pPT->a); i++)
    3113                 if ((pPT->a[i].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
     3089                if ((PGMSHWPTEPAE_GET_U(pPT->a[i]) & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
    31143090                    Log(("i=%d cFound=%d\n", i, ++cFound));
    31153091#endif
    3116             AssertFatalMsgFailed(("iFirstPresent=%d cPresent=%d u64=%RX64 poolkind=%x iPte=%d PT=%RX64\n", pPage->iFirstPresent, pPage->cPresent, u64, pPage->enmKind, iPte, pPT->a[iPte].u));
     3092            AssertFatalMsgFailed(("iFirstPresent=%d cPresent=%d u64=%RX64 poolkind=%x iPte=%d PT=%RX64\n", pPage->iFirstPresent, pPage->cPresent, u64, pPage->enmKind, iPte, PGMSHWPTEPAE_GET_LOG(pPT->a[iPte])));
    31173093            PGM_DYNMAP_UNUSED_HINT_VM(pVM, pPT);
    31183094            break;
     
    31543130        }
    31553131
    3156         /* AMD-V nested paging - @todo merge with EPT as we only check the parts that are identical. */
     3132        /* AMD-V nested paging */ /** @todo merge with EPT as we only check the parts that are identical. */
    31573133        case PGMPOOLKIND_PAE_PD_PHYS:
    31583134        {
     
    32773253 *
    32783254 * This is typically called when the host page backing the guest one has been
    3279  * replaced or when the page protection was changed due to an access handler.
     3255 * replaced or when the page protection was changed due to a guest access
     3256 * caught by the monitoring.
    32803257 *
    32813258 * @returns VBox status code.
     
    34223399     * This is simple but not quite optimal solution.
    34233400     */
    3424     const uint64_t  u64   = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PTE_P;
    3425     const uint32_t  u32   = u64;
     3401    const uint64_t  u64   = PGM_PAGE_GET_HCPHYS(pPhysPage) | X86_PTE_P;   /** @todo drop X86_PTE_P here as we always test if present separately, anyway. */
     3402    const uint32_t  u32   = u64;                                          /** @todo move into the 32BIT_PT_xx case */
    34263403    unsigned        cLeft = pPool->cUsedPages;
    34273404    unsigned        iPage = pPool->cCurPages;
     
    34703447                case PGMPOOLKIND_PAE_PT_FOR_PHYS:
    34713448                {
    3472                     unsigned  cPresent = pPage->cPresent;
    3473                     PX86PTPAE pPT = (PX86PTPAE)PGMPOOL_PAGE_2_PTR(pVM, pPage);
     3449                    unsigned        cPresent = pPage->cPresent;
     3450                    PPGMSHWPTPAE    pPT = (PPGMSHWPTPAE)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    34743451                    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    3475                         if (PGM_POOL_IS_PAE_PTE_PRESENT(pPT->a[i]))
     3452                        if (PGMSHWPTEPAE_IS_P(pPT->a[i]))
    34763453                        {
    3477                             if ((pPT->a[i].u & (X86_PTE_PAE_PG_MASK | X86_PTE_P | X86_PTE_PAE_MBZ_MASK_NX)) == u64)
     3454                            if ((PGMSHWPTEPAE_GET_U(pPT->a[i]) & (X86_PTE_PAE_PG_MASK | X86_PTE_P)) == u64)
    34783455                            {
    34793456                                //Log4(("pgmPoolTrackFlushGCPhysPTsSlow: idx=%d i=%d pte=%RX64\n", iPage, i, pPT->a[i]));
    3480                                 pPT->a[i].u = 0;
     3457                                PGMSHWPTEPAE_SET(pPT->a[i], 0); /// @todo why not atomic?
    34813458
    34823459                                /* Update the counter as we're removing references. */
     
    34983475                    PEPTPT    pPT = (PEPTPT)PGMPOOL_PAGE_2_PTR(pVM, pPage);
    34993476                    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pPT->a); i++)
    3500                         if (PGM_POOL_IS_EPT_PTE_PRESENT(pPT->a[i]))
     3477                        if (pPT->a[i].n.u1Present)
    35013478                        {
    35023479                            if ((pPT->a[i].u & (EPT_PTE_PG_MASK | X86_PTE_P)) == u64)
     
    41324109 * @param   pGstPT      The guest page table (just a half one).
    41334110 */
    4134 DECLINLINE(void) pgmPoolTrackDerefPTPae32Bit(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT, PCX86PT pGstPT)
     4111DECLINLINE(void) pgmPoolTrackDerefPTPae32Bit(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT, PCX86PT pGstPT)
    41354112{
    41364113    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pShwPT->a); i++)
    4137         if (PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]))
     4114        if (PGMSHWPTEPAE_IS_P(pShwPT->a[i]))
    41384115        {
    41394116            Log4(("pgmPoolTrackDerefPTPae32Bit: i=%d pte=%RX64 hint=%RX32\n",
    4140                   i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK));
    4141             pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PG_MASK, i);
     4117                  i, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pGstPT->a[i].u & X86_PTE_PG_MASK));
     4118            pgmPoolTracDerefGCPhysHint(pPool, pPage, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pGstPT->a[i].u & X86_PTE_PG_MASK, i);
    41424119            if (!pPage->cPresent)
    41434120                break;
     
    41544131 * @param   pGstPT      The guest page table.
    41554132 */
    4156 DECLINLINE(void) pgmPoolTrackDerefPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT, PCX86PTPAE pGstPT)
     4133DECLINLINE(void) pgmPoolTrackDerefPTPaePae(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT, PCX86PTPAE pGstPT)
    41574134{
    41584135    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pShwPT->a); i++)
    4159         if (PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]))
     4136        if (PGMSHWPTEPAE_IS_P(pShwPT->a[i]))
    41604137        {
    41614138            Log4(("pgmPoolTrackDerefPTPaePae: i=%d pte=%RX32 hint=%RX32\n",
    4162                   i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PAE_PG_MASK));
    4163             pgmPoolTracDerefGCPhysHint(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, pGstPT->a[i].u & X86_PTE_PAE_PG_MASK, i);
     4139                  i, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pGstPT->a[i].u & X86_PTE_PAE_PG_MASK));
     4140            pgmPoolTracDerefGCPhysHint(pPool, pPage, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), pGstPT->a[i].u & X86_PTE_PAE_PG_MASK, i);
    41644141            if (!pPage->cPresent)
    41654142                break;
     
    41974174 * @param   pShwPT      The shadow page table (mapping of the page).
    41984175 */
    4199 DECLINLINE(void) pgmPoolTrackDerefPTPaeBig(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PX86PTPAE pShwPT)
     4176DECLINLINE(void) pgmPoolTrackDerefPTPaeBig(PPGMPOOL pPool, PPGMPOOLPAGE pPage, PPGMSHWPTPAE pShwPT)
    42004177{
    42014178    RTGCPHYS GCPhys = pPage->GCPhys + PAGE_SIZE * pPage->iFirstPresent;
    42024179    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pShwPT->a); i++, GCPhys += PAGE_SIZE)
    4203         if (PGM_POOL_IS_PAE_PTE_PRESENT(pShwPT->a[i]))
     4180        if (PGMSHWPTEPAE_IS_P(pShwPT->a[i]))
    42044181        {
    42054182            Log4(("pgmPoolTrackDerefPTPaeBig: i=%d pte=%RX64 hint=%RGp\n",
    4206                   i, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, GCPhys));
    4207             pgmPoolTracDerefGCPhys(pPool, pPage, pShwPT->a[i].u & X86_PTE_PAE_PG_MASK, GCPhys, i);
     4183                  i, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), GCPhys));
     4184            pgmPoolTracDerefGCPhys(pPool, pPage, PGMSHWPTEPAE_GET_HCPHYS(pShwPT->a[i]), GCPhys, i);
    42084185            if (!pPage->cPresent)
    42094186                break;
     
    42234200    RTGCPHYS GCPhys = pPage->GCPhys + PAGE_SIZE * pPage->iFirstPresent;
    42244201    for (unsigned i = pPage->iFirstPresent; i < RT_ELEMENTS(pShwPT->a); i++, GCPhys += PAGE_SIZE)
    4225         if (PGM_POOL_IS_EPT_PTE_PRESENT(pShwPT->a[i]))
     4202        if (pShwPT->a[i].n.u1Present)
    42264203        {
    42274204            Log4(("pgmPoolTrackDerefPTEPT: i=%d pte=%RX64 GCPhys=%RX64\n",
     
    44614438            void *pvGst;
    44624439            int rc = PGM_GCPHYS_2_PTR_EX(pVM, pPage->GCPhys, &pvGst); AssertReleaseRC(rc);
    4463             pgmPoolTrackDerefPTPae32Bit(pPool, pPage, (PX86PTPAE)pvShw, (PCX86PT)pvGst);
     4440            pgmPoolTrackDerefPTPae32Bit(pPool, pPage, (PPGMSHWPTPAE)pvShw, (PCX86PT)pvGst);
    44644441            PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvGst);
    44654442            STAM_PROFILE_STOP(&pPool->StatTrackDerefGCPhys, g);
     
    44724449            void *pvGst;
    44734450            int rc = PGM_GCPHYS_2_PTR(pVM, pPage->GCPhys, &pvGst); AssertReleaseRC(rc);
    4474             pgmPoolTrackDerefPTPaePae(pPool, pPage, (PX86PTPAE)pvShw, (PCX86PTPAE)pvGst);
     4451            pgmPoolTrackDerefPTPaePae(pPool, pPage, (PPGMSHWPTPAE)pvShw, (PCX86PTPAE)pvGst);
    44754452            PGM_DYNMAP_UNUSED_HINT_VM(pVM, pvGst);
    44764453            STAM_PROFILE_STOP(&pPool->StatTrackDerefGCPhys, g);
     
    44924469        {
    44934470            STAM_PROFILE_START(&pPool->StatTrackDerefGCPhys, g);
    4494             pgmPoolTrackDerefPTPaeBig(pPool, pPage, (PX86PTPAE)pvShw);
     4471            pgmPoolTrackDerefPTPaeBig(pPool, pPage, (PPGMSHWPTPAE)pvShw);
    44954472            STAM_PROFILE_STOP(&pPool->StatTrackDerefGCPhys, g);
    44964473            break;
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r31178 r31775  
    3131#undef SHW_PD_MASK
    3232#undef SHW_PTE_PG_MASK
     33#undef SHW_PTE_IS_P
     34#undef SHW_PTE_IS_RW
     35#undef SHW_PTE_IS_US
     36#undef SHW_PTE_IS_A
     37#undef SHW_PTE_IS_D
     38#undef SHW_PTE_IS_P_RW
     39#undef SHW_PTE_IS_TRACK_DIRTY
     40#undef SHW_PTE_GET_HCPHYS
     41#undef SHW_PTE_GET_U
     42#undef SHW_PTE_LOG64
     43#undef SHW_PTE_SET
     44#undef SHW_PTE_ATOMIC_SET
     45#undef SHW_PTE_ATOMIC_SET2
     46#undef SHW_PTE_SET_RO
     47#undef SHW_PTE_SET_RW
    3348#undef SHW_PT_SHIFT
    3449#undef SHW_PT_MASK
     
    4055
    4156#if PGM_SHW_TYPE == PGM_TYPE_32BIT
    42 # define SHWPT                  X86PT
    43 # define PSHWPT                 PX86PT
    44 # define SHWPTE                 X86PTE
    45 # define PSHWPTE                PX86PTE
    46 # define SHWPD                  X86PD
    47 # define PSHWPD                 PX86PD
    48 # define SHWPDE                 X86PDE
    49 # define PSHWPDE                PX86PDE
    50 # define SHW_PDE_PG_MASK        X86_PDE_PG_MASK
    51 # define SHW_PD_SHIFT           X86_PD_SHIFT
    52 # define SHW_PD_MASK            X86_PD_MASK
    53 # define SHW_TOTAL_PD_ENTRIES   X86_PG_ENTRIES
    54 # define SHW_PTE_PG_MASK        X86_PTE_PG_MASK
    55 # define SHW_PT_SHIFT           X86_PT_SHIFT
    56 # define SHW_PT_MASK            X86_PT_MASK
    57 # define SHW_POOL_ROOT_IDX      PGMPOOL_IDX_PD
     57# define SHWPT                          X86PT
     58# define PSHWPT                         PX86PT
     59# define SHWPTE                         X86PTE
     60# define PSHWPTE                        PX86PTE
     61# define SHWPD                          X86PD
     62# define PSHWPD                         PX86PD
     63# define SHWPDE                         X86PDE
     64# define PSHWPDE                        PX86PDE
     65# define SHW_PDE_PG_MASK                X86_PDE_PG_MASK
     66# define SHW_PD_SHIFT                   X86_PD_SHIFT
     67# define SHW_PD_MASK                    X86_PD_MASK
     68# define SHW_TOTAL_PD_ENTRIES           X86_PG_ENTRIES
     69# define SHW_PTE_PG_MASK                X86_PTE_PG_MASK
     70# define SHW_PTE_IS_P(Pte)              ( (Pte).n.u1Present )
     71# define SHW_PTE_IS_RW(Pte)             ( (Pte).n.u1Write )
     72# define SHW_PTE_IS_US(Pte)             ( (Pte).n.u1User )
     73# define SHW_PTE_IS_A(Pte)              ( (Pte).n.u1Accessed )
     74# define SHW_PTE_IS_D(Pte)              ( (Pte).n.u1Dirty )
     75# define SHW_PTE_IS_P_RW(Pte)           ( (Pte).n.u1Present && (Pte).n.u1Write )
     76# define SHW_PTE_IS_TRACK_DIRTY(Pte)    ( !!((Pte).u & PGM_PTFLAGS_TRACK_DIRTY) )
     77# define SHW_PTE_GET_HCPHYS(Pte)        ( (Pte).u & X86_PTE_PG_MASK )
     78# define SHW_PTE_LOG64(Pte)             ( (uint64_t)(Pte).u )
     79# define SHW_PTE_GET_U(Pte)             ( (Pte).u )             /**< Use with care. */
     80# define SHW_PTE_SET(Pte, uNew)         do { (Pte).u = (uNew); } while (0)
     81# define SHW_PTE_ATOMIC_SET(Pte, uNew)  do { ASMAtomicWriteU32(&(Pte).u, (uNew)); } while (0)
     82# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) do { ASMAtomicWriteU32(&(Pte).u, (Pte2).u); } while (0)
     83# define SHW_PTE_SET_RO(Pte)            do { (Pte).n.u1Write = 0; } while (0)
     84# define SHW_PTE_SET_RW(Pte)            do { (Pte).n.u1Write = 1; } while (0)
     85# define SHW_PT_SHIFT                   X86_PT_SHIFT
     86# define SHW_PT_MASK                    X86_PT_MASK
     87# define SHW_POOL_ROOT_IDX              PGMPOOL_IDX_PD
    5888
    5989#elif PGM_SHW_TYPE == PGM_TYPE_EPT
    60 # define SHWPT                  EPTPT
    61 # define PSHWPT                 PEPTPT
    62 # define SHWPTE                 EPTPTE
    63 # define PSHWPTE                PEPTPTE
    64 # define SHWPD                  EPTPD
    65 # define PSHWPD                 PEPTPD
    66 # define SHWPDE                 EPTPDE
    67 # define PSHWPDE                PEPTPDE
    68 # define SHW_PDE_PG_MASK        EPT_PDE_PG_MASK
    69 # define SHW_PD_SHIFT           EPT_PD_SHIFT
    70 # define SHW_PD_MASK            EPT_PD_MASK
    71 # define SHW_PTE_PG_MASK        EPT_PTE_PG_MASK
    72 # define SHW_PT_SHIFT           EPT_PT_SHIFT
    73 # define SHW_PT_MASK            EPT_PT_MASK
    74 # define SHW_PDPT_SHIFT         EPT_PDPT_SHIFT
    75 # define SHW_PDPT_MASK          EPT_PDPT_MASK
    76 # define SHW_PDPE_PG_MASK       EPT_PDPE_PG_MASK
    77 # define SHW_TOTAL_PD_ENTRIES   (EPT_PG_AMD64_ENTRIES*EPT_PG_AMD64_PDPE_ENTRIES)
    78 # define SHW_POOL_ROOT_IDX      PGMPOOL_IDX_NESTED_ROOT      /* do not use! exception is real mode & protected mode without paging. */
     90# define SHWPT                          EPTPT
     91# define PSHWPT                         PEPTPT
     92# define SHWPTE                         EPTPTE
     93# define PSHWPTE                        PEPTPTE
     94# define SHWPD                          EPTPD
     95# define PSHWPD                         PEPTPD
     96# define SHWPDE                         EPTPDE
     97# define PSHWPDE                        PEPTPDE
     98# define SHW_PDE_PG_MASK                EPT_PDE_PG_MASK
     99# define SHW_PD_SHIFT                   EPT_PD_SHIFT
     100# define SHW_PD_MASK                    EPT_PD_MASK
     101# define SHW_PTE_PG_MASK                EPT_PTE_PG_MASK
     102# define SHW_PTE_IS_P(Pte)              ( (Pte).n.u1Present )  /* Approximation, works for us. */
     103# define SHW_PTE_IS_RW(Pte)             ( (Pte).n.u1Write )
     104# define SHW_PTE_IS_US(Pte)             ( true )
     105# define SHW_PTE_IS_A(Pte)              ( true )
     106# define SHW_PTE_IS_D(Pte)              ( true )
     107# define SHW_PTE_IS_P_RW(Pte)           ( (Pte).n.u1Present && (Pte).n.u1Write )
     108# define SHW_PTE_IS_TRACK_DIRTY(Pte)    ( false )
     109# define SHW_PTE_GET_HCPHYS(Pte)        ( (Pte).u & X86_PTE_PG_MASK )
     110# define SHW_PTE_LOG64(Pte)             ( (Pte).u )
     111# define SHW_PTE_GET_U(Pte)             ( (Pte).u )             /**< Use with care. */
     112# define SHW_PTE_SET(Pte, uNew)         do { (Pte).u = (uNew); } while (0)
     113# define SHW_PTE_ATOMIC_SET(Pte, uNew)  do { ASMAtomicWriteU64(&(Pte).u, (uNew)); } while (0)
     114# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) do { ASMAtomicWriteU64(&(Pte).u, (Pte2).u); } while (0)
     115# define SHW_PTE_SET_RO(Pte)            do { (Pte).n.u1Write = 0; } while (0)
     116# define SHW_PTE_SET_RW(Pte)            do { (Pte).n.u1Write = 1; } while (0)
     117# define SHW_PT_SHIFT                   EPT_PT_SHIFT
     118# define SHW_PT_MASK                    EPT_PT_MASK
     119# define SHW_PDPT_SHIFT                 EPT_PDPT_SHIFT
     120# define SHW_PDPT_MASK                  EPT_PDPT_MASK
     121# define SHW_PDPE_PG_MASK               EPT_PDPE_PG_MASK
     122# define SHW_TOTAL_PD_ENTRIES           (EPT_PG_AMD64_ENTRIES*EPT_PG_AMD64_PDPE_ENTRIES)
     123# define SHW_POOL_ROOT_IDX              PGMPOOL_IDX_NESTED_ROOT      /* do not use! exception is real mode & protected mode without paging. */
    79124
    80125#else
    81 # define SHWPT                  X86PTPAE
    82 # define PSHWPT                 PX86PTPAE
    83 # define SHWPTE                 X86PTEPAE
    84 # define PSHWPTE                PX86PTEPAE
    85 # define SHWPD                  X86PDPAE
    86 # define PSHWPD                 PX86PDPAE
    87 # define SHWPDE                 X86PDEPAE
    88 # define PSHWPDE                PX86PDEPAE
    89 # define SHW_PDE_PG_MASK        X86_PDE_PAE_PG_MASK
    90 # define SHW_PD_SHIFT           X86_PD_PAE_SHIFT
    91 # define SHW_PD_MASK            X86_PD_PAE_MASK
    92 # define SHW_PTE_PG_MASK        X86_PTE_PAE_PG_MASK
    93 # define SHW_PT_SHIFT           X86_PT_PAE_SHIFT
    94 # define SHW_PT_MASK            X86_PT_PAE_MASK
     126# define SHWPT                          PGMSHWPTPAE
     127# define PSHWPT                         PPGMSHWPTPAE
     128# define SHWPTE                         PGMSHWPTEPAE
     129# define PSHWPTE                        PPGMSHWPTEPAE
     130# define SHWPD                          X86PDPAE
     131# define PSHWPD                         PX86PDPAE
     132# define SHWPDE                         X86PDEPAE
     133# define PSHWPDE                        PX86PDEPAE
     134# define SHW_PDE_PG_MASK                X86_PDE_PAE_PG_MASK
     135# define SHW_PD_SHIFT                   X86_PD_PAE_SHIFT
     136# define SHW_PD_MASK                    X86_PD_PAE_MASK
     137# define SHW_PTE_PG_MASK                X86_PTE_PAE_PG_MASK
     138# define SHW_PTE_IS_P(Pte)              PGMSHWPTEPAE_IS_P(Pte)
     139# define SHW_PTE_IS_RW(Pte)             PGMSHWPTEPAE_IS_RW(Pte)
     140# define SHW_PTE_IS_US(Pte)             PGMSHWPTEPAE_IS_US(Pte)
     141# define SHW_PTE_IS_A(Pte)              PGMSHWPTEPAE_IS_A(Pte)
     142# define SHW_PTE_IS_D(Pte)              PGMSHWPTEPAE_IS_D(Pte)
     143# define SHW_PTE_IS_P_RW(Pte)           PGMSHWPTEPAE_IS_P_RW(Pte)
     144# define SHW_PTE_IS_TRACK_DIRTY(Pte)    PGMSHWPTEPAE_IS_TRACK_DIRTY(Pte)
     145# define SHW_PTE_GET_HCPHYS(Pte)        PGMSHWPTEPAE_GET_HCPHYS(Pte)
     146# define SHW_PTE_LOG64(Pte)             PGMSHWPTEPAE_GET_LOG(Pte)
     147# define SHW_PTE_GET_U(Pte)             PGMSHWPTEPAE_GET_U(Pte)     /**< Use with care. */
     148# define SHW_PTE_SET(Pte, uNew)         PGMSHWPTEPAE_SET(Pte, uNew)
     149# define SHW_PTE_ATOMIC_SET(Pte, uNew)  PGMSHWPTEPAE_ATOMIC_SET(Pte, uNew)
     150# define SHW_PTE_ATOMIC_SET2(Pte, Pte2) PGMSHWPTEPAE_ATOMIC_SET2(Pte, Pte2)
     151# define SHW_PTE_SET_RO(Pte)            PGMSHWPTEPAE_SET_RO(Pte)
     152# define SHW_PTE_SET_RW(Pte)            PGMSHWPTEPAE_SET_RW(Pte)
     153# define SHW_PT_SHIFT                   X86_PT_PAE_SHIFT
     154# define SHW_PT_MASK                    X86_PT_PAE_MASK
    95155
    96156# if PGM_SHW_TYPE == PGM_TYPE_AMD64
    97 #  define SHW_PDPT_SHIFT        X86_PDPT_SHIFT
    98 #  define SHW_PDPT_MASK         X86_PDPT_MASK_AMD64
    99 #  define SHW_PDPE_PG_MASK      X86_PDPE_PG_MASK
    100 #  define SHW_TOTAL_PD_ENTRIES  (X86_PG_AMD64_ENTRIES*X86_PG_AMD64_PDPE_ENTRIES)
    101 #  define SHW_POOL_ROOT_IDX     PGMPOOL_IDX_AMD64_CR3
     157#  define SHW_PDPT_SHIFT                X86_PDPT_SHIFT
     158#  define SHW_PDPT_MASK                 X86_PDPT_MASK_AMD64
     159#  define SHW_PDPE_PG_MASK              X86_PDPE_PG_MASK
     160#  define SHW_TOTAL_PD_ENTRIES          (X86_PG_AMD64_ENTRIES * X86_PG_AMD64_PDPE_ENTRIES)
     161#  define SHW_POOL_ROOT_IDX             PGMPOOL_IDX_AMD64_CR3
    102162
    103163# else /* 32 bits PAE mode */
    104 #  define SHW_PDPT_SHIFT        X86_PDPT_SHIFT
    105 #  define SHW_PDPT_MASK         X86_PDPT_MASK_PAE
    106 #  define SHW_PDPE_PG_MASK      X86_PDPE_PG_MASK
    107 #  define SHW_TOTAL_PD_ENTRIES  (X86_PG_PAE_ENTRIES*X86_PG_PAE_PDPE_ENTRIES)
    108 #  define SHW_POOL_ROOT_IDX     PGMPOOL_IDX_PDPT
     164#  define SHW_PDPT_SHIFT                X86_PDPT_SHIFT
     165#  define SHW_PDPT_MASK                 X86_PDPT_MASK_PAE
     166#  define SHW_PDPE_PG_MASK              X86_PDPE_PG_MASK
     167#  define SHW_TOTAL_PD_ENTRIES          (X86_PG_PAE_ENTRIES * X86_PG_PAE_PDPE_ENTRIES)
     168#  define SHW_POOL_ROOT_IDX             PGMPOOL_IDX_PDPT
    109169
    110170# endif
     
    254314    const unsigned  iPt = (GCPtr >> SHW_PT_SHIFT) & SHW_PT_MASK;
    255315    SHWPTE          Pte = pPT->a[iPt];
    256     if (!Pte.n.u1Present)
     316    if (!SHW_PTE_IS_P(Pte))
    257317        return VERR_PAGE_NOT_PRESENT;
    258318
     
    264324    if (pfFlags)
    265325    {
    266         *pfFlags = (Pte.u & ~SHW_PTE_PG_MASK)
     326        *pfFlags = (SHW_PTE_GET_U(Pte) & ~SHW_PTE_PG_MASK)
    267327                 & ((Pde.u & (X86_PTE_RW | X86_PTE_US)) | ~(uint64_t)(X86_PTE_RW | X86_PTE_US));
    268328# if PGM_WITH_NX(PGM_SHW_TYPE, PGM_SHW_TYPE) /** @todo why do we have to check the guest state here? */
    269329        /* The NX bit is determined by a bitwise OR between the PT and PD */
    270         if (((Pte.u | Pde.u) & X86_PTE_PAE_NX) && CPUMIsGuestNXEnabled(pVCpu))
     330        if (((SHW_PTE_GET_U(Pte) | Pde.u) & X86_PTE_PAE_NX) && CPUMIsGuestNXEnabled(pVCpu))
    271331            *pfFlags |= X86_PTE_PAE_NX;
    272332# endif
     
    274334
    275335    if (pHCPhys)
    276         *pHCPhys = Pte.u & SHW_PTE_PG_MASK;
     336        *pHCPhys = SHW_PTE_GET_HCPHYS(Pte);
    277337
    278338    return VINF_SUCCESS;
     
    375435        while (iPTE < RT_ELEMENTS(pPT->a))
    376436        {
    377             if (pPT->a[iPTE].n.u1Present)
     437            if (SHW_PTE_IS_P(pPT->a[iPTE]))
    378438            {
    379439                SHWPTE const    OrgPte = pPT->a[iPTE];
    380440                SHWPTE          NewPte;
    381441
    382                 NewPte.u = (OrgPte.u & (fMask | SHW_PTE_PG_MASK)) | (fFlags & ~SHW_PTE_PG_MASK);
    383                 Assert(NewPte.n.u1Present);
    384                 if (!NewPte.n.u1Present)
     442                SHW_PTE_SET(NewPte, (SHW_PTE_GET_U(OrgPte) & (fMask | SHW_PTE_PG_MASK)) | (fFlags & ~SHW_PTE_PG_MASK));
     443                if (!SHW_PTE_IS_P(NewPte))
    385444                {
    386445                    /** @todo Some CSAM code path might end up here and upset
     
    388447                    AssertFailed();
    389448                }
    390                 else if (   NewPte.n.u1Write
    391                          && !OrgPte.n.u1Write
     449                else if (   SHW_PTE_IS_RW(NewPte)
     450                         && !SHW_PTE_IS_RW(OrgPte)
    392451                         && !(fOpFlags & PGM_MK_PG_IS_MMIO2) )
    393452                {
     
    414473                }
    415474
    416                 ASMAtomicWriteSize(&pPT->a[iPTE], NewPte.u);
     475                SHW_PTE_ATOMIC_SET2(pPT->a[iPTE], NewPte);
    417476# if PGM_SHW_TYPE == PGM_TYPE_EPT
    418477                HWACCMInvalidatePhysPage(pVM, (RTGCPHYS)GCPtr);
  • trunk/src/VBox/VMM/VMMGC/PGMGCShw.h

    r28800 r31775  
    5050# define SHW_PT_MASK            X86_PT_MASK
    5151#else
    52 # define SHWPT                  X86PTPAE
    53 # define PSHWPT                 PX86PTPAE
    54 # define SHWPTE                 X86PTEPAE
    55 # define PSHWPTE                PX86PTEPAE
     52# define SHWPT                  PGMSHWPTPAE
     53# define PSHWPT                 PPGMSHWPTPAE
     54# define SHWPTE                 PGMSHWPTEPAE
     55# define PSHWPTE                PPGMSHWPTEPAE
    5656# define SHWPD                  X86PDPAE
    5757# define PSHWPD                 PX86PDPAE
  • trunk/src/VBox/VMM/VMMRZ/PGMRZDynMap.cpp

    r31445 r31775  
    12911291            pThis->paPages[iPage].uPte.pLegacy = &pVM->pgm.s.paDynPageMap32BitPTEsGC[iPage];
    12921292        else
    1293             pThis->paPages[iPage].uPte.pPae    = &pVM->pgm.s.paDynPageMapPaePTEsGC[iPage];
     1293            pThis->paPages[iPage].uPte.pPae    = (PX86PTEPAE)&pVM->pgm.s.paDynPageMapPaePTEsGC[iPage];
    12941294    }
    12951295
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