diff options
Diffstat (limited to 'arch/arm64/xen/hypercall.S')
| -rw-r--r-- | arch/arm64/xen/hypercall.S | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S index 329c8027b0a9..947830a459d2 100644 --- a/arch/arm64/xen/hypercall.S +++ b/arch/arm64/xen/hypercall.S @@ -49,6 +49,7 @@  #include <linux/linkage.h>  #include <asm/assembler.h> +#include <asm/asm-uaccess.h>  #include <xen/interface/xen.h> @@ -91,6 +92,20 @@ ENTRY(privcmd_call)  	mov x2, x3  	mov x3, x4  	mov x4, x5 +	/* +	 * Privcmd calls are issued by the userspace. The kernel needs to +	 * enable access to TTBR0_EL1 as the hypervisor would issue stage 1 +	 * translations to user memory via AT instructions. Since AT +	 * instructions are not affected by the PAN bit (ARMv8.1), we only +	 * need the explicit uaccess_enable/disable if the TTBR0 PAN emulation +	 * is enabled (it implies that hardware UAO and PAN disabled). +	 */ +	uaccess_ttbr0_enable x6, x7  	hvc XEN_IMM + +	/* +	 * Disable userspace access from kernel once the hyp call completed. +	 */ +	uaccess_ttbr0_disable x6  	ret  ENDPROC(privcmd_call); |