diff --git a/src/isa/riscv64/exec/exec.c b/src/isa/riscv64/exec/exec.c index 87754b0bb0a5894d20b242f5d94588cde30284d7..1e9272d7e24a0b14ede60f72a0ae69ba7595756c 100644 --- a/src/isa/riscv64/exec/exec.c +++ b/src/isa/riscv64/exec/exec.c @@ -1,5 +1,6 @@ #include "cpu/exec.h" #include "all-instr.h" +#include static make_EHelper(load) { static OpcodeEntry table [8] = { @@ -136,6 +137,15 @@ static OpcodeEntry rvc_table [3][8] = { }; void isa_exec(vaddr_t *pc) { + extern jmp_buf intr_buf; + int setjmp_ret; + if ((setjmp_ret = setjmp(intr_buf)) != 0) { + int exception = setjmp_ret - 1; + void raise_intr(word_t, vaddr_t); + raise_intr(exception, cpu.pc); + return; + } + decinfo.isa.instr.val = instr_fetch(pc, 4); if (decinfo.isa.instr.opcode1_0 == 0x3) { idex(pc, &opcode_table[decinfo.isa.instr.opcode6_2]); diff --git a/src/isa/riscv64/intr.c b/src/isa/riscv64/intr.c index fdeaf3156ab84b744032a98dd6306229e1250afa..09c3295dd77c7785265ea206ffd2296d7d0b7190 100644 --- a/src/isa/riscv64/intr.c +++ b/src/isa/riscv64/intr.c @@ -1,5 +1,6 @@ #include "rtl/rtl.h" #include "csr.h" +#include #define INTR_BIT (1ULL << 63) enum { @@ -57,3 +58,8 @@ bool isa_query_intr(void) { } return false; } + +jmp_buf intr_buf; +void longjmp_raise_intr(uint32_t NO) { + longjmp(intr_buf, NO + 1); +}