Skip to content

Commit

Permalink
debug-log
Browse files Browse the repository at this point in the history
  • Loading branch information
Anzooooo committed Jan 28, 2025
1 parent ab8db9b commit 3bfc165
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 12 deletions.
15 changes: 8 additions & 7 deletions include/debug.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,16 @@
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
#endif // CONFIG_SIMPLE_LOG

extern bool debug_flag;
#define Logf(flag, ...) \
do { \
if (flag == dflag_mem && ISDEF(CONFIG_MEMLOG)) Log(__VA_ARGS__); \
if (flag == dflag_translate && ISDEF(CONFIG_TRANSLOG)) Log(__VA_ARGS__); \
if (flag == dflag_trace_inst && ISDEF(CONFIG_TRACE_INST)) Log(__VA_ARGS__); \
if (flag == dflag_trace_inst_dasm && ISDEF(CONFIG_TRACE_INST_DASM)) Log(__VA_ARGS__); \
if (flag == dflag_trace_bb && ISDEF(CONFIG_TRACE_BB)) Log(__VA_ARGS__); \
if (flag == dflag_exit && ISDEF(CONFIG_EXITLOG)) Log(__VA_ARGS__); \
if (flag == dflag_simpoint && ISDEF(CONFIG_SIMPOINT_LOG)) Log(__VA_ARGS__); \
if (debug_flag && flag == dflag_mem ) Log(__VA_ARGS__); \
if (debug_flag && flag == dflag_translate ) Log(__VA_ARGS__); \
if (debug_flag && flag == dflag_trace_inst ) Log(__VA_ARGS__); \
if (debug_flag && flag == dflag_trace_inst_dasm ) Log(__VA_ARGS__); \
if (flag == dflag_trace_bb && ISDEF(CONFIG_TRACE_BB) ) Log(__VA_ARGS__); \
if (flag == dflag_exit && ISDEF(CONFIG_EXITLOG) ) Log(__VA_ARGS__); \
if (flag == dflag_simpoint && ISDEF(CONFIG_SIMPOINT_LOG) ) Log(__VA_ARGS__); \
} while (0)

#define Logm(...) Logf(dflag_mem, __VA_ARGS__)
Expand Down
2 changes: 2 additions & 0 deletions include/memory/paddr.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ bool analysis_memory_isuse(uint64_t page);
extern uint8_t* golden_pmem;

