From 6f407a8d549620be5cfbdaa0b9fda967d633d736 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Wed, 29 Mar 2017 16:27:11 -0700 Subject: Attempt to read instruction from mbadaddr --- machine/emulation.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/machine/emulation.c b/machine/emulation.c index 25b39af..b5d3410 100644 --- a/machine/emulation.c +++ b/machine/emulation.c @@ -128,11 +128,15 @@ void illegal_insn_trap(uintptr_t* regs, uintptr_t mcause, uintptr_t mepc) " .word truly_illegal_insn\n" " .popsection"); - uintptr_t mstatus; - insn_t insn = get_insn(mepc, &mstatus); - - if ((insn & 3) != 3) - return emulate_rvc(regs, mcause, mepc, mstatus, insn); + uintptr_t mstatus = read_csr(mstatus); + insn_t insn = read_csr(mbadaddr); + + if (unlikely((insn & 3) != 3)) { + if (insn == 0) + insn = get_insn(mepc, &mstatus); + if ((insn & 3) != 3) + return emulate_rvc(regs, mcause, mepc, mstatus, insn); + } write_csr(mepc, mepc + 4); -- cgit v1.1