CSR 位字段

RISC-V sepc CSR 寄存器详解

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

监管者异常程序计数器,保存进入 S 模式陷阱时的虚拟地址。

字段映射

按 bit 字段理解 sepc

1 个关键字段
SXLEN-1:0

VALUE

WARL

S 模式陷阱返回虚拟地址。sepc 是 WARL,必须能保存所有有效虚拟地址;bit 0 恒为 0。仅支持 IALIGN=32 的实现中,低两位恒为 0;允许 IALIGN 在 16/32 间变化的实现中,IALIGN=32 时 bit 1 读取(含 SRET 隐式读取)被屏蔽为 0,但仍可写。

这个字段控制什么

  • - S 模式陷阱返回虚拟地址。sepc 是 WARL,必须能保存所有有效虚拟地址;bit 0 恒为 0。仅支持 IALIGN=32 的实现中,低两位恒为 0;允许 IALIGN 在 16/32 间变化的实现中,IALIGN=32 时 bit 1 读取(含 SRET 隐式读取)被屏蔽为 0,但仍可写。

常见取值

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

官方依据与检索要点

sepc 保存 S 模式陷阱返回地址。地址字段是 WARL,bit 0 固定为 0;仅支持 IALIGN=32 时低两位恒零,允许 IALIGN 在 16/32 间变化时才有 bit 1 的条件读取屏蔽。

CSR 表列出 sepc 地址 0x141,Supervisor,RW。
sepc 必须能保存所有有效虚拟地址,也可以保存部分无效地址;写入其他无效地址时行为按 WARL 约束。
bit 0 恒为 0;仅支持 IALIGN=32 时低两位恒零。若实现允许 IALIGN 在 16/32 间变化,则 IALIGN=32 时 bit 1 读取为 0(含 SRET),但仍可写。

读这个 CSR 时先看什么

  • - sepc 的最低访问级为 S 模式。访问不存在 CSR 的指令为保留指令,不适用下述虚拟指令例外。权限不足而访问已实现的 CSR 通常触发非法指令异常;H 扩展下,VU 访问已实现且同种读写在 HS 模式允许(按 mstatus.TVM=0 判断)的 supervisor CSR 时,触发虚拟指令异常。
  • - 读取 sepc 得到 S 模式陷阱返回地址。仅支持 IALIGN=32 时低两位恒零;允许 IALIGN 在 16/32 间变化时,IALIGN=32 会在读取(含 SRET)时屏蔽 bit 1。
  • - sepc 是 WARL,软件应按读回值确认实现接受的地址表示。

写入前的风险检查

  • - 写入 sepc 时只依赖规范允许的 WARL 行为;实现可把无效地址转换为其他可表示的无效地址。
  • - bit 0 始终为 0。仅支持 IALIGN=32 时低两位恒为 0;只有允许 IALIGN 在 16/32 间变化的实现,才在 IALIGN=32 时保留可写的 bit 1,并在读取时屏蔽它。

放回真实流程里理解

1

进入 S 模式陷阱后读取 sepc,确定返回或诊断所需的虚拟地址。

2

如果 handler 需要跳过或重试指令,按 WARL 规则写入新的 sepc。

3

执行 SRET 前确认 sepc、sstatus.SPP/SPIE 等返回状态一致。

常见问题

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

sepc 的最低访问级为 S 模式。访问不存在 CSR 的指令为保留指令,不适用下述虚拟指令例外。权限不足而访问已实现的 CSR 通常触发非法指令异常;H 扩展下,VU 访问已实现且同种读写在 HS 模式允许(按 mstatus.TVM=0 判断)的 supervisor CSR 时,触发虚拟指令异常。

写 sepc 时最容易忽略什么?

sepc 是 WARL,写入地址不一定原样保留。bit 0 恒零;仅支持 IALIGN=32 时低两位恒零。只有允许 IALIGN 在 16/32 间变化的实现,才在 IALIGN=32 时保持 bit 1 可写并在读取(含 SRET)时屏蔽它。