提交 aaa1feeb 编写于 作者: Z Zihao Yu

Merge branch 'riscv64-difftest-csr' into 'rv64'

riscv64,difftest: add [m|s][status|cause|epc]

See merge request projectn/nemu!30
#include "nemu.h"
#include "monitor/diff-test.h"
#include "csr.h"
bool isa_difftest_checkregs(CPU_state *ref_r, vaddr_t pc) {
if (memcmp(&cpu, ref_r, DIFFTEST_REG_SIZE)) {
......@@ -17,3 +18,24 @@ void isa_difftest_attach(void) {
ref_difftest_memcpy_from_dut(0, guest_to_host(0), PMEM_SIZE);
ref_difftest_setregs(&cpu);
}
void isa_difftest_getregs_hook(void) {
cpu.mstatus = mstatus->val;
cpu.mcause = mcause->val;
cpu.mepc = mepc->val;
rtlreg_t temp;
csr_read(&temp, 0x100); // sstatus
cpu.sstatus = temp;
cpu.scause = scause->val;
cpu.sepc = sepc->val;
}
void isa_difftest_setregs_hook(void) {
mstatus->val = cpu.mstatus;
mcause ->val = cpu.mcause ;
mepc ->val = cpu.mepc ;
//sstatus->val = cpu.sstatus; // sstatus is a shadow of mstatus
scause ->val = cpu.scause ;
sepc ->val = cpu.sepc ;
}
#ifndef __RISCV64_DIFF_TEST_H__
#define __RISCV64_DIFF_TEST_H__
#define DIFFTEST_REG_SIZE (sizeof(uint64_t) * 33) // GRPs + pc
#define DIFFTEST_REG_SIZE (sizeof(uint64_t) * (32 + 1 + 6)) // GRPs + pc + [m|s][status|cause|epc]
void isa_difftest_getregs_hook(void);
void isa_difftest_setregs_hook(void);
#endif
......@@ -15,6 +15,9 @@ typedef struct {
} gpr[32];
vaddr_t pc;
vaddr_t mstatus, mcause, mepc;
vaddr_t sstatus, scause, sepc;
uint8_t mode;
bool fetching;
......
......@@ -10,11 +10,13 @@ void difftest_memcpy_from_dut(paddr_t dest, void *src, size_t n) {
}
void difftest_getregs(void *r) {
isa_difftest_getregs_hook();
memcpy(r, &cpu, DIFFTEST_REG_SIZE);
}
void difftest_setregs(const void *r) {
memcpy(&cpu, r, DIFFTEST_REG_SIZE);
isa_difftest_setregs_hook();
}
void difftest_exec(uint64_t n) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册