From 5f736b9ab82ad19e03fc720c63f08e01a72712cc Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 11 Apr 2017 19:48:01 -0700 Subject: Always write sbadaddr on trap redirection --- machine/emulation.c | 2 +- machine/emulation.h | 2 +- machine/mtrap.c | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/machine/emulation.c b/machine/emulation.c index b5d3410..b86fa36 100644 --- a/machine/emulation.c +++ b/machine/emulation.c @@ -149,7 +149,7 @@ void illegal_insn_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) __attribute__((noinline)) DECLARE_EMULATION_FUNC(truly_illegal_insn) { - return redirect_trap(mepc, mstatus); + return redirect_trap(mepc, mstatus, insn); } static inline int emulate_read_csr(int num, uintptr_t mstatus, uintptr_t* result) diff --git a/machine/emulation.h b/machine/emulation.h index 156d847..f75173d 100644 --- a/machine/emulation.h +++ b/machine/emulation.h @@ -11,7 +11,7 @@ typedef void (*emulation_func)(uintptr_t*, uintptr_t, uintptr_t, uintptr_t, insn void misaligned_load_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc); void misaligned_store_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc); -void redirect_trap(uintptr_t epc, uintptr_t mstatus); +void redirect_trap(uintptr_t epc, uintptr_t mstatus, uintptr_t badaddr); DECLARE_EMULATION_FUNC(truly_illegal_insn); DECLARE_EMULATION_FUNC(emulate_rvc_0); DECLARE_EMULATION_FUNC(emulate_rvc_2); diff --git a/machine/mtrap.c b/machine/mtrap.c index c114757..d0c1684 100644 --- a/machine/mtrap.c +++ b/machine/mtrap.c @@ -161,8 +161,9 @@ send_ipi: regs[10] = retval; } -void redirect_trap(uintptr_t epc, uintptr_t mstatus) +void redirect_trap(uintptr_t epc, uintptr_t mstatus, uintptr_t badaddr) { + write_csr(sbadaddr, badaddr); write_csr(sepc, epc); write_csr(scause, read_csr(mcause)); write_csr(mepc, read_csr(stvec)); @@ -180,7 +181,7 @@ void redirect_trap(uintptr_t epc, uintptr_t mstatus) void pmp_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) { - redirect_trap(mepc, read_csr(mstatus)); + redirect_trap(mepc, read_csr(mstatus), read_csr(mbadaddr)); } static void machine_page_fault(uintptr_t* regs, uintptr_t dummy, uintptr_t mepc) @@ -188,8 +189,7 @@ static void machine_page_fault(uintptr_t* regs, uintptr_t dummy, uintptr_t mepc) // MPRV=1 iff this trap occurred while emulating an instruction on behalf // of a lower privilege level. In that case, a2=epc and a3=mstatus. if (read_csr(mstatus) & MSTATUS_MPRV) { - write_csr(sbadaddr, read_csr(mbadaddr)); - return redirect_trap(regs[12], regs[13]); + return redirect_trap(regs[12], regs[13], read_csr(mbadaddr)); } bad_trap(regs, dummy, mepc); } -- cgit v1.1