]> git.baikalelectronics.ru Git - kernel.git/commitdiff
arm64/sve: Implement a helper to load SVE registers from FPSIMD state
authorJulien Grall <julien.grall@arm.com>
Fri, 28 Aug 2020 18:11:53 +0000 (19:11 +0100)
committerWill Deacon <will@kernel.org>
Mon, 21 Sep 2020 17:06:33 +0000 (18:06 +0100)
In a follow-up patch, we may save the FPSIMD rather than the full SVE
state when the state has to be zeroed on return to userspace (e.g
during a syscall).

Introduce an helper to load SVE vectors from FPSIMD state and zero the rest
of SVE registers.

Signed-off-by: Julien Grall <julien.grall@arm.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Dave Martin <Dave.Martin@arm.com>
Link: https://lore.kernel.org/r/20200828181155.17745-7-broonie@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/include/asm/fpsimd.h
arch/arm64/kernel/entry-fpsimd.S

index 958f642e930dcb681ee79771f5bf4a29b482e816..bec5f14b622ae2fd50e471803418ca6c91c624f0 100644 (file)
@@ -70,6 +70,8 @@ extern void sve_save_state(void *state, u32 *pfpsr);
 extern void sve_load_state(void const *state, u32 const *pfpsr,
                           unsigned long vq_minus_1);
 extern void sve_flush_live(void);
+extern void sve_load_from_fpsimd_state(struct user_fpsimd_state const *state,
+                                      unsigned long vq_minus_1);
 extern unsigned int sve_get_vl(void);
 
 struct arm64_cpu_capabilities;
index fdf7a5a35c6325626d22dba52b50222e5af64408..2ca395c25448f45f29e55ca67992d3ebd491aeb4 100644 (file)
@@ -48,6 +48,23 @@ SYM_FUNC_START(sve_get_vl)
        ret
 SYM_FUNC_END(sve_get_vl)
 
+/*
+ * Load SVE state from FPSIMD state.
+ *
+ * x0 = pointer to struct fpsimd_state
+ * x1 = VQ - 1
+ *
+ * Each SVE vector will be loaded with the first 128-bits taken from FPSIMD
+ * and the rest zeroed. All the other SVE registers will be zeroed.
+ */
+SYM_FUNC_START(sve_load_from_fpsimd_state)
+               sve_load_vq     x1, x2, x3
+               fpsimd_restore  x0, 8
+ _for n, 0, 15, _sve_pfalse    \n
+               _sve_wrffr      0
+               ret
+SYM_FUNC_END(sve_load_from_fpsimd_state)
+
 /* Zero all SVE registers but the first 128-bits of each vector */
 SYM_FUNC_START(sve_flush_live)
        sve_flush