| .. | .. |
|---|
| 23 | 23 | |
|---|
| 24 | 24 | #ifndef __ASSEMBLY__ |
|---|
| 25 | 25 | #include <asm/x86_init.h> |
|---|
| 26 | +#include <asm/fpu/xstate.h> |
|---|
| 27 | +#include <asm/fpu/api.h> |
|---|
| 28 | +#include <asm-generic/pgtable_uffd.h> |
|---|
| 26 | 29 | |
|---|
| 27 | 30 | extern pgd_t early_top_pgt[PTRS_PER_PGD]; |
|---|
| 28 | | -int __init __early_make_pgtable(unsigned long address, pmdval_t pmd); |
|---|
| 31 | +bool __init __early_make_pgtable(unsigned long address, pmdval_t pmd); |
|---|
| 29 | 32 | |
|---|
| 30 | | -void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd); |
|---|
| 31 | | -void ptdump_walk_pgd_level_debugfs(struct seq_file *m, pgd_t *pgd, bool user); |
|---|
| 33 | +void ptdump_walk_pgd_level(struct seq_file *m, struct mm_struct *mm); |
|---|
| 34 | +void ptdump_walk_pgd_level_debugfs(struct seq_file *m, struct mm_struct *mm, |
|---|
| 35 | + bool user); |
|---|
| 32 | 36 | void ptdump_walk_pgd_level_checkwx(void); |
|---|
| 33 | 37 | void ptdump_walk_user_pgd_level_checkwx(void); |
|---|
| 34 | 38 | |
|---|
| .. | .. |
|---|
| 46 | 50 | */ |
|---|
| 47 | 51 | extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] |
|---|
| 48 | 52 | __visible; |
|---|
| 49 | | -#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) |
|---|
| 53 | +#define ZERO_PAGE(vaddr) ((void)(vaddr),virt_to_page(empty_zero_page)) |
|---|
| 50 | 54 | |
|---|
| 51 | 55 | extern spinlock_t pgd_lock; |
|---|
| 52 | 56 | extern struct list_head pgd_list; |
|---|
| .. | .. |
|---|
| 55 | 59 | |
|---|
| 56 | 60 | extern pmdval_t early_pmd_flags; |
|---|
| 57 | 61 | |
|---|
| 58 | | -#ifdef CONFIG_PARAVIRT |
|---|
| 62 | +#ifdef CONFIG_PARAVIRT_XXL |
|---|
| 59 | 63 | #include <asm/paravirt.h> |
|---|
| 60 | | -#else /* !CONFIG_PARAVIRT */ |
|---|
| 64 | +#else /* !CONFIG_PARAVIRT_XXL */ |
|---|
| 61 | 65 | #define set_pte(ptep, pte) native_set_pte(ptep, pte) |
|---|
| 62 | | -#define set_pte_at(mm, addr, ptep, pte) native_set_pte_at(mm, addr, ptep, pte) |
|---|
| 63 | 66 | |
|---|
| 64 | 67 | #define set_pte_atomic(ptep, pte) \ |
|---|
| 65 | 68 | native_set_pte_atomic(ptep, pte) |
|---|
| .. | .. |
|---|
| 112 | 115 | #define __pte(x) native_make_pte(x) |
|---|
| 113 | 116 | |
|---|
| 114 | 117 | #define arch_end_context_switch(prev) do {} while(0) |
|---|
| 115 | | - |
|---|
| 116 | | -#endif /* CONFIG_PARAVIRT */ |
|---|
| 118 | +#endif /* CONFIG_PARAVIRT_XXL */ |
|---|
| 117 | 119 | |
|---|
| 118 | 120 | /* |
|---|
| 119 | 121 | * The following only work if pte_present() is true. |
|---|
| .. | .. |
|---|
| 128 | 130 | static inline u32 read_pkru(void) |
|---|
| 129 | 131 | { |
|---|
| 130 | 132 | if (boot_cpu_has(X86_FEATURE_OSPKE)) |
|---|
| 131 | | - return __read_pkru(); |
|---|
| 133 | + return rdpkru(); |
|---|
| 132 | 134 | return 0; |
|---|
| 133 | 135 | } |
|---|
| 134 | 136 | |
|---|
| 135 | 137 | static inline void write_pkru(u32 pkru) |
|---|
| 136 | 138 | { |
|---|
| 137 | | - if (boot_cpu_has(X86_FEATURE_OSPKE)) |
|---|
| 138 | | - __write_pkru(pkru); |
|---|
| 139 | + struct pkru_state *pk; |
|---|
| 140 | + |
|---|
| 141 | + if (!boot_cpu_has(X86_FEATURE_OSPKE)) |
|---|
| 142 | + return; |
|---|
| 143 | + |
|---|
| 144 | + pk = get_xsave_addr(¤t->thread.fpu.state.xsave, XFEATURE_PKRU); |
|---|
| 145 | + |
|---|
| 146 | + /* |
|---|
| 147 | + * The PKRU value in xstate needs to be in sync with the value that is |
|---|
| 148 | + * written to the CPU. The FPU restore on return to userland would |
|---|
| 149 | + * otherwise load the previous value again. |
|---|
| 150 | + */ |
|---|
| 151 | + fpregs_lock(); |
|---|
| 152 | + if (pk) |
|---|
| 153 | + pk->pkru = pkru; |
|---|
| 154 | + __write_pkru(pkru); |
|---|
| 155 | + fpregs_unlock(); |
|---|
| 139 | 156 | } |
|---|
| 140 | 157 | |
|---|
| 141 | 158 | static inline int pte_young(pte_t pte) |
|---|
| .. | .. |
|---|
| 223 | 240 | return (pgd_val(pgd) & PTE_PFN_MASK) >> PAGE_SHIFT; |
|---|
| 224 | 241 | } |
|---|
| 225 | 242 | |
|---|
| 243 | +#define p4d_leaf p4d_large |
|---|
| 226 | 244 | static inline int p4d_large(p4d_t p4d) |
|---|
| 227 | 245 | { |
|---|
| 228 | 246 | /* No 512 GiB pages yet */ |
|---|
| .. | .. |
|---|
| 231 | 249 | |
|---|
| 232 | 250 | #define pte_page(pte) pfn_to_page(pte_pfn(pte)) |
|---|
| 233 | 251 | |
|---|
| 252 | +#define pmd_leaf pmd_large |
|---|
| 234 | 253 | static inline int pmd_large(pmd_t pte) |
|---|
| 235 | 254 | { |
|---|
| 236 | 255 | return pmd_flags(pte) & _PAGE_PSE; |
|---|
| .. | .. |
|---|
| 256 | 275 | return boot_cpu_has(X86_FEATURE_PSE); |
|---|
| 257 | 276 | } |
|---|
| 258 | 277 | |
|---|
| 259 | | -#ifdef __HAVE_ARCH_PTE_DEVMAP |
|---|
| 278 | +#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP |
|---|
| 260 | 279 | static inline int pmd_devmap(pmd_t pmd) |
|---|
| 261 | 280 | { |
|---|
| 262 | 281 | return !!(pmd_val(pmd) & _PAGE_DEVMAP); |
|---|
| .. | .. |
|---|
| 294 | 313 | |
|---|
| 295 | 314 | return native_make_pte(v & ~clear); |
|---|
| 296 | 315 | } |
|---|
| 316 | + |
|---|
| 317 | +#ifdef CONFIG_HAVE_ARCH_USERFAULTFD_WP |
|---|
| 318 | +static inline int pte_uffd_wp(pte_t pte) |
|---|
| 319 | +{ |
|---|
| 320 | + return pte_flags(pte) & _PAGE_UFFD_WP; |
|---|
| 321 | +} |
|---|
| 322 | + |
|---|
| 323 | +static inline pte_t pte_mkuffd_wp(pte_t pte) |
|---|
| 324 | +{ |
|---|
| 325 | + return pte_set_flags(pte, _PAGE_UFFD_WP); |
|---|
| 326 | +} |
|---|
| 327 | + |
|---|
| 328 | +static inline pte_t pte_clear_uffd_wp(pte_t pte) |
|---|
| 329 | +{ |
|---|
| 330 | + return pte_clear_flags(pte, _PAGE_UFFD_WP); |
|---|
| 331 | +} |
|---|
| 332 | +#endif /* CONFIG_HAVE_ARCH_USERFAULTFD_WP */ |
|---|
| 297 | 333 | |
|---|
| 298 | 334 | static inline pte_t pte_mkclean(pte_t pte) |
|---|
| 299 | 335 | { |
|---|
| .. | .. |
|---|
| 373 | 409 | |
|---|
| 374 | 410 | return native_make_pmd(v & ~clear); |
|---|
| 375 | 411 | } |
|---|
| 412 | + |
|---|
| 413 | +#ifdef CONFIG_HAVE_ARCH_USERFAULTFD_WP |
|---|
| 414 | +static inline int pmd_uffd_wp(pmd_t pmd) |
|---|
| 415 | +{ |
|---|
| 416 | + return pmd_flags(pmd) & _PAGE_UFFD_WP; |
|---|
| 417 | +} |
|---|
| 418 | + |
|---|
| 419 | +static inline pmd_t pmd_mkuffd_wp(pmd_t pmd) |
|---|
| 420 | +{ |
|---|
| 421 | + return pmd_set_flags(pmd, _PAGE_UFFD_WP); |
|---|
| 422 | +} |
|---|
| 423 | + |
|---|
| 424 | +static inline pmd_t pmd_clear_uffd_wp(pmd_t pmd) |
|---|
| 425 | +{ |
|---|
| 426 | + return pmd_clear_flags(pmd, _PAGE_UFFD_WP); |
|---|
| 427 | +} |
|---|
| 428 | +#endif /* CONFIG_HAVE_ARCH_USERFAULTFD_WP */ |
|---|
| 376 | 429 | |
|---|
| 377 | 430 | static inline pmd_t pmd_mkold(pmd_t pmd) |
|---|
| 378 | 431 | { |
|---|
| .. | .. |
|---|
| 571 | 624 | return __pud(pfn | check_pgprot(pgprot)); |
|---|
| 572 | 625 | } |
|---|
| 573 | 626 | |
|---|
| 574 | | -static inline pmd_t pmd_mknotpresent(pmd_t pmd) |
|---|
| 627 | +static inline pmd_t pmd_mkinvalid(pmd_t pmd) |
|---|
| 575 | 628 | { |
|---|
| 576 | 629 | return pfn_pmd(pmd_pfn(pmd), |
|---|
| 577 | 630 | __pgprot(pmd_flags(pmd) & ~(_PAGE_PRESENT|_PAGE_PROTNONE))); |
|---|
| 578 | | -} |
|---|
| 579 | | - |
|---|
| 580 | | -static inline pud_t pud_mknotpresent(pud_t pud) |
|---|
| 581 | | -{ |
|---|
| 582 | | - return pfn_pud(pud_pfn(pud), |
|---|
| 583 | | - __pgprot(pud_flags(pud) & ~(_PAGE_PRESENT|_PAGE_PROTNONE))); |
|---|
| 584 | 631 | } |
|---|
| 585 | 632 | |
|---|
| 586 | 633 | static inline u64 flip_protnone_guard(u64 oldval, u64 val, u64 mask); |
|---|
| .. | .. |
|---|
| 720 | 767 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); |
|---|
| 721 | 768 | } |
|---|
| 722 | 769 | |
|---|
| 723 | | -#ifdef __HAVE_ARCH_PTE_DEVMAP |
|---|
| 770 | +#ifdef CONFIG_ARCH_HAS_PTE_DEVMAP |
|---|
| 724 | 771 | static inline int pte_devmap(pte_t a) |
|---|
| 725 | 772 | { |
|---|
| 726 | 773 | return (pte_flags(a) & _PAGE_DEVMAP) == _PAGE_DEVMAP; |
|---|
| .. | .. |
|---|
| 754 | 801 | #ifdef CONFIG_NUMA_BALANCING |
|---|
| 755 | 802 | /* |
|---|
| 756 | 803 | * These work without NUMA balancing but the kernel does not care. See the |
|---|
| 757 | | - * comment in include/asm-generic/pgtable.h |
|---|
| 804 | + * comment in include/linux/pgtable.h |
|---|
| 758 | 805 | */ |
|---|
| 759 | 806 | static inline int pte_protnone(pte_t pte) |
|---|
| 760 | 807 | { |
|---|
| .. | .. |
|---|
| 789 | 836 | #define pmd_page(pmd) pfn_to_page(pmd_pfn(pmd)) |
|---|
| 790 | 837 | |
|---|
| 791 | 838 | /* |
|---|
| 792 | | - * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD] |
|---|
| 793 | | - * |
|---|
| 794 | | - * this macro returns the index of the entry in the pmd page which would |
|---|
| 795 | | - * control the given virtual address |
|---|
| 796 | | - */ |
|---|
| 797 | | -static inline unsigned long pmd_index(unsigned long address) |
|---|
| 798 | | -{ |
|---|
| 799 | | - return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1); |
|---|
| 800 | | -} |
|---|
| 801 | | - |
|---|
| 802 | | -/* |
|---|
| 803 | 839 | * Conversion functions: convert a page and protection to a page entry, |
|---|
| 804 | 840 | * and a page entry and page directory to the page they refer to. |
|---|
| 805 | 841 | * |
|---|
| .. | .. |
|---|
| 807 | 843 | * to linux/mm.h:page_to_nid()) |
|---|
| 808 | 844 | */ |
|---|
| 809 | 845 | #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot)) |
|---|
| 810 | | - |
|---|
| 811 | | -/* |
|---|
| 812 | | - * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] |
|---|
| 813 | | - * |
|---|
| 814 | | - * this function returns the index of the entry in the pte page which would |
|---|
| 815 | | - * control the given virtual address |
|---|
| 816 | | - */ |
|---|
| 817 | | -static inline unsigned long pte_index(unsigned long address) |
|---|
| 818 | | -{ |
|---|
| 819 | | - return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1); |
|---|
| 820 | | -} |
|---|
| 821 | | - |
|---|
| 822 | | -static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long address) |
|---|
| 823 | | -{ |
|---|
| 824 | | - return (pte_t *)pmd_page_vaddr(*pmd) + pte_index(address); |
|---|
| 825 | | -} |
|---|
| 826 | 846 | |
|---|
| 827 | 847 | static inline int pmd_bad(pmd_t pmd) |
|---|
| 828 | 848 | { |
|---|
| .. | .. |
|---|
| 845 | 865 | return pud_flags(pud) & _PAGE_PRESENT; |
|---|
| 846 | 866 | } |
|---|
| 847 | 867 | |
|---|
| 848 | | -static inline unsigned long pud_page_vaddr(pud_t pud) |
|---|
| 868 | +static inline pmd_t *pud_pgtable(pud_t pud) |
|---|
| 849 | 869 | { |
|---|
| 850 | | - return (unsigned long)__va(pud_val(pud) & pud_pfn_mask(pud)); |
|---|
| 870 | + return (pmd_t *)__va(pud_val(pud) & pud_pfn_mask(pud)); |
|---|
| 851 | 871 | } |
|---|
| 852 | 872 | |
|---|
| 853 | 873 | /* |
|---|
| .. | .. |
|---|
| 856 | 876 | */ |
|---|
| 857 | 877 | #define pud_page(pud) pfn_to_page(pud_pfn(pud)) |
|---|
| 858 | 878 | |
|---|
| 859 | | -/* Find an entry in the second-level page table.. */ |
|---|
| 860 | | -static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) |
|---|
| 861 | | -{ |
|---|
| 862 | | - return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address); |
|---|
| 863 | | -} |
|---|
| 864 | | - |
|---|
| 879 | +#define pud_leaf pud_large |
|---|
| 865 | 880 | static inline int pud_large(pud_t pud) |
|---|
| 866 | 881 | { |
|---|
| 867 | 882 | return (pud_val(pud) & (_PAGE_PSE | _PAGE_PRESENT)) == |
|---|
| .. | .. |
|---|
| 873 | 888 | return (pud_flags(pud) & ~(_KERNPG_TABLE | _PAGE_USER)) != 0; |
|---|
| 874 | 889 | } |
|---|
| 875 | 890 | #else |
|---|
| 891 | +#define pud_leaf pud_large |
|---|
| 876 | 892 | static inline int pud_large(pud_t pud) |
|---|
| 877 | 893 | { |
|---|
| 878 | 894 | return 0; |
|---|
| 879 | 895 | } |
|---|
| 880 | 896 | #endif /* CONFIG_PGTABLE_LEVELS > 2 */ |
|---|
| 881 | | - |
|---|
| 882 | | -static inline unsigned long pud_index(unsigned long address) |
|---|
| 883 | | -{ |
|---|
| 884 | | - return (address >> PUD_SHIFT) & (PTRS_PER_PUD - 1); |
|---|
| 885 | | -} |
|---|
| 886 | 897 | |
|---|
| 887 | 898 | #if CONFIG_PGTABLE_LEVELS > 3 |
|---|
| 888 | 899 | static inline int p4d_none(p4d_t p4d) |
|---|
| .. | .. |
|---|
| 895 | 906 | return p4d_flags(p4d) & _PAGE_PRESENT; |
|---|
| 896 | 907 | } |
|---|
| 897 | 908 | |
|---|
| 898 | | -static inline unsigned long p4d_page_vaddr(p4d_t p4d) |
|---|
| 909 | +static inline pud_t *p4d_pgtable(p4d_t p4d) |
|---|
| 899 | 910 | { |
|---|
| 900 | | - return (unsigned long)__va(p4d_val(p4d) & p4d_pfn_mask(p4d)); |
|---|
| 911 | + return (pud_t *)__va(p4d_val(p4d) & p4d_pfn_mask(p4d)); |
|---|
| 901 | 912 | } |
|---|
| 902 | 913 | |
|---|
| 903 | 914 | /* |
|---|
| .. | .. |
|---|
| 905 | 916 | * linux/mmzone.h's __section_mem_map_addr() definition: |
|---|
| 906 | 917 | */ |
|---|
| 907 | 918 | #define p4d_page(p4d) pfn_to_page(p4d_pfn(p4d)) |
|---|
| 908 | | - |
|---|
| 909 | | -/* Find an entry in the third-level page table.. */ |
|---|
| 910 | | -static inline pud_t *pud_offset(p4d_t *p4d, unsigned long address) |
|---|
| 911 | | -{ |
|---|
| 912 | | - return (pud_t *)p4d_page_vaddr(*p4d) + pud_index(address); |
|---|
| 913 | | -} |
|---|
| 914 | 919 | |
|---|
| 915 | 920 | static inline int p4d_bad(p4d_t p4d) |
|---|
| 916 | 921 | { |
|---|
| .. | .. |
|---|
| 984 | 989 | |
|---|
| 985 | 990 | #endif /* __ASSEMBLY__ */ |
|---|
| 986 | 991 | |
|---|
| 987 | | -/* |
|---|
| 988 | | - * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] |
|---|
| 989 | | - * |
|---|
| 990 | | - * this macro returns the index of the entry in the pgd page which would |
|---|
| 991 | | - * control the given virtual address |
|---|
| 992 | | - */ |
|---|
| 993 | | -#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1)) |
|---|
| 994 | | - |
|---|
| 995 | | -/* |
|---|
| 996 | | - * pgd_offset() returns a (pgd_t *) |
|---|
| 997 | | - * pgd_index() is used get the offset into the pgd page's array of pgd_t's; |
|---|
| 998 | | - */ |
|---|
| 999 | | -#define pgd_offset_pgd(pgd, address) (pgd + pgd_index((address))) |
|---|
| 1000 | | -/* |
|---|
| 1001 | | - * a shortcut to get a pgd_t in a given mm |
|---|
| 1002 | | - */ |
|---|
| 1003 | | -#define pgd_offset(mm, address) pgd_offset_pgd((mm)->pgd, (address)) |
|---|
| 1004 | | -/* |
|---|
| 1005 | | - * a shortcut which implies the use of the kernel's pgd, instead |
|---|
| 1006 | | - * of a process's |
|---|
| 1007 | | - */ |
|---|
| 1008 | | -#define pgd_offset_k(address) pgd_offset(&init_mm, (address)) |
|---|
| 1009 | | - |
|---|
| 1010 | | - |
|---|
| 1011 | 992 | #define KERNEL_PGD_BOUNDARY pgd_index(PAGE_OFFSET) |
|---|
| 1012 | 993 | #define KERNEL_PGD_PTRS (PTRS_PER_PGD - KERNEL_PGD_BOUNDARY) |
|---|
| 1013 | 994 | |
|---|
| .. | .. |
|---|
| 1017 | 998 | void init_mem_mapping(void); |
|---|
| 1018 | 999 | void early_alloc_pgt_buf(void); |
|---|
| 1019 | 1000 | extern void memblock_find_dma_reserve(void); |
|---|
| 1001 | +void __init poking_init(void); |
|---|
| 1002 | +unsigned long init_memory_mapping(unsigned long start, |
|---|
| 1003 | + unsigned long end, pgprot_t prot); |
|---|
| 1020 | 1004 | |
|---|
| 1021 | 1005 | #ifdef CONFIG_X86_64 |
|---|
| 1022 | | -/* Realmode trampoline initialization. */ |
|---|
| 1023 | 1006 | extern pgd_t trampoline_pgd_entry; |
|---|
| 1024 | | -static inline void __meminit init_trampoline_default(void) |
|---|
| 1025 | | -{ |
|---|
| 1026 | | - /* Default trampoline pgd value */ |
|---|
| 1027 | | - trampoline_pgd_entry = init_top_pgt[pgd_index(__PAGE_OFFSET)]; |
|---|
| 1028 | | -} |
|---|
| 1029 | | -# ifdef CONFIG_RANDOMIZE_MEMORY |
|---|
| 1030 | | -void __meminit init_trampoline(void); |
|---|
| 1031 | | -# else |
|---|
| 1032 | | -# define init_trampoline init_trampoline_default |
|---|
| 1033 | | -# endif |
|---|
| 1034 | | -#else |
|---|
| 1035 | | -static inline void init_trampoline(void) { } |
|---|
| 1036 | 1007 | #endif |
|---|
| 1037 | 1008 | |
|---|
| 1038 | 1009 | /* local pte updates need not use xchg for locking */ |
|---|
| .. | .. |
|---|
| 1061 | 1032 | return res; |
|---|
| 1062 | 1033 | } |
|---|
| 1063 | 1034 | |
|---|
| 1064 | | -static inline void native_set_pte_at(struct mm_struct *mm, unsigned long addr, |
|---|
| 1065 | | - pte_t *ptep , pte_t pte) |
|---|
| 1035 | +static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, |
|---|
| 1036 | + pte_t *ptep, pte_t pte) |
|---|
| 1066 | 1037 | { |
|---|
| 1067 | | - native_set_pte(ptep, pte); |
|---|
| 1038 | + set_pte(ptep, pte); |
|---|
| 1068 | 1039 | } |
|---|
| 1069 | 1040 | |
|---|
| 1070 | 1041 | static inline void set_pmd_at(struct mm_struct *mm, unsigned long addr, |
|---|
| 1071 | 1042 | pmd_t *pmdp, pmd_t pmd) |
|---|
| 1072 | 1043 | { |
|---|
| 1073 | | - native_set_pmd(pmdp, pmd); |
|---|
| 1044 | + set_pmd(pmdp, pmd); |
|---|
| 1074 | 1045 | } |
|---|
| 1075 | 1046 | |
|---|
| 1076 | 1047 | static inline void set_pud_at(struct mm_struct *mm, unsigned long addr, |
|---|
| .. | .. |
|---|
| 1218 | 1189 | return (((ptr & ~PAGE_MASK) / sizeof(pgd_t)) < PGD_KERNEL_START); |
|---|
| 1219 | 1190 | } |
|---|
| 1220 | 1191 | |
|---|
| 1192 | +#define pgd_leaf pgd_large |
|---|
| 1221 | 1193 | static inline int pgd_large(pgd_t pgd) { return 0; } |
|---|
| 1222 | 1194 | |
|---|
| 1223 | 1195 | #ifdef CONFIG_PAGE_TABLE_ISOLATION |
|---|
| .. | .. |
|---|
| 1356 | 1328 | #endif |
|---|
| 1357 | 1329 | #endif |
|---|
| 1358 | 1330 | |
|---|
| 1331 | +#ifdef CONFIG_HAVE_ARCH_USERFAULTFD_WP |
|---|
| 1332 | +static inline pte_t pte_swp_mkuffd_wp(pte_t pte) |
|---|
| 1333 | +{ |
|---|
| 1334 | + return pte_set_flags(pte, _PAGE_SWP_UFFD_WP); |
|---|
| 1335 | +} |
|---|
| 1336 | + |
|---|
| 1337 | +static inline int pte_swp_uffd_wp(pte_t pte) |
|---|
| 1338 | +{ |
|---|
| 1339 | + return pte_flags(pte) & _PAGE_SWP_UFFD_WP; |
|---|
| 1340 | +} |
|---|
| 1341 | + |
|---|
| 1342 | +static inline pte_t pte_swp_clear_uffd_wp(pte_t pte) |
|---|
| 1343 | +{ |
|---|
| 1344 | + return pte_clear_flags(pte, _PAGE_SWP_UFFD_WP); |
|---|
| 1345 | +} |
|---|
| 1346 | + |
|---|
| 1347 | +static inline pmd_t pmd_swp_mkuffd_wp(pmd_t pmd) |
|---|
| 1348 | +{ |
|---|
| 1349 | + return pmd_set_flags(pmd, _PAGE_SWP_UFFD_WP); |
|---|
| 1350 | +} |
|---|
| 1351 | + |
|---|
| 1352 | +static inline int pmd_swp_uffd_wp(pmd_t pmd) |
|---|
| 1353 | +{ |
|---|
| 1354 | + return pmd_flags(pmd) & _PAGE_SWP_UFFD_WP; |
|---|
| 1355 | +} |
|---|
| 1356 | + |
|---|
| 1357 | +static inline pmd_t pmd_swp_clear_uffd_wp(pmd_t pmd) |
|---|
| 1358 | +{ |
|---|
| 1359 | + return pmd_clear_flags(pmd, _PAGE_SWP_UFFD_WP); |
|---|
| 1360 | +} |
|---|
| 1361 | +#endif /* CONFIG_HAVE_ARCH_USERFAULTFD_WP */ |
|---|
| 1362 | + |
|---|
| 1359 | 1363 | #define PKRU_AD_BIT 0x1u |
|---|
| 1360 | 1364 | #define PKRU_WD_BIT 0x2u |
|---|
| 1361 | 1365 | #define PKRU_BITS_PER_PKEY 2 |
|---|
| 1366 | + |
|---|
| 1367 | +#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS |
|---|
| 1368 | +extern u32 init_pkru_value; |
|---|
| 1369 | +#else |
|---|
| 1370 | +#define init_pkru_value 0 |
|---|
| 1371 | +#endif |
|---|
| 1362 | 1372 | |
|---|
| 1363 | 1373 | static inline bool __pkru_allows_read(u32 pkru, u16 pkey) |
|---|
| 1364 | 1374 | { |
|---|
| .. | .. |
|---|
| 1442 | 1452 | return boot_cpu_has_bug(X86_BUG_L1TF); |
|---|
| 1443 | 1453 | } |
|---|
| 1444 | 1454 | |
|---|
| 1445 | | -#include <asm-generic/pgtable.h> |
|---|
| 1455 | +#define arch_faults_on_old_pte arch_faults_on_old_pte |
|---|
| 1456 | +static inline bool arch_faults_on_old_pte(void) |
|---|
| 1457 | +{ |
|---|
| 1458 | + return false; |
|---|
| 1459 | +} |
|---|
| 1460 | + |
|---|
| 1446 | 1461 | #endif /* __ASSEMBLY__ */ |
|---|
| 1447 | 1462 | |
|---|
| 1448 | 1463 | #endif /* _ASM_X86_PGTABLE_H */ |
|---|