xref: /openbmc/linux/arch/parisc/include/asm/kfence.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1*ec5c1150SHelge Deller /* SPDX-License-Identifier: GPL-2.0 */
2*ec5c1150SHelge Deller /*
3*ec5c1150SHelge Deller  * PA-RISC KFENCE support.
4*ec5c1150SHelge Deller  *
5*ec5c1150SHelge Deller  * Copyright (C) 2021, Helge Deller <deller@gmx.de>
6*ec5c1150SHelge Deller  */
7*ec5c1150SHelge Deller 
8*ec5c1150SHelge Deller #ifndef _ASM_PARISC_KFENCE_H
9*ec5c1150SHelge Deller #define _ASM_PARISC_KFENCE_H
10*ec5c1150SHelge Deller 
11*ec5c1150SHelge Deller #include <linux/kfence.h>
12*ec5c1150SHelge Deller 
13*ec5c1150SHelge Deller #include <asm/pgtable.h>
14*ec5c1150SHelge Deller #include <asm/tlbflush.h>
15*ec5c1150SHelge Deller 
arch_kfence_init_pool(void)16*ec5c1150SHelge Deller static inline bool arch_kfence_init_pool(void)
17*ec5c1150SHelge Deller {
18*ec5c1150SHelge Deller 	return true;
19*ec5c1150SHelge Deller }
20*ec5c1150SHelge Deller 
21*ec5c1150SHelge Deller /* Protect the given page and flush TLB. */
kfence_protect_page(unsigned long addr,bool protect)22*ec5c1150SHelge Deller static inline bool kfence_protect_page(unsigned long addr, bool protect)
23*ec5c1150SHelge Deller {
24*ec5c1150SHelge Deller 	pte_t *pte = virt_to_kpte(addr);
25*ec5c1150SHelge Deller 
26*ec5c1150SHelge Deller 	if (WARN_ON(!pte))
27*ec5c1150SHelge Deller 		return false;
28*ec5c1150SHelge Deller 
29*ec5c1150SHelge Deller 	/*
30*ec5c1150SHelge Deller 	 * We need to avoid IPIs, as we may get KFENCE allocations or faults
31*ec5c1150SHelge Deller 	 * with interrupts disabled.
32*ec5c1150SHelge Deller 	 */
33*ec5c1150SHelge Deller 
34*ec5c1150SHelge Deller 	if (protect)
35*ec5c1150SHelge Deller 		set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT));
36*ec5c1150SHelge Deller 	else
37*ec5c1150SHelge Deller 		set_pte(pte, __pte(pte_val(*pte) | _PAGE_PRESENT));
38*ec5c1150SHelge Deller 
39*ec5c1150SHelge Deller 	flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
40*ec5c1150SHelge Deller 
41*ec5c1150SHelge Deller 	return true;
42*ec5c1150SHelge Deller }
43*ec5c1150SHelge Deller 
44*ec5c1150SHelge Deller #endif /* _ASM_PARISC_KFENCE_H */
45