Closed czlx-github closed 3 months ago
在开启difftest的情况下,执行如下指令(放在init_difftest()最后)后,NEMU sdb si后会crash(在QEMU时则正常)。
init_difftest()
si
// 模拟让ref执行任意指令 word_t inst = 0x800003b7; // lui t2, 0x80000 ref_difftest_memcpy(PMEM_LEFT, &inst, 4, DIFFTEST_TO_REF); ref_difftest_exec(1); // recover environment ref_difftest_memcpy(RESET_VECTOR, guest_to_host(RESET_VECTOR), img_size, DIFFTEST_TO_REF); ref_difftest_regcpy(&cpu, DIFFTEST_TO_REF);
初步排查后,在sim_t::diff_memcpy()里加上mmu->flush_icache()后会正常。但无法确认是否spike底层实现有问题,还是sim_t::diff_memcpy()代码有问题。
sim_t::diff_memcpy()
mmu->flush_icache()
你说的crash是指difftest报错, 还是NEMU自身崩溃(例如段错误)?
如果是前者, 那这个现象是符合预期的, 更多信息可以参考RISC-V的fence.i指令.
fence.i
是前者。已确认加上fence.i后正确运行,那代码的确没问题(看手册不仔细,排查问题两行泪😂)。
在开启difftest的情况下,执行如下指令(放在
init_difftest()
最后)后,NEMU sdbsi
后会crash(在QEMU时则正常)。初步排查后,在
sim_t::diff_memcpy()
里加上mmu->flush_icache()
后会正常。但无法确认是否spike底层实现有问题,还是sim_t::diff_memcpy()
代码有问题。