1 /* SPDX-License-Identifier: GPL-2.0 */
3 #ifndef __ASM_ARM_KFENCE_H
4 #define __ASM_ARM_KFENCE_H
6 #include <linux/kfence.h>
8 #include <asm/pgalloc.h>
9 #include <asm/set_memory.h>
11 static inline int split_pmd_page(pmd_t
*pmd
, unsigned long addr
)
14 unsigned long pfn
= PFN_DOWN(__pa(addr
));
15 pte_t
*pte
= pte_alloc_one_kernel(&init_mm
);
20 for (i
= 0; i
< PTRS_PER_PTE
; i
++)
21 set_pte_ext(pte
+ i
, pfn_pte(pfn
+ i
, PAGE_KERNEL
), 0);
22 pmd_populate_kernel(&init_mm
, pmd
, pte
);
24 flush_tlb_kernel_range(addr
, addr
+ PMD_SIZE
);
28 static inline bool arch_kfence_init_pool(void)
33 for (addr
= (unsigned long)__kfence_pool
; is_kfence_address((void *)addr
);
35 pmd
= pmd_off_k(addr
);
38 if (split_pmd_page(pmd
, addr
& PMD_MASK
))
46 static inline bool kfence_protect_page(unsigned long addr
, bool protect
)
48 set_memory_valid(addr
, 1, !protect
);
53 #endif /* __ASM_ARM_KFENCE_H */