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