]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - arch/riscv/include/asm/kfence.h
1 /* SPDX-License-Identifier: GPL-2.0 */
3 #ifndef _ASM_RISCV_KFENCE_H
4 #define _ASM_RISCV_KFENCE_H
6 #include <linux/kfence.h>
8 #include <asm-generic/pgalloc.h>
9 #include <asm/pgtable.h>
11 static inline int split_pmd_page(unsigned long addr
)
14 unsigned long pfn
= PFN_DOWN(__pa((addr
& PMD_MASK
)));
15 pmd_t
*pmd
= pmd_off_k(addr
);
16 pte_t
*pte
= pte_alloc_one_kernel(&init_mm
);
21 for (i
= 0; i
< PTRS_PER_PTE
; i
++)
22 set_pte(pte
+ i
, pfn_pte(pfn
+ i
, PAGE_KERNEL
));
23 set_pmd(pmd
, pfn_pmd(PFN_DOWN(__pa(pte
)), PAGE_TABLE
));
25 flush_tlb_kernel_range(addr
, addr
+ PMD_SIZE
);
29 static inline bool arch_kfence_init_pool(void)
35 for (addr
= (unsigned long)__kfence_pool
; is_kfence_address((void *)addr
);
37 pmd
= pmd_off_k(addr
);
40 ret
= split_pmd_page(addr
);
49 static inline bool kfence_protect_page(unsigned long addr
, bool protect
)
51 pte_t
*pte
= virt_to_kpte(addr
);
54 set_pte(pte
, __pte(pte_val(*pte
) & ~_PAGE_PRESENT
));
56 set_pte(pte
, __pte(pte_val(*pte
) | _PAGE_PRESENT
));
58 flush_tlb_kernel_range(addr
, addr
+ PAGE_SIZE
);
63 #endif /* _ASM_RISCV_KFENCE_H */