Browse Source

Always write sbadaddr on trap redirection

pull/53/head
Andrew Waterman 9 years ago
parent
commit
5f736b9ab8
  1. 2
      machine/emulation.c
  2. 2
      machine/emulation.h
  3. 8
      machine/mtrap.c

2
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)

2
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);

8
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);
}

Loading…
Cancel
Save