lkml.org 
[lkml]   [2018]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 21/34] x86/mm/pae: Populate valid user PGD entries
    Date
    From: Joerg Roedel <jroedel@suse.de>

    Generic page-table code populates all non-leaf entries with
    _KERNPG_TABLE bits set. This is fine for all paging modes
    except PAE.

    In PAE mode only a subset of the bits is allowed to be set.
    Make sure we only set allowed bits by masking out the
    reserved bits.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    ---
    arch/x86/include/asm/pgtable_types.h | 28 ++++++++++++++++++++++++++--
    1 file changed, 26 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h
    index 3696398..48fc70b 100644
    --- a/arch/x86/include/asm/pgtable_types.h
    +++ b/arch/x86/include/asm/pgtable_types.h
    @@ -50,6 +50,7 @@
    #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL)
    #define _PAGE_SOFTW1 (_AT(pteval_t, 1) << _PAGE_BIT_SOFTW1)
    #define _PAGE_SOFTW2 (_AT(pteval_t, 1) << _PAGE_BIT_SOFTW2)
    +#define _PAGE_SOFTW3 (_AT(pteval_t, 1) << _PAGE_BIT_SOFTW3)
    #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT)
    #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE)
    #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL)
    @@ -267,14 +268,37 @@ typedef struct pgprot { pgprotval_t pgprot; } pgprot_t;

    typedef struct { pgdval_t pgd; } pgd_t;

    +#ifdef CONFIG_X86_PAE
    +
    +/*
    + * PHYSICAL_PAGE_MASK might be non-constant when SME is compiled in, so we can't
    + * use it here.
    + */
    +
    +#define PGD_PAE_PAGE_MASK ((signed long)PAGE_MASK)
    +#define PGD_PAE_PHYS_MASK (((1ULL << __PHYSICAL_MASK_SHIFT)-1) & PGD_PAE_PAGE_MASK)
    +
    +/*
    + * PAE allows Base Address, P, PWT, PCD and AVL bits to be set in PGD entries.
    + * All other bits are Reserved MBZ
    + */
    +#define PGD_ALLOWED_BITS (PGD_PAE_PHYS_MASK | _PAGE_PRESENT | \
    + _PAGE_PWT | _PAGE_PCD | \
    + _PAGE_SOFTW1 | _PAGE_SOFTW2 | _PAGE_SOFTW3 )
    +
    +#else
    +/* No need to mask any bits for !PAE */
    +#define PGD_ALLOWED_BITS (~0ULL)
    +#endif
    +
    static inline pgd_t native_make_pgd(pgdval_t val)
    {
    - return (pgd_t) { val };
    + return (pgd_t) { val & PGD_ALLOWED_BITS };
    }

    static inline pgdval_t native_pgd_val(pgd_t pgd)
    {
    - return pgd.pgd;
    + return pgd.pgd & PGD_ALLOWED_BITS;
    }

    static inline pgdval_t pgd_flags(pgd_t pgd)
    --
    2.7.4
    \
     
     \ /
      Last update: 2018-03-05 11:27    [W:4.038 / U:0.660 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site