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 Dellerstatic 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 Dellerstatic 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