lkml.org 
[lkml]   [2018]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/pti] x86/pgtable: Move two more functions from pgtable_64.h to pgtable.h
    Commit-ID:  76e258add7b653b60037ee4b25ebc40da6a35c4a
    Gitweb: https://git.kernel.org/tip/76e258add7b653b60037ee4b25ebc40da6a35c4a
    Author: Joerg Roedel <jroedel@suse.de>
    AuthorDate: Wed, 18 Jul 2018 11:40:57 +0200
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitDate: Fri, 20 Jul 2018 01:11:42 +0200

    x86/pgtable: Move two more functions from pgtable_64.h to pgtable.h

    These two functions are required for PTI on 32 bit:

    * pgdp_maps_userspace()
    * pgd_large()

    Also re-implement pgdp_maps_userspace() so that it will work on 64 and 32
    bit kernels.

    Signed-off-by: Joerg Roedel <jroedel@suse.de>
    Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
    Tested-by: Pavel Machek <pavel@ucw.cz>
    Cc: "H . Peter Anvin" <hpa@zytor.com>
    Cc: linux-mm@kvack.org
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Juergen Gross <jgross@suse.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: David Laight <David.Laight@aculab.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: Eduardo Valentin <eduval@amazon.com>
    Cc: Greg KH <gregkh@linuxfoundation.org>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: aliguori@amazon.com
    Cc: daniel.gruss@iaik.tugraz.at
    Cc: hughd@google.com
    Cc: keescook@google.com
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Waiman Long <llong@redhat.com>
    Cc: "David H . Gutteridge" <dhgutteridge@sympatico.ca>
    Cc: joro@8bytes.org
    Link: https://lkml.kernel.org/r/1531906876-13451-21-git-send-email-joro@8bytes.org

    ---
    arch/x86/include/asm/pgtable-2level_types.h | 3 +++
    arch/x86/include/asm/pgtable-3level_types.h | 1 +
    arch/x86/include/asm/pgtable.h | 15 ++++++++++++
    arch/x86/include/asm/pgtable_32.h | 2 --
    arch/x86/include/asm/pgtable_64.h | 36 -----------------------------
    arch/x86/include/asm/pgtable_64_types.h | 2 ++
    6 files changed, 21 insertions(+), 38 deletions(-)

    diff --git a/arch/x86/include/asm/pgtable-2level_types.h b/arch/x86/include/asm/pgtable-2level_types.h
    index f982ef808e7e..6deb6cd236e3 100644
    --- a/arch/x86/include/asm/pgtable-2level_types.h
    +++ b/arch/x86/include/asm/pgtable-2level_types.h
    @@ -35,4 +35,7 @@ typedef union {

    #define PTRS_PER_PTE 1024

    +/* This covers all VMSPLIT_* and VMSPLIT_*_OPT variants */
    +#define PGD_KERNEL_START (CONFIG_PAGE_OFFSET >> PGDIR_SHIFT)
    +
    #endif /* _ASM_X86_PGTABLE_2LEVEL_DEFS_H */
    diff --git a/arch/x86/include/asm/pgtable-3level_types.h b/arch/x86/include/asm/pgtable-3level_types.h
    index 78038e057876..858358a82b14 100644
    --- a/arch/x86/include/asm/pgtable-3level_types.h
    +++ b/arch/x86/include/asm/pgtable-3level_types.h
    @@ -46,5 +46,6 @@ typedef union {
    #define PTRS_PER_PTE 512

    #define MAX_POSSIBLE_PHYSMEM_BITS 36
    +#define PGD_KERNEL_START (CONFIG_PAGE_OFFSET >> PGDIR_SHIFT)

    #endif /* _ASM_X86_PGTABLE_3LEVEL_DEFS_H */
    diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
    index cc117161f13d..e39088cb59ab 100644
    --- a/arch/x86/include/asm/pgtable.h
    +++ b/arch/x86/include/asm/pgtable.h
    @@ -1177,6 +1177,21 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
    }
    }
    #endif
    +/*
    + * Page table pages are page-aligned. The lower half of the top
    + * level is used for userspace and the top half for the kernel.
    + *
    + * Returns true for parts of the PGD that map userspace and
    + * false for the parts that map the kernel.
    + */
    +static inline bool pgdp_maps_userspace(void *__ptr)
    +{
    + unsigned long ptr = (unsigned long)__ptr;
    +
    + return (((ptr & ~PAGE_MASK) / sizeof(pgd_t)) < PGD_KERNEL_START);
    +}
    +
    +static inline int pgd_large(pgd_t pgd) { return 0; }

    #ifdef CONFIG_PAGE_TABLE_ISOLATION
    /*
    diff --git a/arch/x86/include/asm/pgtable_32.h b/arch/x86/include/asm/pgtable_32.h
    index 88a056b01db4..b3ec519e3982 100644
    --- a/arch/x86/include/asm/pgtable_32.h
    +++ b/arch/x86/include/asm/pgtable_32.h
    @@ -34,8 +34,6 @@ static inline void check_pgt_cache(void) { }
    void paging_init(void);
    void sync_initial_page_table(void);

    -static inline int pgd_large(pgd_t pgd) { return 0; }
    -
    /*
    * Define this if things work differently on an i386 and an i486:
    * it will (on an i486) warn about kernel memory accesses that are
    diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h
    index 4adba19c7bf6..acb6970e7bcf 100644
    --- a/arch/x86/include/asm/pgtable_64.h
    +++ b/arch/x86/include/asm/pgtable_64.h
    @@ -132,41 +132,6 @@ static inline pud_t native_pudp_get_and_clear(pud_t *xp)
    #endif
    }

    -/*
    - * Page table pages are page-aligned. The lower half of the top
    - * level is used for userspace and the top half for the kernel.
    - *
    - * Returns true for parts of the PGD that map userspace and
    - * false for the parts that map the kernel.
    - */
    -static inline bool pgdp_maps_userspace(void *__ptr)
    -{
    - unsigned long ptr = (unsigned long)__ptr;
    -
    - return (ptr & ~PAGE_MASK) < (PAGE_SIZE / 2);
    -}
    -
    -#ifdef CONFIG_PAGE_TABLE_ISOLATION
    -pgd_t __pti_set_user_pgtbl(pgd_t *pgdp, pgd_t pgd);
    -
    -/*
    - * Take a PGD location (pgdp) and a pgd value that needs to be set there.
    - * Populates the user and returns the resulting PGD that must be set in
    - * the kernel copy of the page tables.
    - */
    -static inline pgd_t pti_set_user_pgtbl(pgd_t *pgdp, pgd_t pgd)
    -{
    - if (!static_cpu_has(X86_FEATURE_PTI))
    - return pgd;
    - return __pti_set_user_pgtbl(pgdp, pgd);
    -}
    -#else
    -static inline pgd_t pti_set_user_pgtbl(pgd_t *pgdp, pgd_t pgd)
    -{
    - return pgd;
    -}
    -#endif
    -
    static inline void native_set_p4d(p4d_t *p4dp, p4d_t p4d)
    {
    pgd_t pgd;
    @@ -206,7 +171,6 @@ extern void sync_global_pgds(unsigned long start, unsigned long end);
    /*
    * Level 4 access.
    */
    -static inline int pgd_large(pgd_t pgd) { return 0; }
    #define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE)

    /* PUD - Level3 access */
    diff --git a/arch/x86/include/asm/pgtable_64_types.h b/arch/x86/include/asm/pgtable_64_types.h
    index 054765ab2da2..066e0ab9ffab 100644
    --- a/arch/x86/include/asm/pgtable_64_types.h
    +++ b/arch/x86/include/asm/pgtable_64_types.h
    @@ -153,4 +153,6 @@ extern unsigned int ptrs_per_p4d;

    #define EARLY_DYNAMIC_PAGE_TABLES 64

    +#define PGD_KERNEL_START ((PAGE_SIZE / 2) / sizeof(pgd_t))
    +
    #endif /* _ASM_X86_PGTABLE_64_DEFS_H */
    \
     
     \ /
      Last update: 2018-07-20 01:30    [W:4.833 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site