Skip to content

Commit

Permalink
Merge branch 'xs' into xs-fpu
Browse files Browse the repository at this point in the history
  • Loading branch information
ljwljwljwljw committed Nov 2, 2020
2 parents b4bf1c0 + c23548d commit 98701fe
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 4 deletions.
3 changes: 3 additions & 0 deletions include/isa.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down
4 changes: 3 additions & 1 deletion include/isa/riscv64.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions src/isa/riscv64/difftest/difftest.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ void isa_difftest_setregs_hook(void);

struct SyncState {
uint64_t lrscValid;
uint64_t lrscAddr;
};

#endif
10 changes: 10 additions & 0 deletions src/isa/riscv64/difftest/ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
11 changes: 11 additions & 0 deletions src/isa/riscv64/exec/amo.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
21 changes: 19 additions & 2 deletions src/isa/riscv64/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/isa/riscv64/reg.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
8 changes: 8 additions & 0 deletions src/monitor/difftest/ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down

0 comments on commit 98701fe

Please sign in to comment.