From 3bfc165baf07d89c026ed004b2bc4a2da498d268 Mon Sep 17 00:00:00 2001 From: Anzooooo Date: Sun, 26 Jan 2025 00:42:44 +0800 Subject: [PATCH] debug-log --- include/debug.h | 15 ++++++++------- include/memory/paddr.h | 2 ++ src/cpu/cpu-exec.c | 23 +++++++++++++++++++++++ src/cpu/difftest/ref.c | 1 + src/isa/riscv64/system/mmu.c | 25 ++++++++++++++++++++++--- src/memory/paddr.c | 6 ++++-- 6 files changed, 60 insertions(+), 12 deletions(-) diff --git a/include/debug.h b/include/debug.h index febef7c1b..74a8550ce 100644 --- a/include/debug.h +++ b/include/debug.h @@ -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__) diff --git a/include/memory/paddr.h b/include/memory/paddr.h index 8c8eb586a..860ae9998 100644 --- a/include/memory/paddr.h +++ b/include/memory/paddr.h @@ -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 diff --git a/src/cpu/cpu-exec.c b/src/cpu/cpu-exec.c index 971c92836..baf8ebbed 100644 --- a/src/cpu/cpu-exec.c +++ b/src/cpu/cpu-exec.c @@ -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; @@ -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, diff --git a/src/cpu/difftest/ref.c b/src/cpu/difftest/ref.c index ca0967b4c..67cb9c970 100644 --- a/src/cpu/difftest/ref.c +++ b/src/cpu/difftest/ref.c @@ -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 diff --git a/src/isa/riscv64/system/mmu.c b/src/isa/riscv64/system/mmu.c index 6fdf83ea9..89b9b80a5 100644 --- a/src/isa/riscv64/system/mmu.c +++ b/src/isa/riscv64/system/mmu.c @@ -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 @@ -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 @@ -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); diff --git a/src/memory/paddr.c b/src/memory/paddr.c index 706ee3697..1cd0485d2 100644 --- a/src/memory/paddr.c +++ b/src/memory/paddr.c @@ -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 } @@ -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;