![Dave Martin](/assets/img/avatar_default.png)
Manipulating the SVE architectural state, including the vector and predicate registers, first-fault register and the vector length, requires the use of dedicated instructions added by SVE. This patch adds suitable assembly functions for saving and restoring the SVE registers and querying the vector length. Setting of the vector length is done as part of register restore. Since people building kernels may not all get an SVE-enabled toolchain for a while, this patch uses macros that generate explicit opcodes in place of assembler mnemonics. Signed-off-by: Dave Martin <Dave.Martin@arm.com> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Acked-by: Catalin Marinas <catalin.marinas@arm.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
61 lines
1.3 KiB
ArmAsm
61 lines
1.3 KiB
ArmAsm
/*
|
|
* FP/SIMD state saving and restoring
|
|
*
|
|
* Copyright (C) 2012 ARM Ltd.
|
|
* Author: Catalin Marinas <catalin.marinas@arm.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <linux/linkage.h>
|
|
|
|
#include <asm/assembler.h>
|
|
#include <asm/fpsimdmacros.h>
|
|
|
|
/*
|
|
* Save the FP registers.
|
|
*
|
|
* x0 - pointer to struct fpsimd_state
|
|
*/
|
|
ENTRY(fpsimd_save_state)
|
|
fpsimd_save x0, 8
|
|
ret
|
|
ENDPROC(fpsimd_save_state)
|
|
|
|
/*
|
|
* Load the FP registers.
|
|
*
|
|
* x0 - pointer to struct fpsimd_state
|
|
*/
|
|
ENTRY(fpsimd_load_state)
|
|
fpsimd_restore x0, 8
|
|
ret
|
|
ENDPROC(fpsimd_load_state)
|
|
|
|
#ifdef CONFIG_ARM64_SVE
|
|
ENTRY(sve_save_state)
|
|
sve_save 0, x1, 2
|
|
ret
|
|
ENDPROC(sve_save_state)
|
|
|
|
ENTRY(sve_load_state)
|
|
sve_load 0, x1, x2, 3
|
|
ret
|
|
ENDPROC(sve_load_state)
|
|
|
|
ENTRY(sve_get_vl)
|
|
_sve_rdvl 0, 1
|
|
ret
|
|
ENDPROC(sve_get_vl)
|
|
#endif /* CONFIG_ARM64_SVE */
|