firware: optimize the exception exit code
authorXiang W <wxjstz@126.com>
Tue, 30 Mar 2021 12:07:35 +0000 (20:07 +0800)
committerAnup Patel <anup@brainfault.org>
Thu, 1 Apr 2021 05:18:35 +0000 (10:48 +0530)
There are two copies of the same abnormal exit code, this patch deletes one

Signed-off-by: Xiang W <wxjstz@126.com>
Reviewed-by: Anup Patel <anup.patel@wdc.com>
firmware/fw_base.S
include/sbi/sbi_trap.h
lib/sbi/sbi_trap.c

index 2ce3851..c897ed0 100644 (file)
@@ -711,6 +711,7 @@ fw_platform_init:
        .section .entry, "ax", %progbits
        .align 3
        .globl _trap_handler
+       .globl _trap_exit
 _trap_handler:
        TRAP_SAVE_AND_SETUP_SP_T0
 
@@ -720,17 +721,6 @@ _trap_handler:
 
        TRAP_CALL_C_ROUTINE
 
-       TRAP_RESTORE_GENERAL_REGS_EXCEPT_SP_T0
-
-       TRAP_RESTORE_MEPC_MSTATUS 0
-
-       TRAP_RESTORE_SP_T0
-
-       mret
-
-       .section .entry, "ax", %progbits
-       .align 3
-       .globl _trap_exit
 _trap_exit:
        add     sp, a0, zero
 
@@ -746,6 +736,7 @@ _trap_exit:
        .section .entry, "ax", %progbits
        .align 3
        .globl _trap_handler_rv32_hyp
+       .globl _trap_exit_rv32_hyp
 _trap_handler_rv32_hyp:
        TRAP_SAVE_AND_SETUP_SP_T0
 
@@ -755,17 +746,6 @@ _trap_handler_rv32_hyp:
 
        TRAP_CALL_C_ROUTINE
 
-       TRAP_RESTORE_GENERAL_REGS_EXCEPT_SP_T0
-
-       TRAP_RESTORE_MEPC_MSTATUS 1
-
-       TRAP_RESTORE_SP_T0
-
-       mret
-
-       .section .entry, "ax", %progbits
-       .align 3
-       .globl _trap_exit_rv32_hyp
 _trap_exit_rv32_hyp:
        add     sp, a0, zero
 
index 070d000..d205056 100644 (file)
@@ -205,7 +205,7 @@ struct sbi_trap_info {
 int sbi_trap_redirect(struct sbi_trap_regs *regs,
                      struct sbi_trap_info *trap);
 
-void sbi_trap_handler(struct sbi_trap_regs *regs);
+struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs);
 
 void __noreturn sbi_trap_exit(const struct sbi_trap_regs *regs);
 
index b7349d2..1ba6490 100644 (file)
@@ -210,7 +210,7 @@ int sbi_trap_redirect(struct sbi_trap_regs *regs,
  *
  * @param regs pointer to register state
  */
-void sbi_trap_handler(struct sbi_trap_regs *regs)
+struct sbi_trap_regs *sbi_trap_handler(struct sbi_trap_regs *regs)
 {
        int rc = SBI_ENOTSUPP;
        const char *msg = "trap handler failed";
@@ -236,7 +236,7 @@ void sbi_trap_handler(struct sbi_trap_regs *regs)
                        msg = "unhandled external interrupt";
                        goto trap_error;
                };
-               return;
+               return regs;
        }
 
        switch (mcause) {
@@ -271,6 +271,7 @@ void sbi_trap_handler(struct sbi_trap_regs *regs)
 trap_error:
        if (rc)
                sbi_trap_error(msg, rc, mcause, mtval, mtval2, mtinst, regs);
+       return regs;
 }
 
 typedef void (*trap_exit_t)(const struct sbi_trap_regs *regs);