VirtualBox

Changeset 86453 in vbox for trunk/src/VBox/VMM/VMMAll


Ignore:
Timestamp:
Oct 5, 2020 5:42:00 PM (4 years ago)
Author:
vboxsync
Message:

VMM/PGM: Workaround for buggy gcc (10.2.1) clearing high dword of PDE. bugref:9841

Location:
trunk/src/VBox/VMM/VMMAll
Files:
3 edited

Legend:

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

    r82968 r86453  
    17561756        pgmPoolCacheUsed(pPool, pShwPage);
    17571757    }
     1758
    17581759    /* The PDPT was cached or created; hook it up now and fill with the default value. */
     1760/** @todo r=bird: This is sub-optimal, gcc 10 generates a qword move of the address followed by
     1761 *        a byte write of the 0x7 flag value.  These two writes should be combined, but for that
     1762 *        we need to add/find the EPT flag defines. */
     1763/** @todo r=bird: use atomic writes here and maybe only update if really needed? */
    17591764    pPml4e->u           = pShwPage->Core.Key;
    17601765    pPml4e->n.u1Present = 1;
  • trunk/src/VBox/VMM/VMMAll/PGMAllBth.h

    r82968 r86453  
    12491249                         GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u, pShwPage->GCPhys, iPDDst));
    12501250                pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    1251                 ASMAtomicWriteSize(pPdeDst, 0);
     1251                SHW_PDE_ATOMIC_SET(*pPdeDst, 0);
    12521252                STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,InvalidatePagePDOutOfSync));
    12531253                PGM_INVL_VCPU_TLBS(pVCpu);
     
    12921292                     GCPtrPage, (uint64_t)PdeSrc.u, (uint64_t)PdeDst.u));
    12931293            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    1294             ASMAtomicWriteSize(pPdeDst, 0);
     1294            SHW_PDE_ATOMIC_SET(*pPdeDst, 0);
    12951295            STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,InvalidatePage4MBPages));
    12961296            PGM_INVL_BIG_PG(pVCpu, GCPtrPage);
     
    13051305        {
    13061306            pgmPoolFree(pVM, PdeDst.u & SHW_PDE_PG_MASK, pShwPde->idx, iPDDst);
    1307             ASMAtomicWriteSize(pPdeDst, 0);
     1307            SHW_PDE_ATOMIC_SET(*pPdeDst, 0);
    13081308            STAM_COUNTER_INC(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,InvalidatePagePDNPs));
    13091309            PGM_INVL_PG(pVCpu, GCPtrPage);
     
    20382038                        PdeDst.n.u1Write = PdeSrc.n.u1Write;
    20392039                    }
    2040                     ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     2040                    SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    20412041                    Log2(("SyncPage: BIG %RGv PdeSrc:{P=%d RW=%d U=%d raw=%08llx} GCPhys=%RGp%s\n",
    20422042                          GCPtrPage, PdeSrc.n.u1Present, PdeSrc.n.u1Write, PdeSrc.n.u1User, (uint64_t)PdeSrc.u, GCPhys,
     
    20742074     */
    20752075    pgmPoolFreeByPage(pPool, pShwPage, pShwPde->idx, iPDDst);
    2076     ASMAtomicWriteSize(pPdeDst, 0);
     2076    SHW_PDE_ATOMIC_SET(*pPdeDst, 0);
    20772077
    20782078    PGM_DYNMAP_UNUSED_HINT(pVCpu, pPdeDst);
     
    23162316            PdeDst.n.u1Accessed   = 1;
    23172317            PdeDst.au32[0]       &= ~PGM_PDFLAGS_TRACK_DIRTY;
    2318             ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     2318            SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    23192319            PGM_INVL_BIG_PG(pVCpu, GCPtrPage);
    23202320            return VINF_PGM_HANDLED_DIRTY_BIT_FAULT;    /* restarts the instruction. */
     
    26482648                }
    26492649            }
    2650             ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     2650            SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    26512651            PGM_DYNMAP_UNUSED_HINT(pVCpu, pPdeDst);
    26522652            return VINF_SUCCESS;
     
    26902690                PdeDst.u = (PdeDst.u & (SHW_PDE_PG_MASK | X86_PDE_AVL_MASK))
    26912691                         | GST_GET_PDE_SHW_FLAGS(pVCpu, PdeSrc);
    2692                 ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     2692                SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    26932693                PGM_DYNMAP_UNUSED_HINT(pVCpu, pPdeDst);
    26942694
     
    27862786                PdeDst.b.u1Write = 0;
    27872787            }
    2788             ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     2788            SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    27892789            PGM_DYNMAP_UNUSED_HINT(pVCpu, pPdeDst);
    27902790
     
    29782978
    29792979    /* Fetch the pgm pool shadow descriptor. */
     2980    /** @todo r=bird: didn't pgmShwGetEPTPDPtr just do this lookup already? */
    29802981    PPGMPOOLPAGE pShwPde = pgmPoolGetPage(pPool, pPdptDst->a[iPdpt].u & EPT_PDPTE_PG_MASK);
    29812982    Assert(pShwPde);
     
    30393040            {
    30403041                PdeDst.u &= X86_PDE_AVL_MASK;
    3041                 PdeDst.u |= HCPhys;
    30423042                PdeDst.n.u1Present   = 1;
    30433043                PdeDst.n.u1Write     = 1;
     
    30503050                PdeDst.n.u1User      = 1;
    30513051#  endif
    3052                 ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     3052                PdeDst.u |= HCPhys; /* Note! Must be done last of gcc v10.2.1 20200723 (Red Hat 10.2.1-1) may drop the top 32 bits. */
     3053                SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    30533054
    30543055                Log(("SyncPT: Use large page at %RGp PDE=%RX64\n", GCPtrPage, PdeDst.u));
     
    31123113    /* Save the new PDE. */
    31133114    PdeDst.u &= X86_PDE_AVL_MASK;
    3114     PdeDst.u |= pShwPage->Core.Key;
    31153115    PdeDst.n.u1Present  = 1;
    31163116    PdeDst.n.u1Write    = 1;
     
    31213121    PdeDst.n.u1Accessed = 1;
    31223122# endif
    3123     ASMAtomicWriteSize(pPdeDst, PdeDst.u);
     3123    PdeDst.u |= pShwPage->Core.Key; /* Note! Must be done last of gcc v10.2.1 20200723 (Red Hat 10.2.1-1) drops the top 32 bits. */
     3124    /** @todo r=bird: Stop using bitfields.  But we need to defined/find the EPT flags then. */
     3125    SHW_PDE_ATOMIC_SET2(*pPdeDst, PdeDst);
    31243126
    31253127    STAM_PROFILE_STOP(&pVCpu->pgm.s.CTX_SUFF(pStats)->CTX_MID_Z(Stat,SyncPT), a);
  • trunk/src/VBox/VMM/VMMAll/PGMAllShw.h

    r82968 r86453  
    3131#undef SHW_PD_SHIFT
    3232#undef SHW_PD_MASK
     33#undef SHW_PDE_ATOMIC_SET
     34#undef SHW_PDE_ATOMIC_SET2
    3335#undef SHW_PTE_PG_MASK
    3436#undef SHW_PTE_IS_P
     
    6769# define SHW_PD_MASK                    X86_PD_MASK
    6870# define SHW_TOTAL_PD_ENTRIES           X86_PG_ENTRIES
     71# define SHW_PDE_ATOMIC_SET(Pde, uNew)  do { ASMAtomicWriteU32(&(Pde).u, (uNew)); } while (0)
     72# define SHW_PDE_ATOMIC_SET2(Pde, Pde2) do { ASMAtomicWriteU32(&(Pde).u, (Pde2).u); } while (0)
    6973# define SHW_PTE_PG_MASK                X86_PTE_PG_MASK
    7074# define SHW_PTE_IS_P(Pte)              ( (Pte).n.u1Present )
     
    98102# define SHW_PD_SHIFT                   EPT_PD_SHIFT
    99103# define SHW_PD_MASK                    EPT_PD_MASK
     104# define SHW_PDE_ATOMIC_SET(Pde, uNew)  do { ASMAtomicWriteU64(&(Pde).u, (uNew)); } while (0)
     105# define SHW_PDE_ATOMIC_SET2(Pde, Pde2) do { ASMAtomicWriteU64(&(Pde).u, (Pde2).u); } while (0)
    100106# define SHW_PTE_PG_MASK                EPT_PTE_PG_MASK
    101107# define SHW_PTE_IS_P(Pte)              ( (Pte).n.u1Present )  /* Approximation, works for us. */
     
    133139# define SHW_PD_SHIFT                   X86_PD_PAE_SHIFT
    134140# define SHW_PD_MASK                    X86_PD_PAE_MASK
     141# define SHW_PDE_ATOMIC_SET(Pde, uNew)  do { ASMAtomicWriteU64(&(Pde).u, (uNew)); } while (0)
     142# define SHW_PDE_ATOMIC_SET2(Pde, Pde2) do { ASMAtomicWriteU64(&(Pde).u, (Pde2).u); } while (0)
    135143# define SHW_PTE_PG_MASK                X86_PTE_PAE_PG_MASK
    136144# define SHW_PTE_IS_P(Pte)              PGMSHWPTEPAE_IS_P(Pte)
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