-
Notifications
You must be signed in to change notification settings - Fork 152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
4.3 节 RISC-V 架构的 Difftest (Spike) 问题 #15
Comments
AM的代码里面设置了 |
emm 看来我得回到之前的 commit 看一下。另外 https://github.com/NJU-ProjectN/riscv-isa-sim/blob/4740dedcfd58f1b881d570cca0f8b697e17b8a5f/riscv/mmu.cc#L58-L71 reg_t mode = proc->state.prv;
if (type != FETCH) {
if (!proc->state.debug_mode && get_field(proc->state.mstatus, MSTATUS_MPRV)) {
mode = get_field(proc->state.mstatus, MSTATUS_MPP);
if (get_field(proc->state.mstatus, MSTATUS_MPV) && mode != PRV_M)
virt = true;
}
if (xlate_flags & RISCV_XLATE_VIRT) {
virt = true;
mode = get_field(proc->state.hstatus, HSTATUS_SPVP);
}
}
reg_t paddr = walk(addr, type, mode, virt, hlvx) | (addr & (PGSIZE-1)); 从代码看,即使设置了 MPRV,取指仍然不会做地址转换。 |
在内核中取指是恒等映射, 转换前后的结果一样, Spike那边不做也可以 |
回到了完成 4.4 之前的 commit 看了一下,在
所以情况应该是,在完成 4.4 节的内容之前 U 模式 |
这确实是个问题, 感觉需要在进入 |
因为进入 __am_asm_trap:
csrrw a0, mscratch, a0 // swap a0 and mscratch
li a0, (1 << 17) // MPRV
csrs mstatus, a0
csrrw a0, mscratch, a0 // swap back
// ... 实现 mscratch 寄存器之后看起来可以跑,但是有另一个我自己实现的小问题:我自己实现的 klib 的 printf 系列函数用了 GNU 的嵌套函数扩展,代码大概像这样: static int vprintf_base(int (*put)(char s), const char *fmt, va_list ap) {
// ...
}
void __riscv_flush_icache() {
// nested function support requires this function
// the nemu does not have icache/dcache now
// so just ignore it
}
int putch_i(char ch) {
putch(ch);
return 0;
}
int printf(const char *fmt, ...) {
va_list ap;
va_start(ap, fmt);
int ret = vprintf_base(putch_i, fmt, ap);
va_end(ap);
return ret;
}
int vsprintf(char *out, const char *fmt, va_list ap) {
int put_out(char s) {
*out = s; out++;
return 0;
}
return vprintf_base(put_out, fmt, ap);
} 修改之后发现会在栈上 trap_instruction_access_fault:
我还没有仔细看它的汇编,但是搜索发现这个扩展似乎需要在栈上运行代码 (trampoline),这有可能是我的实现在 difftest 即使一开始就加上 MPRV 也还是会出错的原因。 |
然而在 nemu/tools/spike-diff/repo/riscv/mmu.h 的
decode_vm_info()
函数中,如果目前模式是 M 模式,那么会直接返回全零的vm_info
:https://github.com/NJU-ProjectN/riscv-isa-sim/blob/4740dedcfd58f1b881d570cca0f8b697e17b8a5f/riscv/mmu.h#L496-L499
这导致了 M 模式下作为对照的 Spike 不会去做地址转换:
https://github.com/NJU-ProjectN/riscv-isa-sim/blob/4740dedcfd58f1b881d570cca0f8b697e17b8a5f/riscv/mmu.cc#L384-L390
从而导致 difftest 出错,但是 gitbook 中似乎没有提到这一点。如果 PA 的 NEMU 不打算去实现 S 模式的话,这里的修改恐怕是必须的,可能可以加一个 macro 来弄。
The text was updated successfully, but these errors were encountered: