Messages in this thread Patch in this message | | | From | Joerg Roedel <> | Subject | [PATCH 07/16] x86/mm: Move two more functions from pgtable_64.h to pgtable.h | Date | Tue, 16 Jan 2018 17:36:50 +0100 |
| |
From: Joerg Roedel <jroedel@suse.de>
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> --- arch/x86/include/asm/pgtable.h | 16 ++++++++++++++++ arch/x86/include/asm/pgtable_64.h | 15 --------------- 2 files changed, 16 insertions(+), 15 deletions(-)
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 0a9f746cbdc1..abafe4d7fd3e 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h @@ -1109,6 +1109,22 @@ static inline int pud_write(pud_t pud) return pud_flags(pud) & _PAGE_RW; } +/* + * 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)) < KERNEL_PGD_BOUNDARY); +} + +static inline int pgd_large(pgd_t pgd) { return 0; } + #ifdef CONFIG_PAGE_TABLE_ISOLATION /* * All top-level PAGE_TABLE_ISOLATION page tables are order-1 pages diff --git a/arch/x86/include/asm/pgtable_64.h b/arch/x86/include/asm/pgtable_64.h index 58d7f10e937d..3c5a73c8bb50 100644 --- a/arch/x86/include/asm/pgtable_64.h +++ b/arch/x86/include/asm/pgtable_64.h @@ -131,20 +131,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_pgd(pgd_t *pgdp, pgd_t pgd); @@ -208,7 +194,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 */ -- 2.13.6
| |