| From: "Matthew Wilcox (Oracle)" <willy@infradead.org> |
| Subject: x86: remove custom definition of mk_pte() |
| Date: Wed, 2 Apr 2025 19:16:58 +0100 |
| |
| Move the shadow stack check to pfn_pte() which lets us use the common |
| definition of mk_pte(). |
| |
| Link: https://lkml.kernel.org/r/20250402181709.2386022-5-willy@infradead.org |
| Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> |
| Acked-by: Dave Hansen <dave.hansen@linux.intel.com> |
| Cc: Zi Yan <ziy@nvidia.com> |
| Cc: Alexander Gordeev <agordeev@linux.ibm.com> |
| Cc: Andreas Larsson <andreas@gaisler.com> |
| Cc: Anton Ivanov <anton.ivanov@cambridgegreys.com> |
| Cc: David Hildenbrand <david@redhat.com> |
| Cc: "David S. Miller" <davem@davemloft.net> |
| Cc: Geert Uytterhoeven <geert@linux-m68k.org> |
| Cc: Johannes Berg <johannes@sipsolutions.net> |
| Cc: Muchun Song <muchun.song@linux.dev> |
| Cc: Richard Weinberger <richard@nod.at> |
| Cc: <x86@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| arch/x86/include/asm/pgtable.h | 19 +++---------------- |
| 1 file changed, 3 insertions(+), 16 deletions(-) |
| |
| --- a/arch/x86/include/asm/pgtable.h~x86-remove-custom-definition-of-mk_pte |
| +++ a/arch/x86/include/asm/pgtable.h |
| @@ -784,6 +784,9 @@ static inline pgprotval_t check_pgprot(p |
| static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) |
| { |
| phys_addr_t pfn = (phys_addr_t)page_nr << PAGE_SHIFT; |
| + /* This bit combination is used to mark shadow stacks */ |
| + WARN_ON_ONCE((pgprot_val(pgprot) & (_PAGE_DIRTY | _PAGE_RW)) == |
| + _PAGE_DIRTY); |
| pfn ^= protnone_mask(pgprot_val(pgprot)); |
| pfn &= PTE_PFN_MASK; |
| return __pte(pfn | check_pgprot(pgprot)); |
| @@ -1080,22 +1083,6 @@ static inline unsigned long pmd_page_vad |
| */ |
| #define pmd_page(pmd) pfn_to_page(pmd_pfn(pmd)) |
| |
| -/* |
| - * Conversion functions: convert a page and protection to a page entry, |
| - * and a page entry and page directory to the page they refer to. |
| - * |
| - * (Currently stuck as a macro because of indirect forward reference |
| - * to linux/mm.h:page_to_nid()) |
| - */ |
| -#define mk_pte(page, pgprot) \ |
| -({ \ |
| - pgprot_t __pgprot = pgprot; \ |
| - \ |
| - WARN_ON_ONCE((pgprot_val(__pgprot) & (_PAGE_DIRTY | _PAGE_RW)) == \ |
| - _PAGE_DIRTY); \ |
| - pfn_pte(page_to_pfn(page), __pgprot); \ |
| -}) |
| - |
| static inline int pmd_bad(pmd_t pmd) |
| { |
| return (pmd_flags(pmd) & ~(_PAGE_USER | _PAGE_ACCESSED)) != |
| _ |