diff options
Diffstat (limited to 'arch/arm64/mm/fault.c')
| -rw-r--r-- | arch/arm64/mm/fault.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index 53d9159662fe..0f8788374815 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -29,7 +29,9 @@  #include <linux/sched.h>  #include <linux/highmem.h>  #include <linux/perf_event.h> +#include <linux/preempt.h> +#include <asm/bug.h>  #include <asm/cpufeature.h>  #include <asm/exception.h>  #include <asm/debug-monitors.h> @@ -670,9 +672,17 @@ asmlinkage int __exception do_debug_exception(unsigned long addr,  NOKPROBE_SYMBOL(do_debug_exception);  #ifdef CONFIG_ARM64_PAN -void cpu_enable_pan(void *__unused) +int cpu_enable_pan(void *__unused)  { +	/* +	 * We modify PSTATE. This won't work from irq context as the PSTATE +	 * is discarded once we return from the exception. +	 */ +	WARN_ON_ONCE(in_interrupt()); +  	config_sctlr_el1(SCTLR_EL1_SPAN, 0); +	asm(SET_PSTATE_PAN(1)); +	return 0;  }  #endif /* CONFIG_ARM64_PAN */ @@ -683,8 +693,9 @@ void cpu_enable_pan(void *__unused)   * We need to enable the feature at runtime (instead of adding it to   * PSR_MODE_EL1h) as the feature may not be implemented by the cpu.   */ -void cpu_enable_uao(void *__unused) +int cpu_enable_uao(void *__unused)  {  	asm(SET_PSTATE_UAO(1)); +	return 0;  }  #endif /* CONFIG_ARM64_UAO */  | 
