提交 6039893e 编写于 作者: Z Zihao Yu

riscv64,csr: trigger illegal instruction with rdtime

上级 c736299a
#include "rtl/rtl.h" #include "rtl/rtl.h"
#include "csr.h" #include "csr.h"
#include <setjmp.h> #include <setjmp.h>
#include "intr.h"
#define INTR_BIT (1ULL << 63) #define INTR_BIT (1ULL << 63)
enum { enum {
...@@ -23,6 +24,7 @@ void raise_intr(word_t NO, vaddr_t epc) { ...@@ -23,6 +24,7 @@ void raise_intr(word_t NO, vaddr_t epc) {
mstatus->sie = 0; mstatus->sie = 0;
cpu.mode = MODE_S; cpu.mode = MODE_S;
rtl_li(&s0, stvec->val); rtl_li(&s0, stvec->val);
if (NO == EX_II) stval->val = 0;
} else { } else {
mcause->val = NO; mcause->val = NO;
mepc->val = epc; mepc->val = epc;
...@@ -31,6 +33,7 @@ void raise_intr(word_t NO, vaddr_t epc) { ...@@ -31,6 +33,7 @@ void raise_intr(word_t NO, vaddr_t epc) {
mstatus->mie = 0; mstatus->mie = 0;
cpu.mode = MODE_M; cpu.mode = MODE_M;
rtl_li(&s0, mtvec->val); rtl_li(&s0, mtvec->val);
if (NO == EX_II) mtval->val = 0;
} }
rtl_jr(&s0); rtl_jr(&s0);
......
#include "nemu.h" #include "nemu.h"
#include "monitor/diff-test.h" #include "monitor/diff-test.h"
#include "csr.h" #include "csr.h"
#include "intr.h"
const char *regsl[] = { const char *regsl[] = {
"$0", "ra", "sp", "gp", "tp", "t0", "t1", "t2", "$0", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
...@@ -50,6 +51,10 @@ static bool csr_exist[4096] = { ...@@ -50,6 +51,10 @@ static bool csr_exist[4096] = {
static inline word_t* csr_decode(uint32_t addr) { static inline word_t* csr_decode(uint32_t addr) {
assert(addr < 4096); assert(addr < 4096);
if (addr == 0xc01) {
// time
longjmp_raise_intr(EX_II);
}
Assert(csr_exist[addr], "unimplemented CSR 0x%x at pc = " FMT_WORD, addr, cpu.pc); Assert(csr_exist[addr], "unimplemented CSR 0x%x at pc = " FMT_WORD, addr, cpu.pc);
return &csr_array[addr]; return &csr_array[addr];
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册