* [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
2019-12-16 20:36 ` Julien Grall
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call Pavel Tatashin
` (4 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
The arm and arm64 versions of hypercall.h are missing the include
guards. This is needed because C inlines for privcmd_call are going to
be added to the files.
Also fix a comment.
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
---
arch/arm/include/asm/assembler.h | 2 +-
arch/arm/include/asm/xen/hypercall.h | 4 ++++
arch/arm64/include/asm/xen/hypercall.h | 4 ++++
include/xen/arm/hypercall.h | 6 +++---
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
index 99929122dad7..8e9262a0f016 100644
--- a/arch/arm/include/asm/assembler.h
+++ b/arch/arm/include/asm/assembler.h
@@ -480,7 +480,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
.macro uaccess_disable, tmp, isb=1
#ifdef CONFIG_CPU_SW_DOMAIN_PAN
/*
- * Whenever we re-enter userspace, the domains should always be
+ * Whenever we re-enter kernel, the domains should always be
* set appropriately.
*/
mov \tmp, #DACR_UACCESS_DISABLE
diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h
index 3522cbaed316..c6882bba5284 100644
--- a/arch/arm/include/asm/xen/hypercall.h
+++ b/arch/arm/include/asm/xen/hypercall.h
@@ -1 +1,5 @@
+#ifndef _ASM_ARM_XEN_HYPERCALL_H
+#define _ASM_ARM_XEN_HYPERCALL_H
#include <xen/arm/hypercall.h>
+
+#endif /* _ASM_ARM_XEN_HYPERCALL_H */
diff --git a/arch/arm64/include/asm/xen/hypercall.h b/arch/arm64/include/asm/xen/hypercall.h
index 3522cbaed316..c3198f9ccd2e 100644
--- a/arch/arm64/include/asm/xen/hypercall.h
+++ b/arch/arm64/include/asm/xen/hypercall.h
@@ -1 +1,5 @@
+#ifndef _ASM_ARM64_XEN_HYPERCALL_H
+#define _ASM_ARM64_XEN_HYPERCALL_H
#include <xen/arm/hypercall.h>
+
+#endif /* _ASM_ARM64_XEN_HYPERCALL_H */
diff --git a/include/xen/arm/hypercall.h b/include/xen/arm/hypercall.h
index b40485e54d80..babcc08af965 100644
--- a/include/xen/arm/hypercall.h
+++ b/include/xen/arm/hypercall.h
@@ -30,8 +30,8 @@
* IN THE SOFTWARE.
*/
-#ifndef _ASM_ARM_XEN_HYPERCALL_H
-#define _ASM_ARM_XEN_HYPERCALL_H
+#ifndef _ARM_XEN_HYPERCALL_H
+#define _ARM_XEN_HYPERCALL_H
#include <linux/bug.h>
@@ -88,4 +88,4 @@ MULTI_mmu_update(struct multicall_entry *mcl, struct mmu_update *req,
BUG();
}
-#endif /* _ASM_ARM_XEN_HYPERCALL_H */
+#endif /* _ARM_XEN_HYPERCALL_H */
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards Pavel Tatashin
@ 2019-12-16 20:36 ` Julien Grall
2019-12-18 21:11 ` Pavel Tatashin
0 siblings, 1 reply; 12+ messages in thread
From: Julien Grall @ 2019-12-16 20:36 UTC (permalink / raw)
To: Pavel Tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3
Hi,
On 04/12/2019 23:20, Pavel Tatashin wrote:
> The arm and arm64 versions of hypercall.h are missing the include
> guards. This is needed because C inlines for privcmd_call are going to
> be added to the files.
>
> Also fix a comment.
>
> Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
> ---
> arch/arm/include/asm/assembler.h | 2 +-
> arch/arm/include/asm/xen/hypercall.h | 4 ++++
> arch/arm64/include/asm/xen/hypercall.h | 4 ++++
> include/xen/arm/hypercall.h | 6 +++---
> 4 files changed, 12 insertions(+), 4 deletions(-)
>
> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
> index 99929122dad7..8e9262a0f016 100644
> --- a/arch/arm/include/asm/assembler.h
> +++ b/arch/arm/include/asm/assembler.h
> @@ -480,7 +480,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
> .macro uaccess_disable, tmp, isb=1
> #ifdef CONFIG_CPU_SW_DOMAIN_PAN
> /*
> - * Whenever we re-enter userspace, the domains should always be
> + * Whenever we re-enter kernel, the domains should always be
This feels unrelated from the rest of the patch and probably want an
explanation. So I think this want to be in a separate patch.
The rest of the patch looks good to me.
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards
2019-12-16 20:36 ` Julien Grall
@ 2019-12-18 21:11 ` Pavel Tatashin
0 siblings, 0 replies; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-18 21:11 UTC (permalink / raw)
To: Julien Grall
Cc: Mark Rutland, Catalin Marinas, Stefan Agner,
Russell King - ARM Linux admin, Masahiro Yamada, Will Deacon,
boris.ostrovsky, Sasha Levin, Stefano Stabellini, Marc Zyngier,
James Morris, Linux ARM, xen-devel, Vladimir Murzin,
alexios.zavras, Thomas Gleixner, allison, jgross, steve.capper,
Greg Kroah-Hartman, LKML, James Morse, Andrew Cooper, info
> > /*
> > - * Whenever we re-enter userspace, the domains should always be
> > + * Whenever we re-enter kernel, the domains should always be
>
> This feels unrelated from the rest of the patch and probably want an
> explanation. So I think this want to be in a separate patch.
I will simply remove this comment fix, since I do not change anything
else in this file anymore.
> The rest of the patch looks good to me.
Thank you Julien.
>
> Cheers,
>
> --
> Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
2019-12-16 20:41 ` Julien Grall
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 3/6] arm64: remove uaccess_ttbr0 asm macros from cache functions Pavel Tatashin
` (3 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
privcmd_call requires to enable access to userspace for the
duration of the hypercall.
Currently, this is done via assembly macros. Change it to C
inlines instead.
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
Acked-by: Stefano Stabellini <sstabellini@kernel.org>
---
arch/arm/include/asm/xen/hypercall.h | 6 ++++++
arch/arm/xen/enlighten.c | 2 +-
arch/arm/xen/hypercall.S | 4 ++--
arch/arm64/include/asm/xen/hypercall.h | 24 ++++++++++++++++++++++++
arch/arm64/xen/hypercall.S | 19 ++-----------------
include/xen/arm/hypercall.h | 6 +++---
6 files changed, 38 insertions(+), 23 deletions(-)
diff --git a/arch/arm/include/asm/xen/hypercall.h b/arch/arm/include/asm/xen/hypercall.h
index c6882bba5284..cac5bd9ef519 100644
--- a/arch/arm/include/asm/xen/hypercall.h
+++ b/arch/arm/include/asm/xen/hypercall.h
@@ -2,4 +2,10 @@
#define _ASM_ARM_XEN_HYPERCALL_H
#include <xen/arm/hypercall.h>
+static inline long privcmd_call(unsigned int call, unsigned long a1,
+ unsigned long a2, unsigned long a3,
+ unsigned long a4, unsigned long a5)
+{
+ return arch_privcmd_call(call, a1, a2, a3, a4, a5);
+}
#endif /* _ASM_ARM_XEN_HYPERCALL_H */
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
index dd6804a64f1a..e87280c6d25d 100644
--- a/arch/arm/xen/enlighten.c
+++ b/arch/arm/xen/enlighten.c
@@ -440,4 +440,4 @@ EXPORT_SYMBOL_GPL(HYPERVISOR_platform_op_raw);
EXPORT_SYMBOL_GPL(HYPERVISOR_multicall);
EXPORT_SYMBOL_GPL(HYPERVISOR_vm_assist);
EXPORT_SYMBOL_GPL(HYPERVISOR_dm_op);
-EXPORT_SYMBOL_GPL(privcmd_call);
+EXPORT_SYMBOL_GPL(arch_privcmd_call);
diff --git a/arch/arm/xen/hypercall.S b/arch/arm/xen/hypercall.S
index b11bba542fac..277078c7da49 100644
--- a/arch/arm/xen/hypercall.S
+++ b/arch/arm/xen/hypercall.S
@@ -94,7 +94,7 @@ HYPERCALL2(multicall);
HYPERCALL2(vm_assist);
HYPERCALL3(dm_op);
-ENTRY(privcmd_call)
+ENTRY(arch_privcmd_call)
stmdb sp!, {r4}
mov r12, r0
mov r0, r1
@@ -119,4 +119,4 @@ ENTRY(privcmd_call)
ldm sp!, {r4}
ret lr
-ENDPROC(privcmd_call);
+ENDPROC(arch_privcmd_call);
diff --git a/arch/arm64/include/asm/xen/hypercall.h b/arch/arm64/include/asm/xen/hypercall.h
index c3198f9ccd2e..1a74fb28607f 100644
--- a/arch/arm64/include/asm/xen/hypercall.h
+++ b/arch/arm64/include/asm/xen/hypercall.h
@@ -1,5 +1,29 @@
#ifndef _ASM_ARM64_XEN_HYPERCALL_H
#define _ASM_ARM64_XEN_HYPERCALL_H
#include <xen/arm/hypercall.h>
+#include <linux/uaccess.h>
+static inline long privcmd_call(unsigned int call, unsigned long a1,
+ unsigned long a2, unsigned long a3,
+ unsigned long a4, unsigned long a5)
+{
+ long rv;
+
+ /*
+ * 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();
+ rv = arch_privcmd_call(call, a1, a2, a3, a4, a5);
+ /*
+ * Disable userspace access from kernel once the hyp call completed.
+ */
+ uaccess_ttbr0_disable();
+
+ return rv;
+}
#endif /* _ASM_ARM64_XEN_HYPERCALL_H */
diff --git a/arch/arm64/xen/hypercall.S b/arch/arm64/xen/hypercall.S
index c5f05c4a4d00..921611778d2a 100644
--- a/arch/arm64/xen/hypercall.S
+++ b/arch/arm64/xen/hypercall.S
@@ -49,7 +49,6 @@
#include <linux/linkage.h>
#include <asm/assembler.h>
-#include <asm/asm-uaccess.h>
#include <xen/interface/xen.h>
@@ -86,27 +85,13 @@ HYPERCALL2(multicall);
HYPERCALL2(vm_assist);
HYPERCALL3(dm_op);
-ENTRY(privcmd_call)
+ENTRY(arch_privcmd_call)
mov x16, x0
mov x0, x1
mov x1, x2
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, x8
hvc XEN_IMM
-
- /*
- * Disable userspace access from kernel once the hyp call completed.
- */
- uaccess_ttbr0_disable x6, x7
ret
-ENDPROC(privcmd_call);
+ENDPROC(arch_privcmd_call);
diff --git a/include/xen/arm/hypercall.h b/include/xen/arm/hypercall.h
index babcc08af965..624c8ad7e42a 100644
--- a/include/xen/arm/hypercall.h
+++ b/include/xen/arm/hypercall.h
@@ -41,9 +41,9 @@
struct xen_dm_op_buf;
-long privcmd_call(unsigned call, unsigned long a1,
- unsigned long a2, unsigned long a3,
- unsigned long a4, unsigned long a5);
+long arch_privcmd_call(unsigned int call, unsigned long a1,
+ unsigned long a2, unsigned long a3,
+ unsigned long a4, unsigned long a5);
int HYPERVISOR_xen_version(int cmd, void *arg);
int HYPERVISOR_console_io(int cmd, int count, char *str);
int HYPERVISOR_grant_table_op(unsigned int cmd, void *uop, unsigned int count);
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call Pavel Tatashin
@ 2019-12-16 20:41 ` Julien Grall
2019-12-18 21:11 ` Pavel Tatashin
0 siblings, 1 reply; 12+ messages in thread
From: Julien Grall @ 2019-12-16 20:41 UTC (permalink / raw)
To: Pavel Tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3
Hello,
On 04/12/2019 23:20, Pavel Tatashin wrote:
> privcmd_call requires to enable access to userspace for the
> duration of the hypercall.
>
> Currently, this is done via assembly macros. Change it to C
> inlines instead.
>
> Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
> Acked-by: Stefano Stabellini <sstabellini@kernel.org>
Reviewed-by: Julien Grall <julien@xen.org>
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call
2019-12-16 20:41 ` Julien Grall
@ 2019-12-18 21:11 ` Pavel Tatashin
0 siblings, 0 replies; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-18 21:11 UTC (permalink / raw)
To: Julien Grall
Cc: Mark Rutland, Catalin Marinas, Stefan Agner,
Russell King - ARM Linux admin, Masahiro Yamada, Will Deacon,
boris.ostrovsky, Sasha Levin, Stefano Stabellini, Marc Zyngier,
James Morris, Linux ARM, xen-devel, Vladimir Murzin,
alexios.zavras, Thomas Gleixner, allison, jgross, steve.capper,
Greg Kroah-Hartman, LKML, James Morse, Andrew Cooper, info
On Mon, Dec 16, 2019 at 3:41 PM Julien Grall <julien@xen.org> wrote:
>
> Hello,
>
> On 04/12/2019 23:20, Pavel Tatashin wrote:
> > privcmd_call requires to enable access to userspace for the
> > duration of the hypercall.
> >
> > Currently, this is done via assembly macros. Change it to C
> > inlines instead.
> >
> > Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
> > Acked-by: Stefano Stabellini <sstabellini@kernel.org>
>
> Reviewed-by: Julien Grall <julien@xen.org>
Great, thank you!
Pasha
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Xen-devel] [PATCH v4 3/6] arm64: remove uaccess_ttbr0 asm macros from cache functions
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 1/6] arm/arm64/xen: hypercall.h add includes guards Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 2/6] arm/arm64/xen: use C inlines for privcmd_call Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
2019-12-07 20:33 ` kbuild test robot
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 4/6] arm64: remove __asm_flush_icache_range Pavel Tatashin
` (2 subsequent siblings)
5 siblings, 1 reply; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
We currently duplicate the logic to enable/disable uaccess via TTBR0,
with C functions and assembly macros. This is a maintenenace burden
and is liable to lead to subtle bugs, so let's get rid of the assembly
macros, and always use the C functions. This requires refactoring
some assembly functions to have a C wrapper.
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
---
arch/arm64/include/asm/asm-uaccess.h | 22 -----------------
arch/arm64/include/asm/cacheflush.h | 35 ++++++++++++++++++++++++---
arch/arm64/mm/cache.S | 36 ++++++++++------------------
arch/arm64/mm/flush.c | 2 +-
4 files changed, 46 insertions(+), 49 deletions(-)
diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h
index f68a0e64482a..fba2a69f7fef 100644
--- a/arch/arm64/include/asm/asm-uaccess.h
+++ b/arch/arm64/include/asm/asm-uaccess.h
@@ -34,28 +34,6 @@
msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
isb
.endm
-
- .macro uaccess_ttbr0_disable, tmp1, tmp2
-alternative_if_not ARM64_HAS_PAN
- save_and_disable_irq \tmp2 // avoid preemption
- __uaccess_ttbr0_disable \tmp1
- restore_irq \tmp2
-alternative_else_nop_endif
- .endm
-
- .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
-alternative_if_not ARM64_HAS_PAN
- save_and_disable_irq \tmp3 // avoid preemption
- __uaccess_ttbr0_enable \tmp1, \tmp2
- restore_irq \tmp3
-alternative_else_nop_endif
- .endm
-#else
- .macro uaccess_ttbr0_disable, tmp1, tmp2
- .endm
-
- .macro uaccess_ttbr0_enable, tmp1, tmp2, tmp3
- .endm
#endif
#endif
diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
index 665c78e0665a..431f8da2dd02 100644
--- a/arch/arm64/include/asm/cacheflush.h
+++ b/arch/arm64/include/asm/cacheflush.h
@@ -61,16 +61,45 @@
* - kaddr - page address
* - size - region size
*/
-extern void __flush_icache_range(unsigned long start, unsigned long end);
-extern int invalidate_icache_range(unsigned long start, unsigned long end);
+extern void __asm_flush_icache_range(unsigned long start, unsigned long end);
+extern long __asm_flush_cache_user_range(unsigned long start,
+ unsigned long end);
+extern int __asm_invalidate_icache_range(unsigned long start,
+ unsigned long end);
extern void __flush_dcache_area(void *addr, size_t len);
extern void __inval_dcache_area(void *addr, size_t len);
extern void __clean_dcache_area_poc(void *addr, size_t len);
extern void __clean_dcache_area_pop(void *addr, size_t len);
extern void __clean_dcache_area_pou(void *addr, size_t len);
-extern long __flush_cache_user_range(unsigned long start, unsigned long end);
extern void sync_icache_aliases(void *kaddr, unsigned long len);
+static inline void __flush_cache_user_range(unsigned long start,
+ unsigned long end)
+{
+ uaccess_ttbr0_enable();
+ __asm_flush_cache_user_range(start, end);
+ uaccess_ttbr0_disable();
+}
+
+static inline void __flush_icache_range(unsigned long start, unsigned long end)
+{
+ uaccess_ttbr0_enable();
+ __asm_flush_icache_range(start, end);
+ uaccess_ttbr0_disable();
+}
+
+static inline int invalidate_icache_range(unsigned long start,
+ unsigned long end)
+{
+ int ret;
+
+ uaccess_ttbr0_enable();
+ ret = __asm_invalidate_icache_range(start, end);
+ uaccess_ttbr0_disable();
+
+ return ret;
+}
+
static inline void flush_icache_range(unsigned long start, unsigned long end)
{
__flush_icache_range(start, end);
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index db767b072601..602b9aa8603a 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -15,7 +15,7 @@
#include <asm/asm-uaccess.h>
/*
- * flush_icache_range(start,end)
+ * __asm_flush_icache_range(start,end)
*
* Ensure that the I and D caches are coherent within specified region.
* This is typically used when code has been written to a memory region,
@@ -24,11 +24,11 @@
* - start - virtual start address of region
* - end - virtual end address of region
*/
-ENTRY(__flush_icache_range)
+ENTRY(__asm_flush_icache_range)
/* FALLTHROUGH */
/*
- * __flush_cache_user_range(start,end)
+ * __asm_flush_cache_user_range(start,end)
*
* Ensure that the I and D caches are coherent within specified region.
* This is typically used when code has been written to a memory region,
@@ -37,8 +37,7 @@ ENTRY(__flush_icache_range)
* - start - virtual start address of region
* - end - virtual end address of region
*/
-ENTRY(__flush_cache_user_range)
- uaccess_ttbr0_enable x2, x3, x4
+ENTRY(__asm_flush_cache_user_range)
alternative_if ARM64_HAS_CACHE_IDC
dsb ishst
b 7f
@@ -60,41 +59,32 @@ alternative_if ARM64_HAS_CACHE_DIC
alternative_else_nop_endif
invalidate_icache_by_line x0, x1, x2, x3, 9f
8: mov x0, #0
-1:
- uaccess_ttbr0_disable x1, x2
- ret
-9:
- mov x0, #-EFAULT
+1: ret
+9: mov x0, #-EFAULT
b 1b
-ENDPROC(__flush_icache_range)
-ENDPROC(__flush_cache_user_range)
+ENDPROC(__asm_flush_icache_range)
+ENDPROC(__asm_flush_cache_user_range)
/*
- * invalidate_icache_range(start,end)
+ * __asm_invalidate_icache_range(start,end)
*
* Ensure that the I cache is invalid within specified region.
*
* - start - virtual start address of region
* - end - virtual end address of region
*/
-ENTRY(invalidate_icache_range)
+ENTRY(__asm_invalidate_icache_range)
alternative_if ARM64_HAS_CACHE_DIC
mov x0, xzr
isb
ret
alternative_else_nop_endif
-
- uaccess_ttbr0_enable x2, x3, x4
-
invalidate_icache_by_line x0, x1, x2, x3, 2f
mov x0, xzr
-1:
- uaccess_ttbr0_disable x1, x2
- ret
-2:
- mov x0, #-EFAULT
+1: ret
+2: mov x0, #-EFAULT
b 1b
-ENDPROC(invalidate_icache_range)
+ENDPROC(__asm_invalidate_icache_range)
/*
* __flush_dcache_area(kaddr, size)
diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c
index ac485163a4a7..b23f34d23f31 100644
--- a/arch/arm64/mm/flush.c
+++ b/arch/arm64/mm/flush.c
@@ -75,7 +75,7 @@ EXPORT_SYMBOL(flush_dcache_page);
/*
* Additional functions defined in assembly.
*/
-EXPORT_SYMBOL(__flush_icache_range);
+EXPORT_SYMBOL(__asm_flush_icache_range);
#ifdef CONFIG_ARCH_HAS_PMEM_API
void arch_wb_cache_pmem(void *addr, size_t size)
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [Xen-devel] [PATCH v4 3/6] arm64: remove uaccess_ttbr0 asm macros from cache functions
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 3/6] arm64: remove uaccess_ttbr0 asm macros from cache functions Pavel Tatashin
@ 2019-12-07 20:33 ` kbuild test robot
0 siblings, 0 replies; 12+ messages in thread
From: kbuild test robot @ 2019-12-07 20:33 UTC (permalink / raw)
To: Pavel Tatashin
Cc: mark.rutland, catalin.marinas, stefan, linux, yamada.masahiro,
will, boris.ostrovsky, sashal, sstabellini, maz, jmorris,
linux-arm-kernel, xen-devel, vladimir.murzin, julien,
pasha.tatashin, alexios.zavras, tglx, allison, jgross,
kbuild-all, steve.capper, gregkh, linux-kernel, james.morse,
andrew.cooper3, info
[-- Attachment #1: Type: text/plain, Size: 3854 bytes --]
Hi Pavel,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on next-20191206]
[cannot apply to arm64/for-next/core xen-tip/linux-next v5.4-rc8 arm/for-next v5.4]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Pavel-Tatashin/Use-C-inlines-for-uaccess/20191207-044947
base: 838333c80c4f64a4ef9f5486f8bbc73312cd3abf
config: arm64-defconfig (attached as .config)
compiler: aarch64-linux-gcc (GCC) 7.5.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.5.0 make.cross ARCH=arm64
If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
arch/arm64/kernel/sys_compat.c: In function '__do_compat_cache_op':
>> arch/arm64/kernel/sys_compat.c:44:7: error: void value not ignored as it ought to be
ret = __flush_cache_user_range(start, start + chunk);
^
vim +44 arch/arm64/kernel/sys_compat.c
3dd681d944f6d8 Will Deacon 2012-03-05 23
a2d25a5391ca21 Vladimir Murzin 2014-12-01 24 static long
a2d25a5391ca21 Vladimir Murzin 2014-12-01 25 __do_compat_cache_op(unsigned long start, unsigned long end)
3dd681d944f6d8 Will Deacon 2012-03-05 26 {
a2d25a5391ca21 Vladimir Murzin 2014-12-01 27 long ret;
3dd681d944f6d8 Will Deacon 2012-03-05 28
a2d25a5391ca21 Vladimir Murzin 2014-12-01 29 do {
a2d25a5391ca21 Vladimir Murzin 2014-12-01 30 unsigned long chunk = min(PAGE_SIZE, end - start);
3dd681d944f6d8 Will Deacon 2012-03-05 31
a2d25a5391ca21 Vladimir Murzin 2014-12-01 32 if (fatal_signal_pending(current))
a2d25a5391ca21 Vladimir Murzin 2014-12-01 33 return 0;
a2d25a5391ca21 Vladimir Murzin 2014-12-01 34
222fc0c8503d98 James Morse 2019-10-17 35 if (cpus_have_const_cap(ARM64_WORKAROUND_1542419)) {
222fc0c8503d98 James Morse 2019-10-17 36 /*
222fc0c8503d98 James Morse 2019-10-17 37 * The workaround requires an inner-shareable tlbi.
222fc0c8503d98 James Morse 2019-10-17 38 * We pick the reserved-ASID to minimise the impact.
222fc0c8503d98 James Morse 2019-10-17 39 */
27a22fbdeedd6c Catalin Marinas 2019-10-28 40 __tlbi(aside1is, __TLBI_VADDR(0, 0));
222fc0c8503d98 James Morse 2019-10-17 41 dsb(ish);
222fc0c8503d98 James Morse 2019-10-17 42 }
222fc0c8503d98 James Morse 2019-10-17 43
a2d25a5391ca21 Vladimir Murzin 2014-12-01 @44 ret = __flush_cache_user_range(start, start + chunk);
a2d25a5391ca21 Vladimir Murzin 2014-12-01 45 if (ret)
a2d25a5391ca21 Vladimir Murzin 2014-12-01 46 return ret;
a2d25a5391ca21 Vladimir Murzin 2014-12-01 47
a2d25a5391ca21 Vladimir Murzin 2014-12-01 48 cond_resched();
a2d25a5391ca21 Vladimir Murzin 2014-12-01 49 start += chunk;
a2d25a5391ca21 Vladimir Murzin 2014-12-01 50 } while (start < end);
a2d25a5391ca21 Vladimir Murzin 2014-12-01 51
a2d25a5391ca21 Vladimir Murzin 2014-12-01 52 return 0;
3dd681d944f6d8 Will Deacon 2012-03-05 53 }
3dd681d944f6d8 Will Deacon 2012-03-05 54
:::::: The code at line 44 was first introduced by commit
:::::: a2d25a5391ca219f196f9fee7b535c40d201c6bf arm64: compat: align cacheflush syscall with arch/arm
:::::: TO: Vladimir Murzin <vladimir.murzin@arm.com>
:::::: CC: Will Deacon <will.deacon@arm.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 46497 bytes --]
[-- Attachment #3: Type: text/plain, Size: 157 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply [flat|nested] 12+ messages in thread
* [Xen-devel] [PATCH v4 4/6] arm64: remove __asm_flush_icache_range
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
` (2 preceding siblings ...)
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 3/6] arm64: remove uaccess_ttbr0 asm macros from cache functions Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 5/6] arm64: move ARM64_HAS_CACHE_DIC/_IDC from asm to C Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 6/6] arm64: remove the rest of asm-uaccess.h Pavel Tatashin
5 siblings, 0 replies; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
__asm_flush_icache_range is an alias to __asm_flush_cache_user_range,
but now that these functions are called from C wrappers the fall
through can instead be done at a higher level.
Remove the __asm_flush_icache_range alias in assembly, and instead call
__flush_cache_user_range() from __flush_icache_range().
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
---
arch/arm64/include/asm/cacheflush.h | 5 +----
arch/arm64/mm/cache.S | 14 --------------
arch/arm64/mm/flush.c | 2 +-
3 files changed, 2 insertions(+), 19 deletions(-)
diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
index 431f8da2dd02..ea563344b4ad 100644
--- a/arch/arm64/include/asm/cacheflush.h
+++ b/arch/arm64/include/asm/cacheflush.h
@@ -61,7 +61,6 @@
* - kaddr - page address
* - size - region size
*/
-extern void __asm_flush_icache_range(unsigned long start, unsigned long end);
extern long __asm_flush_cache_user_range(unsigned long start,
unsigned long end);
extern int __asm_invalidate_icache_range(unsigned long start,
@@ -83,9 +82,7 @@ static inline void __flush_cache_user_range(unsigned long start,
static inline void __flush_icache_range(unsigned long start, unsigned long end)
{
- uaccess_ttbr0_enable();
- __asm_flush_icache_range(start, end);
- uaccess_ttbr0_disable();
+ __flush_cache_user_range(start, end);
}
static inline int invalidate_icache_range(unsigned long start,
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 602b9aa8603a..1981cbaf5d92 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -14,19 +14,6 @@
#include <asm/alternative.h>
#include <asm/asm-uaccess.h>
-/*
- * __asm_flush_icache_range(start,end)
- *
- * Ensure that the I and D caches are coherent within specified region.
- * This is typically used when code has been written to a memory region,
- * and will be executed.
- *
- * - start - virtual start address of region
- * - end - virtual end address of region
- */
-ENTRY(__asm_flush_icache_range)
- /* FALLTHROUGH */
-
/*
* __asm_flush_cache_user_range(start,end)
*
@@ -62,7 +49,6 @@ alternative_else_nop_endif
1: ret
9: mov x0, #-EFAULT
b 1b
-ENDPROC(__asm_flush_icache_range)
ENDPROC(__asm_flush_cache_user_range)
/*
diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c
index b23f34d23f31..61521285f27d 100644
--- a/arch/arm64/mm/flush.c
+++ b/arch/arm64/mm/flush.c
@@ -75,7 +75,7 @@ EXPORT_SYMBOL(flush_dcache_page);
/*
* Additional functions defined in assembly.
*/
-EXPORT_SYMBOL(__asm_flush_icache_range);
+EXPORT_SYMBOL(__asm_flush_cache_user_range);
#ifdef CONFIG_ARCH_HAS_PMEM_API
void arch_wb_cache_pmem(void *addr, size_t size)
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Xen-devel] [PATCH v4 5/6] arm64: move ARM64_HAS_CACHE_DIC/_IDC from asm to C
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
` (3 preceding siblings ...)
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 4/6] arm64: remove __asm_flush_icache_range Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 6/6] arm64: remove the rest of asm-uaccess.h Pavel Tatashin
5 siblings, 0 replies; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
The assmbly functions __asm_flush_cache_user_range and
__asm_invalidate_icache_range have alternatives:
alternative_if ARM64_HAS_CACHE_DIC
...
alternative_if ARM64_HAS_CACHE_IDC
...
But, the implementation of those alternatives is trivial and therefore
can be done in the C inline wrappers.
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
---
arch/arm64/include/asm/cacheflush.h | 19 +++++++++++++++++++
arch/arm64/mm/cache.S | 27 +++++----------------------
arch/arm64/mm/flush.c | 1 +
3 files changed, 25 insertions(+), 22 deletions(-)
diff --git a/arch/arm64/include/asm/cacheflush.h b/arch/arm64/include/asm/cacheflush.h
index ea563344b4ad..4eb244ee7154 100644
--- a/arch/arm64/include/asm/cacheflush.h
+++ b/arch/arm64/include/asm/cacheflush.h
@@ -75,8 +75,22 @@ extern void sync_icache_aliases(void *kaddr, unsigned long len);
static inline void __flush_cache_user_range(unsigned long start,
unsigned long end)
{
+ if (cpus_have_const_cap(ARM64_HAS_CACHE_IDC)) {
+ dsb(ishst);
+ if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC)) {
+ isb();
+ return;
+ }
+ }
+
uaccess_ttbr0_enable();
__asm_flush_cache_user_range(start, end);
+
+ if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC))
+ isb();
+ else
+ __asm_invalidate_icache_range(start, end);
+
uaccess_ttbr0_disable();
}
@@ -90,6 +104,11 @@ static inline int invalidate_icache_range(unsigned long start,
{
int ret;
+ if (cpus_have_const_cap(ARM64_HAS_CACHE_DIC)) {
+ isb();
+ return 0;
+ }
+
uaccess_ttbr0_enable();
ret = __asm_invalidate_icache_range(start, end);
uaccess_ttbr0_disable();
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 1981cbaf5d92..0093bb9fcd12 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -25,30 +25,18 @@
* - end - virtual end address of region
*/
ENTRY(__asm_flush_cache_user_range)
-alternative_if ARM64_HAS_CACHE_IDC
- dsb ishst
- b 7f
-alternative_else_nop_endif
dcache_line_size x2, x3
sub x3, x2, #1
bic x4, x0, x3
-1:
-user_alt 9f, "dc cvau, x4", "dc civac, x4", ARM64_WORKAROUND_CLEAN_CACHE
+1: user_alt 3f, "dc cvau, x4", "dc civac, x4", ARM64_WORKAROUND_CLEAN_CACHE
add x4, x4, x2
cmp x4, x1
b.lo 1b
dsb ish
-
-7:
-alternative_if ARM64_HAS_CACHE_DIC
- isb
- b 8f
-alternative_else_nop_endif
- invalidate_icache_by_line x0, x1, x2, x3, 9f
-8: mov x0, #0
-1: ret
-9: mov x0, #-EFAULT
- b 1b
+ mov x0, #0
+2: ret
+3: mov x0, #-EFAULT
+ b 2b
ENDPROC(__asm_flush_cache_user_range)
/*
@@ -60,11 +48,6 @@ ENDPROC(__asm_flush_cache_user_range)
* - end - virtual end address of region
*/
ENTRY(__asm_invalidate_icache_range)
-alternative_if ARM64_HAS_CACHE_DIC
- mov x0, xzr
- isb
- ret
-alternative_else_nop_endif
invalidate_icache_by_line x0, x1, x2, x3, 2f
mov x0, xzr
1: ret
diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c
index 61521285f27d..adfdacb163ad 100644
--- a/arch/arm64/mm/flush.c
+++ b/arch/arm64/mm/flush.c
@@ -76,6 +76,7 @@ EXPORT_SYMBOL(flush_dcache_page);
* Additional functions defined in assembly.
*/
EXPORT_SYMBOL(__asm_flush_cache_user_range);
+EXPORT_SYMBOL(__asm_invalidate_icache_range);
#ifdef CONFIG_ARCH_HAS_PMEM_API
void arch_wb_cache_pmem(void *addr, size_t size)
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [Xen-devel] [PATCH v4 6/6] arm64: remove the rest of asm-uaccess.h
2019-12-04 23:20 [Xen-devel] [PATCH v4 0/6] Use C inlines for uaccess Pavel Tatashin
` (4 preceding siblings ...)
2019-12-04 23:20 ` [Xen-devel] [PATCH v4 5/6] arm64: move ARM64_HAS_CACHE_DIC/_IDC from asm to C Pavel Tatashin
@ 2019-12-04 23:20 ` Pavel Tatashin
5 siblings, 0 replies; 12+ messages in thread
From: Pavel Tatashin @ 2019-12-04 23:20 UTC (permalink / raw)
To: pasha.tatashin, jmorris, sashal, linux-kernel, catalin.marinas,
will, steve.capper, linux-arm-kernel, maz, james.morse,
vladimir.murzin, mark.rutland, tglx, gregkh, allison, info,
alexios.zavras, sstabellini, boris.ostrovsky, jgross, stefan,
yamada.masahiro, xen-devel, linux, andrew.cooper3, julien
The __uaccess_ttbr0_disable and __uaccess_ttbr0_enable,
are the last two macros defined in asm-uaccess.h.
For now move them to entry.S where they are used. Eventually,
these macros should be replaced with C wrappers to reduce the
maintenance burden.
Also, once these macros are unified with the C counterparts, it
is a good idea to check that PAN is in correct state on every
enable/disable calls.
Signed-off-by: Pavel Tatashin <pasha.tatashin@soleen.com>
---
arch/arm64/include/asm/asm-uaccess.h | 39 ----------------------------
arch/arm64/kernel/entry.S | 27 ++++++++++++++++++-
arch/arm64/lib/clear_user.S | 2 +-
arch/arm64/lib/copy_from_user.S | 2 +-
arch/arm64/lib/copy_in_user.S | 2 +-
arch/arm64/lib/copy_to_user.S | 2 +-
arch/arm64/mm/cache.S | 1 -
7 files changed, 30 insertions(+), 45 deletions(-)
delete mode 100644 arch/arm64/include/asm/asm-uaccess.h
diff --git a/arch/arm64/include/asm/asm-uaccess.h b/arch/arm64/include/asm/asm-uaccess.h
deleted file mode 100644
index fba2a69f7fef..000000000000
--- a/arch/arm64/include/asm/asm-uaccess.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef __ASM_ASM_UACCESS_H
-#define __ASM_ASM_UACCESS_H
-
-#include <asm/alternative.h>
-#include <asm/kernel-pgtable.h>
-#include <asm/mmu.h>
-#include <asm/sysreg.h>
-#include <asm/assembler.h>
-
-/*
- * User access enabling/disabling macros.
- */
-#ifdef CONFIG_ARM64_SW_TTBR0_PAN
- .macro __uaccess_ttbr0_disable, tmp1
- mrs \tmp1, ttbr1_el1 // swapper_pg_dir
- bic \tmp1, \tmp1, #TTBR_ASID_MASK
- sub \tmp1, \tmp1, #RESERVED_TTBR0_SIZE // reserved_ttbr0 just before swapper_pg_dir
- msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
- isb
- add \tmp1, \tmp1, #RESERVED_TTBR0_SIZE
- msr ttbr1_el1, \tmp1 // set reserved ASID
- isb
- .endm
-
- .macro __uaccess_ttbr0_enable, tmp1, tmp2
- get_current_task \tmp1
- ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
- mrs \tmp2, ttbr1_el1
- extr \tmp2, \tmp2, \tmp1, #48
- ror \tmp2, \tmp2, #16
- msr ttbr1_el1, \tmp2 // set the active ASID
- isb
- msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
- isb
- .endm
-#endif
-
-#endif
diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
index 583f71abbe98..446d90ab31af 100644
--- a/arch/arm64/kernel/entry.S
+++ b/arch/arm64/kernel/entry.S
@@ -22,8 +22,8 @@
#include <asm/mmu.h>
#include <asm/processor.h>
#include <asm/ptrace.h>
+#include <asm/kernel-pgtable.h>
#include <asm/thread_info.h>
-#include <asm/asm-uaccess.h>
#include <asm/unistd.h>
/*
@@ -143,6 +143,31 @@ alternative_cb_end
#endif
.endm
+#ifdef CONFIG_ARM64_SW_TTBR0_PAN
+ .macro __uaccess_ttbr0_disable, tmp1
+ mrs \tmp1, ttbr1_el1 // swapper_pg_dir
+ bic \tmp1, \tmp1, #TTBR_ASID_MASK
+ sub \tmp1, \tmp1, #RESERVED_TTBR0_SIZE // reserved_ttbr0 just before swapper_pg_dir
+ msr ttbr0_el1, \tmp1 // set reserved TTBR0_EL1
+ isb
+ add \tmp1, \tmp1, #RESERVED_TTBR0_SIZE
+ msr ttbr1_el1, \tmp1 // set reserved ASID
+ isb
+ .endm
+
+ .macro __uaccess_ttbr0_enable, tmp1, tmp2
+ get_current_task \tmp1
+ ldr \tmp1, [\tmp1, #TSK_TI_TTBR0] // load saved TTBR0_EL1
+ mrs \tmp2, ttbr1_el1
+ extr \tmp2, \tmp2, \tmp1, #48
+ ror \tmp2, \tmp2, #16
+ msr ttbr1_el1, \tmp2 // set the active ASID
+ isb
+ msr ttbr0_el1, \tmp1 // set the non-PAN TTBR0_EL1
+ isb
+ .endm
+#endif
+
.macro kernel_entry, el, regsize = 64
.if \regsize == 32
mov w0, w0 // zero upper 32 bits of x0
diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S
index aeafc03e961a..b0b4a86a09e2 100644
--- a/arch/arm64/lib/clear_user.S
+++ b/arch/arm64/lib/clear_user.S
@@ -6,7 +6,7 @@
*/
#include <linux/linkage.h>
-#include <asm/asm-uaccess.h>
+#include <asm/alternative.h>
#include <asm/assembler.h>
.text
diff --git a/arch/arm64/lib/copy_from_user.S b/arch/arm64/lib/copy_from_user.S
index ebb3c06cbb5d..142bc7505518 100644
--- a/arch/arm64/lib/copy_from_user.S
+++ b/arch/arm64/lib/copy_from_user.S
@@ -5,7 +5,7 @@
#include <linux/linkage.h>
-#include <asm/asm-uaccess.h>
+#include <asm/alternative.h>
#include <asm/assembler.h>
#include <asm/cache.h>
diff --git a/arch/arm64/lib/copy_in_user.S b/arch/arm64/lib/copy_in_user.S
index 3d8153a1ebce..04dc48ca26f7 100644
--- a/arch/arm64/lib/copy_in_user.S
+++ b/arch/arm64/lib/copy_in_user.S
@@ -7,7 +7,7 @@
#include <linux/linkage.h>
-#include <asm/asm-uaccess.h>
+#include <asm/alternative.h>
#include <asm/assembler.h>
#include <asm/cache.h>
diff --git a/arch/arm64/lib/copy_to_user.S b/arch/arm64/lib/copy_to_user.S
index 357eae2c18eb..8f3218ae88ab 100644
--- a/arch/arm64/lib/copy_to_user.S
+++ b/arch/arm64/lib/copy_to_user.S
@@ -5,7 +5,7 @@
#include <linux/linkage.h>
-#include <asm/asm-uaccess.h>
+#include <asm/alternative.h>
#include <asm/assembler.h>
#include <asm/cache.h>
diff --git a/arch/arm64/mm/cache.S b/arch/arm64/mm/cache.S
index 0093bb9fcd12..627be857b8d0 100644
--- a/arch/arm64/mm/cache.S
+++ b/arch/arm64/mm/cache.S
@@ -12,7 +12,6 @@
#include <asm/assembler.h>
#include <asm/cpufeature.h>
#include <asm/alternative.h>
-#include <asm/asm-uaccess.h>
/*
* __asm_flush_cache_user_range(start,end)
--
2.24.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
^ permalink raw reply related [flat|nested] 12+ messages in thread