CSR 位字段

RISC-V mcause CSR 寄存器详解

地址 0x342特权级 M模式访问 读写 / MXLENMachine 状态、trap 与中断 CSR

机器陷阱原因寄存器,记录触发陷阱的事件类型和原因码。

字段映射

按 bit 字段理解 mcause

2 个关键字段
XLEN-1

Interrupt

读写

陷阱由中断引起时为 1;同步异常时为 0。

这个字段控制什么

  • - 陷阱由中断引起时为 1;同步异常时为 0。

常见取值

00

这是同步异常,低位字段按异常原因码解释。

11

这是中断,低位字段按中断原因码解释。

XLEN-2:0

Exception Code

写合法读合法

标识最近一次异常或中断的原因码。该字段为 WLRL,只保证保存支持的异常码;保留、平台、自定义或扩展相关编码必须按适用官方表解释。

这个字段控制什么

  • - 标识最近一次异常或中断的原因码。该字段为 WLRL,只保证保存支持的异常码;保留、平台、自定义或扩展相关编码必须按适用官方表解释。

常见取值

同步异常
0指令地址未对齐

同步异常原因码 0。

1指令访问错误

同步异常原因码 1。

2非法指令

同步异常原因码 2。

3断点

同步异常原因码 3。

4Load 地址未对齐

同步异常原因码 4。

5Load 访问错误

同步异常原因码 5。

6Store/AMO 地址未对齐

同步异常原因码 6。

7Store/AMO 访问错误

同步异常原因码 7。

8U 模式环境调用

同步异常原因码 8。

9S 模式环境调用

同步异常原因码 9。

11M 模式环境调用

同步异常原因码 11。

12指令页错误

同步异常原因码 12。

13Load 页错误

同步异常原因码 13。

15Store/AMO 页错误

同步异常原因码 15。

16双重陷阱

同步异常原因码 16,由 Smdbltrp 扩展定义。

18软件检查

同步异常原因码 18。

19硬件错误

同步异常原因码 19。

中断
1Supervisor 软件中断

当 Interrupt 位为 1 时,低位原因码 1 表示 Supervisor 软件中断。

3Machine 软件中断

当 Interrupt 位为 1 时,低位原因码 3 表示 Machine 软件中断。

5Supervisor 定时器中断

当 Interrupt 位为 1 时,低位原因码 5 表示 Supervisor 定时器中断。

7Machine 定时器中断

当 Interrupt 位为 1 时,低位原因码 7 表示 Machine 定时器中断。

9Supervisor 外部中断

当 Interrupt 位为 1 时,低位原因码 9 表示 Supervisor 外部中断。

11Machine 外部中断

当 Interrupt 位为 1 时,低位原因码 11 表示 Machine 外部中断。

13计数器溢出中断

当 Interrupt 位为 1 时,低位原因码 13 表示计数器溢出中断。

官方依据与检索要点

mcause 是地址 0x342 的 MXLEN 位 M 模式陷阱原因 CSR。最高位 Interrupt 区分中断和同步异常,低位 Exception Code 是 WLRL,只保证保存实现支持的原因码。

官方 CSR 表列出 mcause 地址 0x342,M 模式读写。
进入 M 模式陷阱时,硬件将导致陷阱的事件编码写入 mcause。
Exception Code 为 WLRL;标准表还保留了部分编码,并将部分中断编码指定为平台使用。

读这个 CSR 时先看什么

  • - mcause 是 MXLEN 位 M 模式读写 CSR,地址 0x342。
  • - 进入 M 模式陷阱时,硬件写入表示陷阱事件的原因码;否则硬件不会写入 mcause。
  • - 先检查最高位 Interrupt,再按低位 Exception Code 和官方原因码表解释。Exception Code 为 WLRL。

写入前的风险检查

  • - 软件可显式写 mcause,但 Exception Code 是 WLRL,只保证保留实现支持的合法原因码。
  • - 不要把保留、平台使用或自定义编码解释成标准异常,除非适用官方扩展或平台规范定义了该编码。

放回真实流程里理解

1

陷阱处理程序读取 mcause。

2

检查 Interrupt 位:1 表示中断原因码,0 表示同步异常原因码。

3

用 Exception Code 查询适用的官方原因码表,并结合 mepc/mtval 等 CSR 完成分派。

常见问题

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

不能只看 CSR 名称判断。官方 CSR 地址表给出最低访问特权级;mcause 位于 0x342,最低访问级为 M 模式。权限不足或访问未实现 CSR 时会触发非法指令异常。

写 mcause 时最容易忽略什么?

写 mcause 时不能假设任意原因码都会被保留。Exception Code 是 WLRL,只保证保存实现支持的合法原因码;读取后也必须按 Interrupt 位和官方原因码表解释。