CSR 位字段

RISC-V stval CSR 寄存器详解

地址 0x143特权级 S模式访问 读写 / SXLENSupervisor 状态、trap 与中断 CSR

监管者陷阱值寄存器,保存 S 模式陷阱的异常特定信息,或在不提供信息时为 0。

字段映射

按 bit 字段理解 stval

1 个关键字段
SXLEN-1:0

VALUE

WARL

异常特定值。stval 是 WARL,必须能保存所有有效虚拟地址以及 0;若实现返回非法指令位,还必须能保存小于 2^N 的所有值,其中 N 为 SXLEN 和 ILEN 的较小值。

这个字段控制什么

  • - 异常特定值。stval 是 WARL,必须能保存所有有效虚拟地址以及 0;若实现返回非法指令位,还必须能保存小于 2^N 的所有值,其中 N 为 SXLEN 和 ILEN 的较小值。

常见取值

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

官方依据与检索要点

stval 是异常附加信息寄存器,不是每个陷阱都有有意义的值。它是 WARL;为 0 可能表示没有提供信息,也可能是对应异常的有效值。

CSR 表列出 stval 地址 0x143,Supervisor,RW。
断点、地址未对齐、访问错误、页错误和硬件错误可写入出错虚拟地址;非法指令可写入故障指令位;软件检查异常写入原因编码;其他陷阱写 0。
stval 是 WARL;必须能保存所有有效虚拟地址和 0,若支持返回非法指令位还必须能保存对应指令位值。

读这个 CSR 时先看什么

  • - stval 是地址 0x143 的 Supervisor RW CSR;权限不足或未实现的 CSR 访问会触发非法指令异常。
  • - 只有在对应异常定义了附加信息时解释 stval;未定义 stval 信息的其他 trap 写入 0。
  • - 非法指令异常可能写入故障指令的最短有效位,也可能写 0;不要假设所有实现都提供指令位。

写入前的风险检查

  • - stval 是 WARL;写入非地址值或无效地址不保证原样保留。
  • - 写入 stval 不会自行修复异常原因;陷阱处理仍应以 scause 和相关地址转换/访问规则为准。

放回真实流程里理解

1

进入 S 模式陷阱后先读取 scause 判断异常类型。

2

若异常类型定义了 stval 信息,再读取 stval 作为虚拟地址或非法指令位等附加信息。

3

若 stval 为 0,不要仅凭该值排除异常;0 可能表示合法值,也可能表示实现未提供信息。

常见问题

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

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

stval 为 0 一定表示没有错误地址吗?

不一定。规范允许某些异常写 0,且 0 也可能是有效值。必须结合 scause 的异常类型解释 stval。