CSR 位字段

RISC-V medeleg CSR 寄存器详解

地址 0x302特权级 M模式访问 读写 / 64 位;RV32 通过 medeleg 和 medelegh 访问高/低半部Machine 委托、环境配置与状态使能 CSR

机器异常委托寄存器;在实现 S 模式的 hart 上控制哪些同步异常可从 S/U 模式委托给 S 模式处理。

位作用速览
bit 3 = 只有第 3 位;bits 12..11 = 第 12 到第 11 位
高位 MSB低位 LSB
字段映射

按 bit 字段理解 medeleg

3 个关键字段
63:0

ED

WARL

异常委托位。位 N 对应异常代码 N;可写支持通过写入全 1 后读回发现。

这个字段控制什么

  • - 异常委托位。位 N 对应异常代码 N;可写支持通过写入全 1 后读回发现。

常见取值

0不委托

对应陷阱不由该委托位转给 S 模式;若发生在低于 M 的特权级且没有其他委托路径,则进入 M 模式陷阱处理。

1委托给 S 模式

对应陷阱在 S 模式或 U 模式发生时委托给 S 模式陷阱处理程序;M 模式发生的陷阱不会向下委托。

11

Reserved/RO0

只读零

只读零,因为 M 模式环境调用不可能发生在更低特权级。

这个字段控制什么

  • - 只读零,因为 M 模式环境调用不可能发生在更低特权级。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

16

Double trap

只读零

只读零;double trap 不可委托。

这个字段控制什么

  • - 只读零;double trap 不可委托。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

官方依据与检索要点

medeleg 控制 S/U 模式同步异常是否直接交给 S 模式陷阱处理。它是 64 位寄存器;RV32 的高 32 位通过 medelegh 访问。

实现可只支持部分可委托异常位;写 1 后读回是官方定义的发现方法。
medeleg[11] 和 medeleg[16] 按官方规范读零。
M 模式发生的异常不会因 medeleg 向下委托给 S 模式。

读这个 CSR 时先看什么

  • - 实现 S 模式的 hart 必须有 medeleg;没有 S 模式的 hart 不应有 medeleg。
  • - medeleg 在架构上是 64 位读写寄存器;RV32 上 medelegh 别名访问位 63:32。
  • - 可委托位是实现子集 WARL:写入全 1 再读回,用于发现实际可委托的异常原因。

写入前的风险检查

  • - 不要假设每个异常代码位都可写;不支持或不可委托的位读回为 0。
  • - 委托只适用于来自 S 模式或 U 模式的陷阱;M 模式发生的陷阱不会向下转给 S 模式。

放回真实流程里理解

1

在特权初始化期间写入候选委托位。

2

读回 medeleg 以发现实现支持的委托子集。

3

在启用会把陷阱交给 S 模式的位之前,先配置好 S 模式陷阱状态。

常见问题

medeleg 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;medeleg 当前记录为 M模式,权限不足或未实现时访问会触发非法指令异常。

写 medeleg 时最容易忽略什么?

不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WLRL、WPRI 或保留字段。