提交 98701fe9 编写于 作者: L LinJiawei

Merge branch 'xs' into xs-fpu

......@@ -14,6 +14,7 @@ void init_isa();
// reg
extern CPU_state cpu;
extern rtlreg_t csr_array[4096];
void isa_reg_display();
word_t isa_reg_str2val(const char *name, bool *success);
......@@ -41,6 +42,8 @@ void isa_difftest_setregs(const void *r);
void isa_difftest_raise_intr(word_t NO);
void isa_difftest_get_mastatus(void *s);
void isa_difftest_set_mastatus(const void *s);
void isa_difftest_get_csr(void *c);
void isa_difftest_set_csr(const void *c);
vaddr_t isa_disambiguate_exec(void *disambiguate_para);
bool isa_difftest_microarchitectural_pf_check(vaddr_t addr);
......
......@@ -12,11 +12,13 @@
#define riscv64_PMEM_BASE 0x80000000
// #define ENABLE_DISAMBIGUATE
// #define FORCE_RAISE_PF
#define FORCE_RAISE_PF
// reg
struct DisambiguationState {
uint64_t exceptionNo;
uint64_t mtval;
uint64_t stval;
};
typedef struct {
......
......@@ -9,6 +9,7 @@ void isa_difftest_setregs_hook(void);
struct SyncState {
uint64_t lrscValid;
uint64_t lrscAddr;
};
#endif
......@@ -63,12 +63,22 @@ void isa_difftest_setregs(const void *r) {
void isa_difftest_get_mastatus(void *s) {
struct SyncState ms;
ms.lrscValid = cpu.lr_valid;
ms.lrscAddr = cpu.lr_addr;
memcpy(s, &ms, sizeof(struct SyncState));
}
void isa_difftest_set_mastatus(const void *s) {
struct SyncState* ms = (struct SyncState*)s;
cpu.lr_valid = ms->lrscValid;
cpu.lr_addr = ms->lrscAddr;
}
void isa_difftest_set_csr(const void *c) {
memcpy(csr_array, c, 4096 * sizeof(rtlreg_t));
}
void isa_difftest_get_csr(void *c) {
memcpy(c, csr_array, 4096 * sizeof(rtlreg_t));
}
void isa_difftest_raise_intr(word_t NO) {
......
......@@ -13,6 +13,17 @@ static inline make_EHelper(lr) {
static inline make_EHelper(sc) {
// should check overlapping instead of equality
// printf("sc: cpu.lr_addr %lx (%lx) addr %lx\n", cpu.lr_addr, cpu.lr_valid, *dsrc1);
// Even if scInvalid, SPF (if raised) also needs to be reported
{
int ret = isa_vaddr_check(*dsrc1, MEM_TYPE_WRITE, s->width);
if (ret == MEM_RET_OK);
// pass
else if (ret == MEM_RET_NEED_TRANSLATE)
if(isa_mmu_translate(*dsrc1, MEM_TYPE_WRITE, s->width) == MEM_RET_FAIL)
return_on_mem_ex();
}
if (cpu.lr_addr == *dsrc1 && cpu.lr_valid) {
rtl_sm(s, dsrc1, 0, dsrc2, s->width);
return_on_mem_ex();
......
......@@ -104,12 +104,14 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
pg_base = (pg_base & ~pg_mask) | (vaddr & pg_mask & ~PGMASK);
}
#if !_SHARE
bool is_write = (type == MEM_TYPE_WRITE);
if (!pte.a || (!pte.d && is_write)) {
pte.a = true;
pte.d |= is_write;
paddr_write(p_pte, pte.val, PTE_SIZE);
}
#endif
return pg_base | MEM_RET_OK;
}
......@@ -119,8 +121,23 @@ int force_raise_pf(vaddr_t vaddr, int type){
if(cpu.need_disambiguate){
if(ifetch && cpu.disambiguation_state.exceptionNo == EX_IPF){
if (cpu.mode == MODE_M) mtval->val = vaddr;
stval->val = vaddr;
if (cpu.mode == MODE_M) {
mtval->val = cpu.disambiguation_state.mtval;
if(vaddr != cpu.disambiguation_state.mtval){
printf("[WRANING] nemu mtval %lx does not match core mtval %lx\n",
vaddr,
cpu.disambiguation_state.mtval
);
}
} else {
stval->val = cpu.disambiguation_state.stval;
if(vaddr != cpu.disambiguation_state.stval){
printf("[WRANING] nemu stval %lx does not match core stval %lx\n",
vaddr,
cpu.disambiguation_state.stval
);
}
}
cpu.mem_exception = EX_IPF;
printf("force raise IPF\n");
return MEM_RET_FAIL;
......
......@@ -60,7 +60,7 @@ rtlreg_t isa_reg_str2val(const char *s, bool *success) {
return 0;
}
static word_t csr_array[4096] = {};
rtlreg_t csr_array[4096] = {};
#define CSRS_DEF(name, addr) \
concat(name, _t)* const name = (void *)&csr_array[addr];
......
......@@ -29,6 +29,14 @@ void difftest_set_mastatus(const void *s){
isa_difftest_set_mastatus(s);
}
void difftest_get_csr(void *c){
isa_difftest_get_csr(c);
}
void difftest_set_csr(const void *c){
isa_difftest_set_csr(c);
}
vaddr_t disambiguate_exec(void *disambiguate_para){
return isa_disambiguate_exec(disambiguate_para);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册