CSR 位字段

RISC-V sctrstatus CSR 寄存器详解

地址 0x14F特权级 Supervisor 模式访问 读写 / 32Supervisor AIA、定时器与间接中断 CSR

sctrstatus(0x14F)是 32 位 Supervisor CTR status CSR,保存 CTR 写指针和冻结等状态,并在 CTR active 时由硬件更新。

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

按 bit 字段理解 sctrstatus

4 个关键字段
7:0

WRPTR

WARL / 硬件更新

指示下一次写入的物理 CTR buffer entry;记录新转移后递增,RASEMU=1 时存在返回栈仿真例外。超过当前 depth-1 所需的高位只读 0;depth 改变后值为 unspecified but legal。

这个字段控制什么

  • - 指示下一次写入的物理 CTR buffer entry;记录新转移后递增,RASEMU=1 时存在返回栈仿真例外。超过当前 depth-1 所需的高位只读 0;depth 改变后值为 unspecified but legal。

常见取值

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

打开官方手册
30:8

WPRI

WPRI / 未定义只读 0

未定义 status 位。软件应忽略读取并在写入时保留;除启用自定义扩展定义的状态位外,未定义位必须实现为只读 0。

这个字段控制什么

  • - 未定义 status 位。软件应忽略读取并在写入时保留;除启用自定义扩展定义的状态位外,未定义位必须实现为只读 0。

常见取值

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

打开官方手册
31

FROZEN

读写 / 硬件可置位

置 1 时抑制 transfer recording。软件可写;当 BPFRZ 或 LCOFIFRZ 条件满足时硬件可置位。

这个字段控制什么

  • - 置 1 时抑制 transfer recording。软件可写;当 BPFRZ 或 LCOFIFRZ 条件满足时硬件可置位。

常见取值

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

打开官方手册
63:32

RESERVED

只读 0

RV64 CSR 读写宽度中的上半部;sctrstatus 的 architected 状态只有 31:0,这些高位不承载 sctrstatus 状态并读为 0。

这个字段控制什么

  • - RV64 CSR 读写宽度中的上半部;sctrstatus 的 architected 状态只有 31:0,这些高位不承载 sctrstatus 状态并读为 0。

常见取值

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

打开官方手册
官方依据与检索要点

sctrstatus 是 CTR buffer 的运行状态入口。它会被硬件更新,因此写入时比普通配置 CSR 更容易破坏正在记录的状态。

WRPTR 是 WARL 字段,指示下一次写入的物理 CTR buffer entry,并随记录更新。
FROZEN 位抑制 transfer recording,可由软件写入,也可由符合条件的 breakpoint 或 LCOFI trap 置位。
未定义位为 WPRI;除启用自定义扩展定义的状态位外,未定义位必须只读 0。
逻辑 entry 0 对应 WRPTR 前一个物理 entry;逻辑/物理映射取决于 sctrdepth。

读这个 CSR 时先看什么

  • - 先确认当前 hart 实现 sctrstatus 所属扩展;未实现或权限不足的 CSR 访问会触发非法指令异常。
  • - 结合地址 0x14F、最低访问特权级和官方访问类判断软件是否可以直接访问。
  • - 读取保留、WPRI、WARL 或 WLRL 字段时不要假设固定值,应按官方规范和实现返回值解释。

写入前的风险检查

  • - CTR active 时硬件会更新 sctrstatus;多指令 read-modify-write 可能丢失硬件更新。
  • - 修改 sctrstatus 前通常应确保 CTR inactive,例如 FROZEN=1 或当前特权模式未启用记录。
  • - 恢复 CTR 状态时应先写 sctrstatus,再恢复 CTR entry state。

放回真实流程里理解

1

在读取 CTR entries 前读取 sctrstatus,确定 WRPTR/FROZEN 等 buffer 状态。

2

修改 sctrstatus 前先让 CTR inactive,避免覆盖硬件正在更新的状态。

3

保存恢复 CTR 时先恢复 sctrstatus,再恢复具体 CTR entry state。

常见问题

为什么写 sctrstatus 要先停 CTR?

因为 CTR active 时硬件可能同时更新 WRPTR/FROZEN 等状态,多指令 RMW 可能覆盖硬件更新。