lib: sbi_illegal_insn: Remove mcause, scratch and hartid parameters
authorAnup Patel <anup.patel@wdc.com>
Thu, 19 Mar 2020 14:24:32 +0000 (19:54 +0530)
committerAnup Patel <anup@brainfault.org>
Sat, 28 Mar 2020 08:02:11 +0000 (13:32 +0530)
We remove mcause, scratch and hartid parameters from various
functions for illegal instruction handling because we can always
get current HART id and current scratch pointer using just one
CSR access.

Signed-off-by: Anup Patel <anup.patel@wdc.com>
Reviewed-by: Atish Patra <atish.patra@wdc.com>
include/sbi/sbi_illegal_insn.h
lib/sbi/sbi_illegal_insn.c
lib/sbi/sbi_trap.c

index 1e1f74a..0397935 100644 (file)
 #include <sbi/sbi_types.h>
 
 struct sbi_trap_regs;
-struct sbi_scratch;
 
-int sbi_illegal_insn_handler(u32 hartid, ulong mcause, ulong insn,
-                            struct sbi_trap_regs *regs,
-                            struct sbi_scratch *scratch);
+int sbi_illegal_insn_handler(ulong insn, struct sbi_trap_regs *regs);
 
 #endif
index 980b7dd..1b17487 100644 (file)
 #include <sbi/sbi_trap.h>
 #include <sbi/sbi_unpriv.h>
 
-typedef int (*illegal_insn_func)(ulong insn, u32 hartid, ulong mcause,
-                                struct sbi_trap_regs *regs,
-                                struct sbi_scratch *scratch);
+typedef int (*illegal_insn_func)(ulong insn, struct sbi_trap_regs *regs);
 
-static int truly_illegal_insn(ulong insn, u32 hartid, ulong mcause,
-                             struct sbi_trap_regs *regs,
-                             struct sbi_scratch *scratch)
+static int truly_illegal_insn(ulong insn, struct sbi_trap_regs *regs)
 {
        struct sbi_trap_info trap;
 
        trap.epc = regs->mepc;
-       trap.cause = mcause;
+       trap.cause = CAUSE_ILLEGAL_INSTRUCTION;
        trap.tval = insn;
        trap.tval2 = 0;
        trap.tinst = 0;
@@ -35,9 +31,7 @@ static int truly_illegal_insn(ulong insn, u32 hartid, ulong mcause,
        return sbi_trap_redirect(regs, &trap);
 }
 
-static int system_opcode_insn(ulong insn, u32 hartid, ulong mcause,
-                             struct sbi_trap_regs *regs,
-                             struct sbi_scratch *scratch)
+static int system_opcode_insn(ulong insn, struct sbi_trap_regs *regs)
 {
        int do_write, rs1_num = (insn >> 15) & 0x1f;
        ulong rs1_val = GET_RS1(insn, regs);
@@ -54,12 +48,10 @@ static int system_opcode_insn(ulong insn, u32 hartid, ulong mcause,
        if ((regs->mstatus & MSTATUS_MPV) &&
 #endif
            (insn & INSN_MASK_WFI) == INSN_MATCH_WFI)
-               return truly_illegal_insn(insn, hartid, mcause,
-                                         regs, scratch);
+               return truly_illegal_insn(insn, regs);
 
        if (sbi_emulate_csr_read(csr_num, regs, &csr_val))
-               return truly_illegal_insn(insn, hartid, mcause,
-                                         regs, scratch);
+               return truly_illegal_insn(insn, regs);
 
        do_write = rs1_num;
        switch (GET_RM(insn)) {
@@ -84,11 +76,11 @@ static int system_opcode_insn(ulong insn, u32 hartid, ulong mcause,
                new_csr_val = csr_val & ~rs1_num;
                break;
        default:
-               return truly_illegal_insn(insn, hartid, mcause, regs, scratch);
+               return truly_illegal_insn(insn, regs);
        };
 
        if (do_write && sbi_emulate_csr_write(csr_num, regs, new_csr_val))
-               return truly_illegal_insn(insn, hartid, mcause, regs, scratch);
+               return truly_illegal_insn(insn, regs);
 
        SET_RD(insn, regs, csr_val);
 
@@ -132,9 +124,7 @@ static illegal_insn_func illegal_insn_table[32] = {
        truly_illegal_insn  /* 31 */
 };
 
-int sbi_illegal_insn_handler(u32 hartid, ulong mcause, ulong insn,
-                            struct sbi_trap_regs *regs,
-                            struct sbi_scratch *scratch)
+int sbi_illegal_insn_handler(ulong insn, struct sbi_trap_regs *regs)
 {
        struct sbi_trap_info uptrap;
 
@@ -147,10 +137,8 @@ int sbi_illegal_insn_handler(u32 hartid, ulong mcause, ulong insn,
                        }
                }
                if ((insn & 3) != 3)
-                       return truly_illegal_insn(insn, hartid, mcause, regs,
-                                                 scratch);
+                       return truly_illegal_insn(insn, regs);
        }
 
-       return illegal_insn_table[(insn & 0x7c) >> 2](insn, hartid, mcause,
-                                                     regs, scratch);
+       return illegal_insn_table[(insn & 0x7c) >> 2](insn, regs);
 }
index bab0571..36702ca 100644 (file)
@@ -243,8 +243,7 @@ void sbi_trap_handler(struct sbi_trap_regs *regs,
 
        switch (mcause) {
        case CAUSE_ILLEGAL_INSTRUCTION:
-               rc  = sbi_illegal_insn_handler(hartid, mcause, mtval,
-                                              regs, scratch);
+               rc  = sbi_illegal_insn_handler(mtval, regs);
                msg = "illegal instruction handler failed";
                break;
        case CAUSE_MISALIGNED_LOAD: