On Thu, Oct 29, 2020 at 2:17 PM Marco Elver <elver@xxxxxxxxxx> wrote: > Add architecture specific implementation details for KFENCE and enable > KFENCE for the arm64 architecture. In particular, this implements the > required interface in <asm/kfence.h>. > > KFENCE requires that attributes for pages from its memory pool can > individually be set. Therefore, force the entire linear map to be mapped > at page granularity. Doing so may result in extra memory allocated for > page tables in case rodata=full is not set; however, currently > CONFIG_RODATA_FULL_DEFAULT_ENABLED=y is the default, and the common case > is therefore not affected by this change. [...] > diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig [...] > + select HAVE_ARCH_KFENCE if (!ARM64_16K_PAGES && !ARM64_64K_PAGES) "if ARM64_4K_PAGES"? [...] > diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c [...] > @@ -312,6 +313,9 @@ static void __do_kernel_fault(unsigned long addr, unsigned int esr, > "Ignoring spurious kernel translation fault at virtual address %016lx\n", addr)) > return; > > + if (kfence_handle_page_fault(addr)) > + return; As in the X86 case, we may want to ensure that this doesn't run for permission faults, only for non-present pages. Maybe move this down into the third branch of the "if" block below (neither permission fault nor NULL deref)? > + > if (is_el1_permission_fault(addr, esr, regs)) { > if (esr & ESR_ELx_WNR) > msg = "write to read-only memory";