Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
[firefly-linux-kernel-4.4.55.git] / arch / arm64 / xen / hypercall.S
index 8bbe9401f4f011d3239adcd2d6f5251d5fe37ff0..6d6e4af1a4bfb2e6354a242c0638a813d3f173d0 100644 (file)
@@ -49,6 +49,7 @@
 
 #include <linux/linkage.h>
 #include <asm/assembler.h>
+#include <asm/uaccess.h>
 #include <xen/interface/xen.h>
 
 
@@ -89,6 +90,24 @@ ENTRY(privcmd_call)
        mov x2, x3
        mov x3, x4
        mov x4, x5
+#ifdef CONFIG_ARM64_SW_TTBR0_PAN
+       /*
+        * 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_enable_not_uao x6, x7
+#endif
        hvc XEN_IMM
+
+#ifdef CONFIG_ARM64_SW_TTBR0_PAN
+       /*
+        * Disable userspace access from kernel once the hyp call completed.
+        */
+       uaccess_disable_not_uao x6
+#endif
        ret
 ENDPROC(privcmd_call);