diff options
author | Anup Patel <anup.patel@wdc.com> | 2020-03-19 17:13:16 +0530 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2020-03-28 13:31:53 +0530 |
commit | 1de66d170e71fb94732ffc80dcf4e70e623c4f7a (patch) | |
tree | 8b43a209cd287f5c9cdc0ec5761be6982f1ee664 /lib/sbi/sbi_trap.c | |
parent | 160c88535f07084051ebba97689fc4a7b2e9037c (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.c | 25 |
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; |