CSR 位字段

RISC-V vsctrctl CSR 寄存器详解

地址 0x24E特权级 Hypervisor 直接访问 / VS 别名访问访问 HRW(Hypervisor 读写) / 64 位;RV32 显式访问仅覆盖 31:0,且没有 vsctrctlhHypervisor 与虚拟化 CSR

vsctrctl(0x24E)是 H 扩展存在时 VS-mode 的 64 位 CTR 控制 CSR;V=1 时它替代 sctrctl。

字段映射

按 bit 字段理解 vsctrctl

25 个关键字段
0

U

读写

选择记录 VU-mode 中的控制转移;该字段必须实现为可写。

这个字段控制什么

  • - 选择记录 VU-mode 中的控制转移;该字段必须实现为可写。

常见取值

00

不选择 VU-mode 记录。

11

选择 VU-mode 记录。

打开官方手册
1

S

读写

选择记录 VS-mode 中的控制转移;该字段必须实现为可写。

这个字段控制什么

  • - 选择记录 VS-mode 中的控制转移;该字段必须实现为可写。

常见取值

00

不选择 VS-mode 记录。

11

选择 VS-mode 记录。

打开官方手册
6:2

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

当 VS-mode 未选择记录时,允许记录陷入 VS-mode 的外部陷阱;如果实现外部陷阱记录且实现 H 扩展,则必须实现 vsctrctl.STE。

这个字段控制什么

  • - 当 VS-mode 未选择记录时,允许记录陷入 VS-mode 的外部陷阱;如果实现外部陷阱记录且实现 H 扩展,则必须实现 vsctrctl.STE。

常见取值

00

不额外允许记录到 VS-mode 的外部陷阱。

11

允许记录到 VS-mode 的外部陷阱。

打开官方手册
10:9

WPRI

WPRI / 只读 0

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

这个字段控制什么

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

常见取值

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

打开官方手册
11

BPFRZ

读写

断点异常陷入 VS-mode 时置 sctrstatus.FROZEN;该字段必须实现为可写。

这个字段控制什么

  • - 断点异常陷入 VS-mode 时置 sctrstatus.FROZEN;该字段必须实现为可写。

常见取值

00

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

11

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

打开官方手册
12

LCOFIFRZ

实现时读写,否则只读 0

本地计数器溢出中断陷入 VS-mode 时置 sctrstatus.FROZEN;实现 Sscofpmf 时该位必须可写。

这个字段控制什么

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

常见取值

00

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

11

符合条件的 LCOFI 陷阱置 FROZEN。

打开官方手册
32:13

WPRI

WPRI / 只读 0

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

这个字段控制什么

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

常见取值

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

打开官方手册
33

EXCINH

实现时读写,否则只读 0

禁止记录异常。

这个字段控制什么

  • - 禁止记录异常。

常见取值

00

不按此位禁止异常记录。

11

禁止记录异常。

打开官方手册
34

INTRINH

实现时读写,否则只读 0

禁止记录中断。

这个字段控制什么

  • - 禁止记录中断。

常见取值

00

不按此位禁止中断记录。

11

禁止记录中断。

打开官方手册
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

WARL

WARL custom bits;值 0 必须对应标准 CTR 行为。

这个字段控制什么

  • - WARL custom bits;值 0 必须对应标准 CTR 行为。

常见取值

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

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

vsctrctl 是 guest 可见的 CTR 控制副本。V=1 时它替代 sctrctl,使 guest 能配置 VS/VU 记录和过滤;V=0 时这些 guest 配置不影响 host CTR 行为。

地址/访问/宽度:0x24E,HRW,64 位;RV32 不能访问 xctrctl[63:32],没有 vsctrctlh。
S、U 和 BPFRZ 必须可写;其他字段是可选字段,未实现时读为 0;若实现外部陷阱记录且实现 H,则 vsctrctl.STE 必须实现。
mstateen0.CTR 和 hstateen0.CTR 可限制 CTR 状态访问;清零时 VS 访问 supervisor CTR 状态会触发相应异常。
vsctrctl 只控制 guest CTR 配置;CTR entry register 状态本身不因 V=1 拥有另一套副本。

读这个 CSR 时先看什么

  • - vsctrctl 的独立 CSR 地址按官方表属于 HRW;只有 M/HS 可直接访问该独立地址。
  • - 当 V=1 时,guest 读写 sctrctl 会替代到 vsctrctl;VS/VU 直接访问 vsctrctl 独立地址会触发 virtual-instruction exception。
  • - 如果 Smstateen/Ssstateen 相关位清零,mstateen0.CTR 或 hstateen0.CTR 可在访问前先产生 illegal-instruction 或 virtual-instruction exception。

写入前的风险检查

  • - 写 xctrctl 会复位 CTR cycle counter;RV32 软件不能写入 vsctrctl[63:32]。
  • - 可选字段未实现时读为 0;Custom[3:0] 的 0 值必须保持标准行为。
  • - 虚拟化模式转换时,除 enable/xTE/freeze 的特定组合外,过滤字段使用 vsctrctl 的值。

放回真实流程里理解

1

确认 H、Smctr/Ssctr 与 Sscsrind 已实现,并检查 state-enable 门控。

2

在 V=1 guest 中通过 sctrctl alias 配置 VS/VU 记录使能、STE、冻结和过滤字段。

3

通过 vsiselect/vsireg* 或 siselect/sireg* alias 读取 CTR entry;sctrstatus.FROZEN 和深度仍是共享的 supervisor CTR 状态。

常见问题

vsctrctl 与 sctrctl 的关系是什么?

H 扩展实现时,vsctrctl 是 VS-mode 版本的 sctrctl;V=1 时对 sctrctl 的访问替代到 vsctrctl。

RV32 能访问 vsctrctl 高 32 位吗?

不能。规范说明 RV32 不能访问 xctrctl[63:32],且未定义 vsctrctlh 高半 CSR。