Re: [PATCH 16/27] arm64/sve: Preserve SVE registers around kernel-mode NEON use

2017-08-15 Thread Ard Biesheuvel
On 9 August 2017 at 13:05, Dave Martin  wrote:
> Kernel-mode NEON will corrupt the SVE vector registers, due to the
> way they alias the FPSIMD vector registers in the hardware.
>
> This patch ensures that any live SVE register content for the task
> is saved by kernel_neon_begin().  The data will be restored in the
> usual way on return to userspace.
>
> Signed-off-by: Dave Martin 
> ---
>  arch/arm64/kernel/fpsimd.c | 6 --
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
> index 955c873..b7fb836 100644
> --- a/arch/arm64/kernel/fpsimd.c
> +++ b/arch/arm64/kernel/fpsimd.c
> @@ -758,8 +758,10 @@ void kernel_neon_begin(void)
> __this_cpu_write(kernel_neon_busy, true);
>
> /* Save unsaved task fpsimd state, if any: */
> -   if (current->mm && !test_and_set_thread_flag(TIF_FOREIGN_FPSTATE))
> -   fpsimd_save_state(>thread.fpsimd_state);
> +   if (current->mm) {
> +   task_fpsimd_save();
> +   set_thread_flag(TIF_FOREIGN_FPSTATE);
> +   }
>
> /* Invalidate any task state remaining in the fpsimd regs: */
> __this_cpu_write(fpsimd_last_state, NULL);

Reviewed-by: Ard Biesheuvel 
___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm


[PATCH 16/27] arm64/sve: Preserve SVE registers around kernel-mode NEON use

2017-08-09 Thread Dave Martin
Kernel-mode NEON will corrupt the SVE vector registers, due to the
way they alias the FPSIMD vector registers in the hardware.

This patch ensures that any live SVE register content for the task
is saved by kernel_neon_begin().  The data will be restored in the
usual way on return to userspace.

Signed-off-by: Dave Martin 
---
 arch/arm64/kernel/fpsimd.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 955c873..b7fb836 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -758,8 +758,10 @@ void kernel_neon_begin(void)
__this_cpu_write(kernel_neon_busy, true);
 
/* Save unsaved task fpsimd state, if any: */
-   if (current->mm && !test_and_set_thread_flag(TIF_FOREIGN_FPSTATE))
-   fpsimd_save_state(>thread.fpsimd_state);
+   if (current->mm) {
+   task_fpsimd_save();
+   set_thread_flag(TIF_FOREIGN_FPSTATE);
+   }
 
/* Invalidate any task state remaining in the fpsimd regs: */
__this_cpu_write(fpsimd_last_state, NULL);
-- 
2.1.4

___
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm