Commit 757b2a4a authored by Steven Price's avatar Steven Price Committed by Linus Torvalds

x86: mm: add p?d_leaf() definitions

walk_page_range() is going to be allowed to walk page tables other than
those of user space.  For this it needs to know when it has reached a
'leaf' entry in the page tables.  This information is provided by the
p?d_leaf() functions/macros.

For x86 we already have p?d_large() functions, so simply add macros to
provide the generic p?d_leaf() names for the generic code.

Link: http://lkml.kernel.org/r/20191218162402.45610-11-steven.price@arm.comSigned-off-by: default avatarSteven Price <steven.price@arm.com>
Cc: Albert Ou <aou@eecs.berkeley.edu>
Cc: Alexandre Ghiti <alex@ghiti.fr>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: Dave Hansen <dave.hansen@linux.intel.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Heiko Carstens <heiko.carstens@de.ibm.com>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Hogan <jhogan@kernel.org>
Cc: James Morse <james.morse@arm.com>
Cc: Jerome Glisse <jglisse@redhat.com>
Cc: "Liang, Kan" <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Paul Burton <paul.burton@mips.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Paul Walmsley <paul.walmsley@sifive.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Russell King <linux@armlinux.org.uk>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Cc: Vineet Gupta <vgupta@synopsys.com>
Cc: Will Deacon <will@kernel.org>
Cc: Zong Li <zong.li@sifive.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 80942493
...@@ -239,6 +239,7 @@ static inline unsigned long pgd_pfn(pgd_t pgd) ...@@ -239,6 +239,7 @@ static inline unsigned long pgd_pfn(pgd_t pgd)
return (pgd_val(pgd) & PTE_PFN_MASK) >> PAGE_SHIFT; return (pgd_val(pgd) & PTE_PFN_MASK) >> PAGE_SHIFT;
} }
#define p4d_leaf p4d_large
static inline int p4d_large(p4d_t p4d) static inline int p4d_large(p4d_t p4d)
{ {
/* No 512 GiB pages yet */ /* No 512 GiB pages yet */
...@@ -247,6 +248,7 @@ static inline int p4d_large(p4d_t p4d) ...@@ -247,6 +248,7 @@ static inline int p4d_large(p4d_t p4d)
#define pte_page(pte) pfn_to_page(pte_pfn(pte)) #define pte_page(pte) pfn_to_page(pte_pfn(pte))
#define pmd_leaf pmd_large
static inline int pmd_large(pmd_t pte) static inline int pmd_large(pmd_t pte)
{ {
return pmd_flags(pte) & _PAGE_PSE; return pmd_flags(pte) & _PAGE_PSE;
...@@ -874,6 +876,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) ...@@ -874,6 +876,7 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address)
return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address); return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address);
} }
#define pud_leaf pud_large
static inline int pud_large(pud_t pud) static inline int pud_large(pud_t pud)
{ {
return (pud_val(pud) & (_PAGE_PSE | _PAGE_PRESENT)) == return (pud_val(pud) & (_PAGE_PSE | _PAGE_PRESENT)) ==
...@@ -885,6 +888,7 @@ static inline int pud_bad(pud_t pud) ...@@ -885,6 +888,7 @@ static inline int pud_bad(pud_t pud)
return (pud_flags(pud) & ~(_KERNPG_TABLE | _PAGE_USER)) != 0; return (pud_flags(pud) & ~(_KERNPG_TABLE | _PAGE_USER)) != 0;
} }
#else #else
#define pud_leaf pud_large
static inline int pud_large(pud_t pud) static inline int pud_large(pud_t pud)
{ {
return 0; return 0;
...@@ -1233,6 +1237,7 @@ static inline bool pgdp_maps_userspace(void *__ptr) ...@@ -1233,6 +1237,7 @@ static inline bool pgdp_maps_userspace(void *__ptr)
return (((ptr & ~PAGE_MASK) / sizeof(pgd_t)) < PGD_KERNEL_START); return (((ptr & ~PAGE_MASK) / sizeof(pgd_t)) < PGD_KERNEL_START);
} }
#define pgd_leaf pgd_large
static inline int pgd_large(pgd_t pgd) { return 0; } static inline int pgd_large(pgd_t pgd) { return 0; }
#ifdef CONFIG_PAGE_TABLE_ISOLATION #ifdef CONFIG_PAGE_TABLE_ISOLATION
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment