CSR 位字段

RISC-V sctrctl CSR 寄存器详解

地址 0x14E特权级 Supervisor 模式访问 读写 / 64 位;RV32 显式访问仅覆盖 31:0,且没有 sctrctlhSupervisor AIA、定时器与间接中断 CSR

sctrctl(0x14E)是 Supervisor Control Transfer Records control CSR,提供对 64 位 mctrctl 子集的 S 模式访问;RV32 不能访问 xctrctl[63:32]。

字段映射

按 bit 字段理解 sctrctl

27 个关键字段
0

U

读写

在 U 模式选择记录控制转移。该字段通过 sctrctl 可访问且必须实现为可写。

这个字段控制什么

  • - 在 U 模式选择记录控制转移。该字段通过 sctrctl 可访问且必须实现为可写。

常见取值

00

不选择 U 模式记录。

11

选择 U 模式记录。

打开官方手册
1

S

读写

在 S/HS 模式选择记录控制转移。该字段通过 sctrctl 可访问且必须实现为可写。

这个字段控制什么

  • - 在 S/HS 模式选择记录控制转移。该字段通过 sctrctl 可访问且必须实现为可写。

常见取值

00

不选择 S/HS 模式记录。

11

选择 S/HS 模式记录。

打开官方手册
2

M

只读 0

mctrctl.M 不能通过 sctrctl 访问;sctrctl bit 2 固定读为 0。

这个字段控制什么

  • - mctrctl.M 不能通过 sctrctl 访问;sctrctl bit 2 固定读为 0。

常见取值

00

该位固定读为 0;通过 sctrctl 不可访问对应的 mctrctl 字段。

打开官方手册
6:3

WPRI

WPRI / 只读 0

保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

这个字段控制什么

  • - 保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

常见取值

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

打开官方手册
7

RASEMU

实现时读写,否则只读 0

启用返回地址栈(RAS)仿真模式;置 1 时记录调用、弹出函数返回、以返回加调用处理协程交换、禁止其他转移类型,并忽略 47:32 类型过滤位和 xTE。

这个字段控制什么

  • - 启用返回地址栈(RAS)仿真模式;置 1 时记录调用、弹出函数返回、以返回加调用处理协程交换、禁止其他转移类型,并忽略 47:32 类型过滤位和 xTE。

常见取值

00

使用普通 CTR 记录行为。

11

启用 RAS 仿真记录行为,并忽略类型过滤位与外部陷阱使能位。

打开官方手册
8

STE

实现时读写,否则只读 0

当 S=0 时,允许记录陷入 S 模式的外部陷阱。

这个字段控制什么

  • - 当 S=0 时,允许记录陷入 S 模式的外部陷阱。

常见取值

00

不额外允许记录到 S 模式的外部陷阱。

11

允许记录到 S 模式的外部陷阱。

打开官方手册
9

MTE

只读 0

mctrctl.MTE 不能通过 sctrctl 访问;sctrctl bit 9 固定读为 0。

这个字段控制什么

  • - mctrctl.MTE 不能通过 sctrctl 访问;sctrctl bit 9 固定读为 0。

常见取值

00

该位固定读为 0;通过 sctrctl 不可访问对应的 mctrctl 字段。

打开官方手册
10

WPRI

WPRI / 只读 0

保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

这个字段控制什么

  • - 保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

常见取值

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

打开官方手册
11

BPFRZ

读写

断点异常陷入 M 或 S 模式时置 sctrstatus.FROZEN。该字段通过 sctrctl 可访问且必须实现为可写。

这个字段控制什么

  • - 断点异常陷入 M 或 S 模式时置 sctrstatus.FROZEN。该字段通过 sctrctl 可访问且必须实现为可写。

常见取值

00

断点陷阱不触发该自动冻结。

11

符合条件的断点陷阱置 FROZEN。

打开官方手册
12

LCOFIFRZ

实现时读写,否则只读 0

本地计数器溢出中断陷入 M 或 S 模式时置 sctrstatus.FROZEN;实现 Sscofpmf 时该位必须可写。

这个字段控制什么

  • - 本地计数器溢出中断陷入 M 或 S 模式时置 sctrstatus.FROZEN;实现 Sscofpmf 时该位必须可写。

常见取值

00

LCOFI 陷阱不触发该自动冻结。

11

符合条件的 LCOFI 陷阱置 FROZEN。

打开官方手册
32:13

WPRI

WPRI / 只读 0

保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

这个字段控制什么

  • - 保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

常见取值

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

打开官方手册
33

EXCINH

实现时读写,否则只读 0

禁止记录异常,但不影响已通过 xTE 启用的外部陷阱记录。

这个字段控制什么

  • - 禁止记录异常,但不影响已通过 xTE 启用的外部陷阱记录。

常见取值

00

不按此位禁止异常记录。

11

禁止记录异常;已通过 xTE 启用的外部陷阱不受此位影响。

打开官方手册
34

INTRINH

实现时读写,否则只读 0

禁止记录中断,但不影响已通过 xTE 启用的外部陷阱记录。

这个字段控制什么

  • - 禁止记录中断,但不影响已通过 xTE 启用的外部陷阱记录。

常见取值

00

不按此位禁止中断记录。

11

禁止记录中断;已通过 xTE 启用的外部陷阱不受此位影响。

打开官方手册
35

TRETINH

实现时读写,否则只读 0

禁止记录陷阱返回。

这个字段控制什么

  • - 禁止记录陷阱返回。

常见取值

00

不按此位禁止陷阱返回记录。

11

禁止记录陷阱返回。

打开官方手册
36

NTBREN

实现时读写,否则只读 0

启用记录未采用分支;这是使能位而不是 inhibit 位。

这个字段控制什么

  • - 启用记录未采用分支;这是使能位而不是 inhibit 位。

常见取值

00

不记录未采用分支。

11

记录符合条件的未采用分支。

打开官方手册
37

TKBRINH

实现时读写,否则只读 0

禁止记录采用分支。

这个字段控制什么

  • - 禁止记录采用分支。

常见取值

00

不按此位禁止采用分支记录。

11

禁止记录采用分支。

打开官方手册
39:38

WPRI

WPRI / 只读 0

保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

这个字段控制什么

  • - 保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

常见取值

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

打开官方手册
40

INDCALLINH

实现时读写,否则只读 0

禁止记录间接调用。

这个字段控制什么

  • - 禁止记录间接调用。

常见取值

00

不按此位禁止间接调用记录。

11

禁止记录间接调用。

打开官方手册
41

DIRCALLINH

实现时读写,否则只读 0

禁止记录直接调用。

这个字段控制什么

  • - 禁止记录直接调用。

常见取值

00

不按此位禁止直接调用记录。

11

禁止记录直接调用。

打开官方手册
42

INDJMPINH

实现时读写,否则只读 0

禁止记录不带链接的间接跳转。

这个字段控制什么

  • - 禁止记录不带链接的间接跳转。

常见取值

00

不按此位禁止该类跳转记录。

11

禁止记录不带链接的间接跳转。

打开官方手册
43

DIRJMPINH

实现时读写,否则只读 0

禁止记录不带链接的直接跳转。

这个字段控制什么

  • - 禁止记录不带链接的直接跳转。

常见取值

00

不按此位禁止该类跳转记录。

11

禁止记录不带链接的直接跳转。

打开官方手册
44

CORSWAPINH

实现时读写,否则只读 0

禁止记录协程交换。

这个字段控制什么

  • - 禁止记录协程交换。

常见取值

00

不按此位禁止协程交换记录。

11

禁止记录协程交换。

打开官方手册
45

RETINH

实现时读写,否则只读 0

禁止记录函数返回。

这个字段控制什么

  • - 禁止记录函数返回。

常见取值

00

不按此位禁止函数返回记录。

11

禁止记录函数返回。

打开官方手册
46

INDLJMPINH

实现时读写,否则只读 0

禁止记录其他带链接的间接跳转。

这个字段控制什么

  • - 禁止记录其他带链接的间接跳转。

常见取值

00

不按此位禁止该类跳转记录。

11

禁止记录其他带链接的间接跳转。

打开官方手册
47

DIRLJMPINH

实现时读写,否则只读 0

禁止记录其他带链接的直接跳转。

这个字段控制什么

  • - 禁止记录其他带链接的直接跳转。

常见取值

00

不按此位禁止该类跳转记录。

11

禁止记录其他带链接的直接跳转。

打开官方手册
59:48

WPRI

WPRI / 只读 0

保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

这个字段控制什么

  • - 保留位。软件读取时忽略并在写入时保留;未定义实现为只读 0。

常见取值

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

打开官方手册
63:60

Custom[3:0]

WARL;未实现则只读 0

供自定义使用的 WARL 位;值 0 必须对应标准行为。

这个字段控制什么

  • - 供自定义使用的 WARL 位;值 0 必须对应标准行为。

常见取值

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

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

sctrctl 是 64 位 CTR 控制寄存器的 S 模式视图,但不是完整 mctrctl 镜像:M 和 MTE 字段固定只读 0,RV32 也不能显式访问 xctrctl[63:32]。

Smctr/Ssctr 依赖 S-mode 和 Sscsrind,并定义 sctrctl 提供对 mctrctl 子集的 S 模式访问。
bits 2 和 9 为只读 0,因此 M 和 MTE 不可通过 sctrctl 访问。
S、U、BPFRZ 必须实现;其他可访问字段可选,未实现字段只读 0。
Smctr 明确 RV32 不能访问 xctrctl[63:32];未来扩展才可能添加 sctrctlh。

读这个 CSR 时先看什么

  • - 官方 CSR 表把 sctrctl 分配在 0x14E,访问类为 SRW。
  • - sctrctl 提供对 64 位 mctrctl 子集的 S 模式访问;bit 2(M) 和 bit 9(MTE) 固定只读 0。
  • - 寄存器固定为 64 位;RV32 显式访问只覆盖低 32 位,且 Smctr v1.0 没有定义 sctrctlh。
  • - 除 S、U、BPFRZ 必须实现外,其余可访问字段可选;未实现字段只读 0。

写入前的风险检查

  • - sctrctl 的 M 和 MTE 位只读 0;不要通过它配置 Machine-mode CTR enable 或 M-mode trap recording。
  • - 写入时保留所有 WPRI 位;只修改实现且需要更改的字段。
  • - 任何对 xctrctl 的写入都会复位 CTR 周期计数器,因此下一条记录的 ctrdata.CCV 为 0。
  • - RV32 无法显式修改 63:32,不要假定可以配置高半部类型过滤和 Custom 字段。

放回真实流程里理解

1

确认实现 Smctr/Ssctr,并确定需要记录的控制转移类型。

2

通过 sctrctl 配置 S/U 相关记录、过滤和冻结策略;不要试图通过它访问 M、MTE 或 RV32 不可访问的 xctrctl[63:32]。

3

结合 sctrstatus 和 sctrdepth 读取或维护 CTR buffer。

常见问题

sctrctl 是 AIA 中断 CSR 吗?

不是。它属于 Control Transfer Records(Smctr/Ssctr),用于控制控制转移记录。

RV32 能通过 sctrctl 访问全部 64 位控制字段吗?

不能。Smctr 明确 RV32 不能访问 xctrctl[63:32];当前没有 sctrctlh。