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 的指令为保留指令;已实现 CSR 的访问异常仍须按适用的特权、虚拟化及具体 CSR 规则判断。 H 扩展下,VU 访问已实现的非高半 Supervisor CSR,若同种读写在 HS 模式允许(按 mstatus.TVM=0 判断),则触发虚拟指令异常;VU 访问已实现的高半 Supervisor CSR 时,只有 XLEN=32 且对应低半 CSR 的同种访问满足该 HS 条件,才适用该虚拟指令异常规则。
  • - 结合地址 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 可能覆盖硬件更新。