arm64: efi: Avoid workqueue to check whether EFI runtime is live
authorArd Biesheuvel <ardb@kernel.org>
Fri, 28 Oct 2022 14:39:14 +0000 (16:39 +0200)
committerArd Biesheuvel <ardb@kernel.org>
Mon, 16 Jan 2023 14:27:31 +0000 (15:27 +0100)
commit8a9a1a18731eb123e35f48176380a18b9782845e
treef575285adbe808f8a4b9b7346a6e88a266d4b304
parentd3f450533bbcb6dd4d7d59cadc9b61b7321e4ac1
arm64: efi: Avoid workqueue to check whether EFI runtime is live

Comparing current_work() against efi_rts_work.work is sufficient to
decide whether current is currently running EFI runtime services code at
any level in its call stack.

However, there are other potential users of the EFI runtime stack, such
as the ACPI subsystem, which may invoke efi_call_virt_pointer()
directly, and so any sync exceptions occurring in firmware during those
calls are currently misidentified.

So instead, let's check whether the stashed value of the thread stack
pointer points into current's thread stack. This can only be the case if
current was interrupted while running EFI runtime code. Note that this
implies that we should clear the stashed value after switching back, to
avoid false positives.

Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/arm64/include/asm/efi.h
arch/arm64/kernel/efi-rt-wrapper.S
arch/arm64/kernel/efi.c