NJU-ProjectN / nemu

NJU EMUlator, a full system x86/mips32/riscv32/riscv64 emulator for teaching
Other
900 stars 195 forks source link

spike difftest可能存在bug #104

Closed czlx-github closed 3 months ago

czlx-github commented 3 months ago

在开启difftest的情况下,执行如下指令(放在init_difftest()最后)后,NEMU sdb si后会crash(在QEMU时则正常)。

  // 模拟让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()代码有问题。

sashimi-yzh commented 3 months ago

你说的crash是指difftest报错, 还是NEMU自身崩溃(例如段错误)?

如果是前者, 那这个现象是符合预期的, 更多信息可以参考RISC-V的fence.i指令.

czlx-github commented 3 months ago

是前者。已确认加上fence.i后正确运行,那代码的确没问题(看手册不仔细,排查问题两行泪😂)。