ajx*_*jxs 4 qemu low-level riscv
当设置mstatus.mpp字段切换到主管模式时,我在调用 时遇到非法指令异常mret。qemu-system-riscv64我正在6.1版本的系统中对此进行测试riscv64-softmmu。我最近从 QEMU 5.0 升级到 6.1。在此升级之前,我的代码可以工作。我在变更日志中看不到任何相关内容。我假设我的代码中存在新版本根本无法容忍的问题。
下面是一个程序集片段,显示了正在发生的情况(删除了不相关的启动代码):
.setup_hart:
csrw satp, zero # Disable address translation.
li t0, (1 << 11) # Supervisor mode.
csrw mstatus, t0
csrw mie, zero # Disable interrupts.
la sp, __stack_top # Setup stack pointer.
la t0, asm_trap_vector
csrw mtvec, t0
la t0, kernel_main # Jump to kernel_main on trap return.
csrw mepc, t0
la ra, cpu_halt # If we return from main, halt.
mret
Run Code Online (Sandbox Code Playgroud)
如果我将该mstatus.mpp字段设置为机器模式,我就可以毫无问题地0b11进入。kernel_main
以下是 QEMU 的输出,显示了异常信息:
riscv_cpu_do_interrupt: hart:0, async:0, cause:0000000000000002, epc:0x000000008000006c, tval:0x0000000000000000, desc=illegal_instruction
Run Code Online (Sandbox Code Playgroud)
mepcmret指向发生异常的指令地址。我已经通过成功写入和检索值来测试机器是否支持主管模式mstatus.mpp。
我有什么明显遗漏的东西吗?我的代码看起来与我在网上可以找到的几个示例非常相似,例如https://osblog.stephenmarz.com/ch3.2.html。任何帮助将不胜感激。
事实证明,问题出在 RISC-V 的物理内存保护(PMP) 上。如果没有定义 PMP 规则, QEMU在执行指令时将引发非法指令异常。MRET添加 PMP 条目解决了该问题。
这很令人困惑,因为特权架构手册的有关 的部分中没有指定此行为mret。
| 归档时间: |
|
| 查看次数: |
1813 次 |
| 最近记录: |