From 5a7bd0c88d7455de46143ccd9c74a40162bd3611 Mon Sep 17 00:00:00 2001 From: Anup Patel Date: Thu, 19 Mar 2020 19:54:32 +0530 Subject: [PATCH] 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 Reviewed-by: Atish Patra --- include/sbi/sbi_illegal_insn.h | 5 +---- lib/sbi/sbi_illegal_insn.c | 34 +++++++++++----------------------- lib/sbi/sbi_trap.c | 3 +-- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/include/sbi/sbi_illegal_insn.h b/include/sbi/sbi_illegal_insn.h index 1e1f74a1..0397935e 100644 --- a/include/sbi/sbi_illegal_insn.h +++ b/include/sbi/sbi_illegal_insn.h @@ -13,10 +13,7 @@ #include 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 980b7dd7..1b174875 100644 --- a/lib/sbi/sbi_illegal_insn.c +++ b/lib/sbi/sbi_illegal_insn.c @@ -16,18 +16,14 @@ #include #include -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 bab05719..36702cac 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: