代码之家  ›  专栏  ›  技术社区  ›  ajxs

RISC-V:切换到监控模式时出现非法指令异常

  •  0
  • ajxs  · 技术社区  · 4 年前

    mstatus.mpp 字段切换到主管模式,调用时收到非法指令异常 mret .我正在测试这个 qemu-system-riscv64 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
    

    如果我设定 姆斯塔特斯。mpp 字段到 0b11 kernel_main 没有任何问题。

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

    mepc 指向 mret 姆斯塔特斯。mpp

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

    0 回复  |  直到 4 年前
        1
  •  5
  •   ajxs    4 年前

    问题原来是RISC-V的 (PMP)。QEMU将提出 非法指令 MRET 如果未定义PMP规则,则说明。添加PMP条目解决了该问题。

    这是令人困惑的,因为此行为未在 特权体系结构 手册中关于 mret .

    推荐文章