gpt4 book ai didi

qemu - RISC-V : Illegal instruction exception when switching to supervisor mode

转载 作者:行者123 更新时间:2023-12-05 01:27:53 26 4
gpt4 key购买 nike

当设置 mstatus.mpp 字段切换到管理员模式时,调用 mret 时出现非法指令异常。我正在使用 riscv64-softmmu 系统在 qemu-system-riscv64 6.1 版中对此进行测试。我最近从 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

如果我将 mstatus.mpp 字段设置为机器模式的 0b11,我可以毫无问题地进入 kernel_main

这是显示异常信息的 QEMU 输出:

riscv_cpu_do_interrupt: hart:0, async:0, cause:0000000000000002, epc:0x000000008000006c, tval:0x0000000000000000, desc=illegal_instruction

mepc指向发生异常的mret指令的地址。我已经通过在 mstatus.mpp 中成功写入和检索值来测试机器是否支持管理员模式。

有什么明显的我遗漏的东西吗?我的代码似乎与我可以在网上找到的几个示例非常相似,例如 https://osblog.stephenmarz.com/ch3.2.html .任何帮助将不胜感激。

最佳答案

问题原来是 RISC-V 的物理内存保护 (PMP)。如果未定义 PMP 规则,QEMU 在执行 MRET 指令时将引发一个非法指令 异常。添加 PMP 条目解决了该问题。

这令人困惑,因为此行为未在 Privileged Architecture 手册的 mret 部分中指定。

关于qemu - RISC-V : Illegal instruction exception when switching to supervisor mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69133848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com