aboutsummaryrefslogtreecommitdiff
path: root/lib/sbi/sbi_trap.c
diff options
context:
space:
mode:
authorAnup Patel <anup.patel@wdc.com>2020-03-19 17:13:16 +0530
committerAnup Patel <anup@brainfault.org>2020-03-28 13:31:53 +0530
commit1de66d170e71fb94732ffc80dcf4e70e623c4f7a (patch)
tree8b43a209cd287f5c9cdc0ec5761be6982f1ee664 /lib/sbi/sbi_trap.c
parent160c88535f07084051ebba97689fc4a7b2e9037c (diff)
lib: Optimize unpriv load/store implementation
This patch optimize unpriv load/store implementation by having dedicated unpriv trap handler (just like KVM RISC-V). As a result of this optimization: 1. We have reduced roughly 13+ instruction in all unpriv load/store functions. The reduced instruction also include two function calls. 2. Per-HART trap info pointer in scratch space is now redundant hence removed. 3. The sbi_trap_handler() is now much cleaner because we don't have to handle unpriv load/store traps. Signed-off-by: Anup Patel <anup.patel@wdc.com> Reviewed-by: Atish Patra <atish.patra@wdc.com>
Diffstat (limited to 'lib/sbi/sbi_trap.c')
-rw-r--r--lib/sbi/sbi_trap.c25
1 files changed, 1 insertions, 24 deletions
diff --git a/lib/sbi/sbi_trap.c b/lib/sbi/sbi_trap.c
index b4ba2ac..9aa6b85 100644
--- a/lib/sbi/sbi_trap.c
+++ b/lib/sbi/sbi_trap.c
@@ -220,7 +220,7 @@ void sbi_trap_handler(struct sbi_trap_regs *regs,
u32 hartid = current_hartid();
ulong mcause = csr_read(CSR_MCAUSE);
ulong mtval = csr_read(CSR_MTVAL), mtval2 = 0, mtinst = 0;
- struct sbi_trap_info trap, *uptrap;
+ struct sbi_trap_info trap;
if (misa_extension('H')) {
mtval2 = csr_read(CSR_MTVAL2);
@@ -266,29 +266,6 @@ void sbi_trap_handler(struct sbi_trap_regs *regs,
rc = sbi_ecall_handler(hartid, mcause, regs, scratch);
msg = "ecall handler failed";
break;
- case CAUSE_LOAD_ACCESS:
- case CAUSE_STORE_ACCESS:
- case CAUSE_LOAD_PAGE_FAULT:
- case CAUSE_STORE_PAGE_FAULT:
- uptrap = sbi_hart_get_trap_info(scratch);
- if ((regs->mstatus & MSTATUS_MPRV) && uptrap) {
- rc = 0;
- uptrap->epc = regs->mepc;
- regs->mepc += 4;
- uptrap->cause = mcause;
- uptrap->tval = mtval;
- uptrap->tval2 = mtval2;
- uptrap->tinst = mtinst;
- } else {
- trap.epc = regs->mepc;
- trap.cause = mcause;
- trap.tval = mtval;
- trap.tval2 = mtval2;
- trap.tinst = mtinst;
- rc = sbi_trap_redirect(regs, &trap, scratch);
- }
- msg = "page/access fault handler failed";
- break;
default:
/* If the trap came from S or U mode, redirect it there */
trap.epc = regs->mepc;