Commit 9c4b4c70 authored by Julien Grall's avatar Julien Grall Committed by Will Deacon
Browse files

arm64/sve: Implement a helper to load SVE registers from FPSIMD state



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: default avatarJulien Grall <julien.grall@arm.com>
Signed-off-by: default avatarMark Brown <broonie@kernel.org>
Reviewed-by: default avatarDave Martin <Dave.Martin@arm.com>
Link: https://lore.kernel.org/r/20200828181155.17745-7-broonie@kernel.org


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 1e530f13
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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;
+17 −0
Original line number Diff line number Diff line
@@ -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