riscv: restore global data pointer in trap handler
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Sat, 26 Sep 2020 05:50:36 +0000 (07:50 +0200)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Mon, 28 Sep 2020 10:20:19 +0000 (12:20 +0200)
The gp register is used to store U-Boot's global data pointer. We should
not assume that an UEFI application leaves the gp register unchanged as
the UEFI specifications does not define who is the owner of the gp and tp
registers.

So the following sequence should be followed in the trap handler:

* save the caller's gp register
* restore the global data pointer
* serve interrupts or print crash dump and reset
* restore the caller's gp register

Cc: Abner Chang <abner.chang@hpe.com>
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Bin Meng <bin.meng@windriver.com>
Reviewed-by: Rick Chen <rick@andestech.com>
arch/riscv/lib/interrupts.c

index cd47e64487227f41ceac93ee8500260fe4a088c1..8ff40f0f360a1bcc6e0406089ce4fbcacdc78817 100644 (file)
@@ -111,6 +111,9 @@ ulong handle_trap(ulong cause, ulong epc, ulong tval, struct pt_regs *regs)
 {
        ulong is_irq, irq;
 
+       /* An UEFI application may have changed gd. Restore U-Boot's gd. */
+       efi_restore_gd();
+
        is_irq = (cause & MCAUSE_INT);
        irq = (cause & ~MCAUSE_INT);