CSR 位字段

RISC-V mnepc CSR 寄存器详解

地址 0x741特权级 M模式访问 MRW(WARL,Smrnmi) / MXLEN保留、自定义或未分类 CSR

Smrnmi 的 M 模式 WARL RNMI 程序计数器;进入 RNMI 处理程序时保存发生中断的指令 PC。

字段映射

按 bit 字段理解 mnepc

1 个关键字段
MXLEN-1:0

VALUE

读写(WARL)

MXLEN 位 RNMI 返回 PC。bit 0 始终为 0;仅支持 IALIGN=32 时 bit 1:0 始终为 0;可切换 IALIGN 的实现中,IALIGN=32 时 bit 1 在读和 MNRET 的隐式读中被屏蔽为 0,但仍可写。写入无效地址前实现可转换为其可容纳的另一无效地址。

这个字段控制什么

  • - MXLEN 位 RNMI 返回 PC。bit 0 始终为 0;仅支持 IALIGN=32 时 bit 1:0 始终为 0;可切换 IALIGN 的实现中,IALIGN=32 时 bit 1 在读和 MNRET 的隐式读中被屏蔽为 0,但仍可写。写入无效地址前实现可转换为其可容纳的另一无效地址。

常见取值

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

官方依据与检索要点

mnepc 是 Smrnmi 的 WARL RNMI 返回 PC;MNRET 用它恢复程序计数器。

第 8.3 节要求它容纳所有有效虚拟地址。
bit 0 始终为 0,bit 1 的读掩码和可写性取决于 IALIGN 实现。

读这个 CSR 时先看什么

  • - mnepc 仅由 Smrnmi 添加,并在 CSR 列表中列为 MRW;其完整寄存器是 WARL。
  • - 进入 RNMI 处理程序时,它保存发生中断的指令 PC;MNRET 隐式读取该值。
  • - 低位行为取决于 IALIGN:可切换 IALIGN 的实现中,IALIGN=32 时 mnepc[1] 读为 0 但仍可写。

写入前的风险检查

  • - mnepc 必须容纳所有有效虚拟地址,但不必容纳所有无效地址;写入前实现可将无效地址转换为其可容纳的另一无效地址。
  • - 不要把 IALIGN=32 时对 bit 1 的读掩码解释为不可写。

放回真实流程里理解

1

确认 hart 实现 Smrnmi。

2

RNMI 入口硬件将发生中断的指令 PC 写入 mnepc。

3

MNRET 隐式读取 mnepc 以恢复 PC。

常见问题

IALIGN=32 时 mnepc[1] 是否不能写?

不一定。在可切换 IALIGN 的实现中,该位在 IALIGN=32 时被读掩码为 0,但仍可写。