Thread (15 messages) 15 messages, 4 authors, 2025-07-15

Re: [RFC PATCH 6/7] arm64/efi: Move uaccess en/disable out of efi_set_pgd()

From: Ard Biesheuvel <ardb@kernel.org>
Date: 2025-07-14 06:39:11
Also in: linux-efi, lkml

On Fri, 11 Jul 2025 at 23:42, Will Deacon [off-list ref] wrote:
On Wed, May 14, 2025 at 07:43:46PM +0200, Ard Biesheuvel wrote:
quoted
From: Ard Biesheuvel <ardb@kernel.org>

efi_set_pgd() will no longer be called when invoking EFI runtime
services via the efi_rts_wq work queue, but the uaccess en/disable are
still needed when using PAN emulation using TTBR0 switching. So move
these into the callers.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
---
 arch/arm64/include/asm/efi.h | 3 ---
 arch/arm64/kernel/efi.c      | 3 +++
 2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/arch/arm64/include/asm/efi.h b/arch/arm64/include/asm/efi.h
index decf87777f57..abe9176a3a23 100644
--- a/arch/arm64/include/asm/efi.h
+++ b/arch/arm64/include/asm/efi.h
@@ -132,15 +132,12 @@ static inline void efi_set_pgd(struct mm_struct *mm)
                       * exception when invoking the EFI run-time services.
                       */
                      update_saved_ttbr0(current, mm);
-                     uaccess_ttbr0_enable();
-                     post_ttbr_update_workaround();
              } else {
                      /*
                       * Defer the switch to the current thread's TTBR0_EL1
                       * until uaccess_enable(). Restore the current
                       * thread's saved ttbr0 corresponding to its active_mm
                       */
-                     uaccess_ttbr0_disable();
                      update_saved_ttbr0(current, current->active_mm);
              }
      }
diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
index d01ae156bb63..5d188c6c44d7 100644
--- a/arch/arm64/kernel/efi.c
+++ b/arch/arm64/kernel/efi.c
@@ -177,6 +177,8 @@ bool arch_efi_call_virt_setup(void)
              return false;

      efi_virtmap_load();
+     uaccess_ttbr0_enable();
+     post_ttbr_update_workaround();
      __efi_fpsimd_begin();
      return true;
 }
@@ -185,6 +187,7 @@ void arch_efi_call_virt_teardown(void)
 {
      __efi_fpsimd_end();
      efi_virtmap_unload();
+     uaccess_ttbr0_disable();
Moving this after updating the saved TTBR0 isn't great for SWPAN, as it
means that if we take an exception (e.g. an IRQ) before calling
uaccess_ttbr0_disable() then I think we'll end up running with the user
page-table installed briefly in TTBR0 which SWPAN is supposed to prevent
outside of genuine uaccess sections.
OK, I'll respin this to take that into account.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help