summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-03-19 17:24:32 +0300
committerAnup Patel <anup@brainfault.org>2020-03-28 11:02:11 +0300
commit5a7bd0c88d7455de46143ccd9c74a40162bd3611 (patch)
treebb307e808395462a08c27ea38a39a970c8f3ed2c
parentd11c79cd977443defe4260beec976fad29719eaf (diff)
downloadopensbi-5a7bd0c88d7455de46143ccd9c74a40162bd3611.tar.xz
lib: sbi_illegal_insn: Remove mcause, scratch and hartid parameters
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>
-rw-r--r--include/sbi/sbi_illegal_insn.h5
-rw-r--r--lib/sbi/sbi_illegal_insn.c34
-rw-r--r--lib/sbi/sbi_trap.c3
3 files changed, 13 insertions, 29 deletions
diff --git a/include/sbi/sbi_illegal_insn.h b/include/sbi/sbi_illegal_insn.h
index 1e1f74a..0397935 100644
--- a/include/sbi/sbi_illegal_insn.h
+++ b/include/sbi/sbi_illegal_insn.h
@@ -13,10 +13,7 @@
#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
diff --git a/lib/sbi/sbi_illegal_insn.c b/lib/sbi/sbi_illegal_insn.c
index 980b7dd..1b17487 100644
--- a/lib/sbi/sbi_illegal_insn.c
+++ b/lib/sbi/sbi_illegal_insn.c
@@ -16,18 +16,14 @@
#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);
}
diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
index bab0571..36702ca 100644
--- a/lib/sbi/sbi_trap.c
+++ b/lib/sbi/sbi_trap.c
@@ -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: