Re: [PATCH v3 5/8] arm64/fpsimd: Drop special handling for EFI runtime services
From: Ard Biesheuvel <ardb@kernel.org>
Date: 2025-09-18 11:57:35
Also in:
linux-efi, lkml
Subsystem:
arm64 port (aarch64 architecture), the rest · Maintainers:
Catalin Marinas, Will Deacon, Linus Torvalds
On Thu, 18 Sept 2025 at 12:30, Ard Biesheuvel [off-list ref] wrote:
From: Ard Biesheuvel <ardb@kernel.org> Now that the use of kernel mode FP/SIMD is generally permitted when IRQs are disabled, the only purpose served by the EFI-specific fallback code in fpsimd.c is the case where an EFI call occurs from hardirq or NMI context. No such cases are known to occur in practice, and it is doubtful whether calling into the EFI firmware for any reason under such conditions would be a good idea to begin with. So disallow EFI runtime services in such cases. This means all the fallback code can be dropped. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> --- arch/arm64/include/asm/fpsimd.h | 4 - arch/arm64/kernel/efi.c | 8 +- arch/arm64/kernel/fpsimd.c | 121 -------------------- 3 files changed, 6 insertions(+), 127 deletions(-)
This patch is incomplete, the following needs to be folded in as well: arch/arm64/kernel/fpsimd.c | 39 --------------------------------------- 1 file changed, 39 deletions(-)
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index e543dd569bd7..c846161a002b 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c@@ -180,13 +180,6 @@ set_default_vl(ARM64_VEC_SVE, val); } -static u8 *efi_sve_state; - -#else /* ! CONFIG_ARM64_SVE */ - -/* Dummy declaration for code that will be optimised out: */ -extern u8 *efi_sve_state; - #endif /* ! CONFIG_ARM64_SVE */ #ifdef CONFIG_ARM64_SME
@@ -1086,36 +1079,6 @@ return 0; } -static void __init sve_efi_setup(void) -{ - int max_vl = 0; - int i; - - if (!IS_ENABLED(CONFIG_EFI)) - return; - - for (i = 0; i < ARRAY_SIZE(vl_info); i++) - max_vl = max(vl_info[i].max_vl, max_vl); - - /* - * alloc_percpu() warns and prints a backtrace if this goes wrong. - * This is evidence of a crippled system and we are returning void, - * so no attempt is made to handle this situation here. - */ - if (!sve_vl_valid(max_vl)) - goto fail; - - efi_sve_state = kmalloc(SVE_SIG_REGS_SIZE(sve_vq_from_vl(max_vl)), - GFP_KERNEL); - if (!efi_sve_state) - goto fail; - - return; - -fail: - panic("Cannot allocate memory for EFI SVE save/restore"); -} - void cpu_enable_sve(const struct arm64_cpu_capabilities *__always_unused p) { write_sysreg(read_sysreg(CPACR_EL1) | CPACR_EL1_ZEN_EL1EN, CPACR_EL1);
@@ -1176,8 +1139,6 @@ if (sve_max_virtualisable_vl() < sve_max_vl()) pr_warn("%s: unvirtualisable vector lengths present\n", info->name); - - sve_efi_setup(); } /*