aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Waterman <andrew@sifive.com>2017-04-11 19:48:01 -0700
committerAndrew Waterman <andrew@sifive.com>2017-04-11 19:48:01 -0700
commit5f736b9ab82ad19e03fc720c63f08e01a72712cc (patch)
treedcdd19805e90be2f720a7e2e8c55d9c9fcea79ba
parent3a3c1f5a1a797b8d054652c6a5eecc13699dee51 (diff)
downloadriscv-pk-5f736b9ab82ad19e03fc720c63f08e01a72712cc.zip
riscv-pk-5f736b9ab82ad19e03fc720c63f08e01a72712cc.tar.gz
riscv-pk-5f736b9ab82ad19e03fc720c63f08e01a72712cc.tar.bz2
Always write sbadaddr on trap redirection
-rw-r--r--machine/emulation.c2
-rw-r--r--machine/emulation.h2
-rw-r--r--machine/mtrap.c8
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);
}