arm64: efi: Revert "Recover from synchronous exceptions ..."
authorArd Biesheuvel <ardb@kernel.org>
Wed, 30 Nov 2022 16:37:17 +0000 (17:37 +0100)
committerArd Biesheuvel <ardb@kernel.org>
Thu, 1 Dec 2022 13:48:26 +0000 (14:48 +0100)
This reverts commit 23715a26c8d81291, which introduced some code in
assembler that manipulates both the ordinary and the shadow call stack
pointer in a way that could potentially be taken advantage of. So let's
revert it, and do a better job the next time around.

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
arch/arm64/mm/fault.c

index d6cf535..439e2bc 100644 (file)
 
 #ifdef CONFIG_EFI
 extern void efi_init(void);
-
-bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg);
 #else
 #define efi_init()
-
-static inline
-bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)
-{
-       return false;
-}
 #endif
 
 int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);
index 67babd5..75691a2 100644 (file)
@@ -6,7 +6,7 @@
 #include <linux/linkage.h>
 
 SYM_FUNC_START(__efi_rt_asm_wrapper)
-       stp     x29, x30, [sp, #-112]!
+       stp     x29, x30, [sp, #-32]!
        mov     x29, sp
 
        /*
@@ -17,20 +17,6 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
        stp     x1, x18, [sp, #16]
 
        /*
-        * Preserve all callee saved registers and record the stack pointer
-        * value in a per-CPU variable so we can recover from synchronous
-        * exceptions occurring while running the firmware routines.
-        */
-       stp     x19, x20, [sp, #32]
-       stp     x21, x22, [sp, #48]
-       stp     x23, x24, [sp, #64]
-       stp     x25, x26, [sp, #80]
-       stp     x27, x28, [sp, #96]
-
-       adr_this_cpu    x8, __efi_rt_asm_recover_sp, x9
-       str             x29, [x8]
-
-       /*
         * We are lucky enough that no EFI runtime services take more than
         * 5 arguments, so all are passed in registers rather than via the
         * stack.
@@ -45,7 +31,7 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
 
        ldp     x1, x2, [sp, #16]
        cmp     x2, x18
-       ldp     x29, x30, [sp], #112
+       ldp     x29, x30, [sp], #32
        b.ne    0f
        ret
 0:
@@ -59,18 +45,3 @@ SYM_FUNC_START(__efi_rt_asm_wrapper)
        mov     x18, x2
        b       efi_handle_corrupted_x18        // tail call
 SYM_FUNC_END(__efi_rt_asm_wrapper)
-
-SYM_FUNC_START(__efi_rt_asm_recover)
-       ldr_this_cpu    x8, __efi_rt_asm_recover_sp, x9
-       mov             sp, x8
-
-       ldp     x0,  x18, [sp, #16]
-       ldp     x19, x20, [sp, #32]
-       ldp     x21, x22, [sp, #48]
-       ldp     x23, x24, [sp, #64]
-       ldp     x25, x26, [sp, #80]
-       ldp     x27, x28, [sp, #96]
-       ldp     x29, x30, [sp], #112
-
-       b       efi_handle_runtime_exception
-SYM_FUNC_END(__efi_rt_asm_recover)
index ee53f2a..a908a37 100644 (file)
@@ -9,7 +9,6 @@
 
 #include <linux/efi.h>
 #include <linux/init.h>
-#include <linux/percpu.h>
 
 #include <asm/efi.h>
 
@@ -145,28 +144,3 @@ asmlinkage efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f)
        pr_err_ratelimited(FW_BUG "register x18 corrupted by EFI %s\n", f);
        return s;
 }
-
-asmlinkage DEFINE_PER_CPU(u64, __efi_rt_asm_recover_sp);
-
-asmlinkage efi_status_t __efi_rt_asm_recover(void);
-
-asmlinkage efi_status_t efi_handle_runtime_exception(const char *f)
-{
-       pr_err(FW_BUG "Synchronous exception occurred in EFI runtime service %s()\n", f);
-       clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
-       return EFI_ABORTED;
-}
-
-bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)
-{
-        /* Check whether the exception occurred while running the firmware */
-       if (current_work() != &efi_rts_work.work || regs->pc >= TASK_SIZE_64)
-               return false;
-
-       pr_err(FW_BUG "Unable to handle %s in EFI runtime service\n", msg);
-       add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
-       dump_stack();
-
-       regs->pc = (u64)__efi_rt_asm_recover;
-       return true;
-}
index 3e9cf98..5b39149 100644 (file)
@@ -30,7 +30,6 @@
 #include <asm/bug.h>
 #include <asm/cmpxchg.h>
 #include <asm/cpufeature.h>
-#include <asm/efi.h>
 #include <asm/exception.h>
 #include <asm/daifflags.h>
 #include <asm/debug-monitors.h>
@@ -392,9 +391,6 @@ static void __do_kernel_fault(unsigned long addr, unsigned long esr,
                msg = "paging request";
        }
 
-       if (efi_runtime_fixup_exception(regs, msg))
-               return;
-
        die_kernel_fault(msg, addr, esr, regs);
 }