static inline word_t golden_pmem_read(paddr_t addr, int len, int type, int mode, vaddr_t vaddr) {
Logm("[NEMU] paddr read addr:" FMT_PADDR ", len:%d, type:%d, mode:%d, vaddr: 0x%lx\n",
addr, len, type, mode, vaddr);
assert(golden_pmem != NULL);
mode &= ~CROSS_PAGE_LD_FLAG;
#ifdef CONFIG_USE_SPARSEMM
Expand Down
23 changes: 23 additions & 0 deletions src/cpu/cpu-exec.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,23 @@ uint64_t lightqs_restore_reg_snapshot(uint64_t n) {

#endif // CONFIG_LIGHTQS

extern uint8_t* golden_pmem;

static inline word_t debug_golden_pmem_read(paddr_t addr, int len) {
assert(golden_pmem != NULL);

void *p = &golden_pmem[addr - 0x80000000];
switch (len) {
case 1: return *(uint8_t *)p;
case 2: return *(uint16_t *)p;
case 4: return *(uint32_t *)p;
case 8: return *(uint64_t *)p;
default: assert(0);
}
}


bool debug_flag = false;
static void execute(int n) {
static Decode s;
prev_s = &s;
Expand All @@ -657,6 +674,12 @@ static void execute(int n) {
fetch_decode(&s, cpu.pc);
cpu.debug.current_pc = s.pc;
cpu.pc = s.snpc;
if (g_nr_guest_instr > 0x5928785) {
debug_flag = true;
Logm("[NEMU] mem test addr: 0x81919fd0, data: 0x%lx, pc: 0x%lx, instr: 0x%x",
debug_golden_pmem_read(0x81919fd0, 8),
s.pc, s.isa.instr.val);
}
#ifdef CONFIG_SHARE
if (unlikely(dynamic_config.debug_difftest)) {
fprintf(stderr, "(%d) [NEMU] pc = 0x%lx inst %x\n", getpid(), s.pc,
Expand Down
1 change: 1 addition & 0 deletions src/cpu/difftest/ref.c
Original file line number Diff line number Diff line change
Expand Up @@ -341,6 +341,7 @@ void difftest_set_mhartid(int n) {

void difftest_put_gmaddr(uint8_t* ptr) {
golden_pmem = ptr;
printf("[NEMU] golden pmem: %p\n", ptr);
}

#endif
Expand Down
25 changes: 22 additions & 3 deletions src/isa/riscv64/system/mmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -391,19 +391,28 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
if (max_level == 4) {
int64_t vaddr48 = vaddr << (64 - 48);
vaddr48 >>= (64 - 48);
if ((uint64_t)vaddr48 != vaddr) goto bad;
if ((uint64_t)vaddr48 != vaddr) {
Logm("[NEMU] 0");
goto bad;
}

} else if (max_level == 3) {
int64_t vaddr39 = vaddr << (64 - 39);
vaddr39 >>= (64 - 39);
if ((uint64_t)vaddr39 != vaddr) goto bad;
if ((uint64_t)vaddr39 != vaddr) {
Logm("[NEMU] 1");
goto bad;
}
}
for (level = max_level - 1; level >= 0;) {
p_pte = pg_base + VPNi(vaddr, level) * PTE_SIZE;
#ifdef CONFIG_MULTICORE_DIFF
pte.val = golden_pmem_read(p_pte, PTE_SIZE, 0, 0, 0);
Logm("[NEMU]: pte val: 0x%lx", pte.val);
#else
#ifdef CONFIG_RVH
if(virt){
Logm("[NEMU] virt");
p_pte = gpa_stage(p_pte, vaddr, MEM_TYPE_READ, type, false, true);
}
#endif //CONFIG_RVH
Expand All @@ -417,22 +426,29 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
#endif
pg_base = PGBASE((uint64_t)pte.ppn);
if (!pte.v || (!pte.r && pte.w) || pte.pad) {
Logm("[NEMU] 2");
goto bad;
} else if ((ISNDEF(CONFIG_RV_SVPBMT) || !pbmte) && pte.pbmt) {
Logm("[NEMU] 3");
goto bad;
} else if (pte.pbmt == 3) {
Logm("[NEMU] 4");
goto bad;
} else if (ISNDEF(CONFIG_RV_SVNAPOT) && pte.n) {
Logm("[NEMU] 5");
goto bad;
}
if (pte.r || pte.x) { // is leaf
break;
} else { // not leaf
if (pte.a || pte.d || pte.u || pte.pbmt || pte.n) {
Logm("[NEMU] 6");
goto bad;
}
level --;
if (level < 0) { goto bad; }
if (level < 0) {
Logm("[NEMU] 7");
goto bad; }
}
}
#ifdef CONFIG_RVH
Expand All @@ -444,15 +460,18 @@ static paddr_t ptw(vaddr_t vaddr, int type) {
// superpage
word_t pg_mask = ((1ull << VPNiSHFT(level)) - 1);
if ((pg_base & pg_mask) != 0) {
Logm("[NEMU] 8");
// missaligned superpage
goto bad;
} else if (pte.n) {
Logm("[NEMU] 9");
// superpage but napot
goto bad;
}
pg_base = (pg_base & ~pg_mask) | (vaddr & pg_mask & ~PGMASK);
} else if (pte.n) {
if ((pte.ppn & SVNAPOTMASK) != 0b1000) {
Logm("[NEMU] X");
goto bad;
}
word_t pg_mask = ((1ull << SVNAPOTSHFT) - 1);
Expand Down
6 changes: 4 additions & 2 deletions src/memory/paddr.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ void allocate_memory_with_mmap()
assert(0);
}
pmem = (uint8_t*)ret;
#endif
Log("Set pmem start to %p", pmem);
#endif
#endif // CONFIG_USE_MMAP
}

Expand Down Expand Up @@ -211,7 +212,8 @@ bool check_paddr(paddr_t addr, int len, int type, int trap_type, int mode, vaddr
}

word_t paddr_read(paddr_t addr, int len, int type, int trap_type, int mode, vaddr_t vaddr) {

Logm("[NEMU] paddr read addr:" FMT_PADDR ", len:%d, type:%d, mode:%d\n",
addr, len, type, mode);
__attribute__((unused)) int cross_page_load = (mode & CROSS_PAGE_LD_FLAG) != 0;
mode &= ~CROSS_PAGE_LD_FLAG;

Expand Down

0 comments on commit 3bfc165

Please sign in to comment.