CSR 位字段

RISC-V mctrctl CSR 寄存器详解

地址 0x34E特权级 Machine 模式访问 机器模式读写(MRW) / 64 位;RV32 显式访问仅覆盖 31:0,且没有 mctrctlh机器级控制转移记录 CSR

mctrctl(0x34E)是 Smctr v1.0 的 64 位机器级控制 CSR,用于选择记录的特权模式、控制外部陷阱/冻结行为和过滤控制转移类型。

字段映射

按 bit 字段理解 mctrctl

27 个关键字段
0

U

读写

在 U 模式选择记录控制转移。该字段必须实现且可写。

这个字段控制什么

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

常见取值

00

不选择 U 模式记录。

11

选择 U 模式记录。

1

S

读写

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

这个字段控制什么

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

常见取值

00

不选择 S/HS 模式记录。

11

选择 S/HS 模式记录。

2

M

读写

在 M 模式选择记录控制转移。该字段必须实现且可写。

这个字段控制什么

  • - 在 M 模式选择记录控制转移。该字段必须实现且可写。

常见取值

00

不选择 M 模式记录。

11

选择 M 模式记录。

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

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

这个字段控制什么

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

常见取值

00

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

11

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

10

WPRI

WPRI / 只读 0

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

这个字段控制什么

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

常见取值

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

11

BPFRZ

读写

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

这个字段控制什么

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

常见取值

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 必须对应标准行为。

常见取值

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

官方依据与检索要点

mctrctl 是 64 位 CTR 总控制寄存器:低 13 位选择记录模式、RAS、外部陷阱和冻结,高半部主要过滤要记录的控制转移类型;RV32 无法显式访问 63:32。

Smctr v1.0 明确定义 mctrctl 为 64 位读写寄存器。
M、S、U、BPFRZ 必须实现;其他字段可选,未实现字段只读 0。
Custom[3:0] 为 WARL,0 必须表示标准行为;保留段为 WPRI。
写 xctrctl 会复位 CTR 周期计数器,使下一记录 CCV=0。

读这个 CSR 时先看什么

  • - 官方 CSR 表把 mctrctl 分配在 0x34E,访问类为 MRW。
  • - 寄存器固定为 64 位;RV32 显式访问只覆盖低 32 位,且 Smctr v1.0 没有定义 mctrctlh。
  • - 除 M、S、U、BPFRZ 必须实现外,其余字段可选;未实现字段只读 0。

写入前的风险检查

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

放回真实流程里理解

1

确认实现 Smctr、S 模式和 Sscsrind。

2

读取 mctrctl,识别实现字段并保留 WPRI 位。

3

配置 M/S/U、冻结/外部陷阱策略与需要的类型过滤。

4

写入后把下一条记录的 CCV=0 纳入处理。

常见问题

RV32 能配置 mctrctl 的所有字段吗?

不能。RV32 显式访问只到 31:0,Smctr v1.0 没有定义 mctrctlh,因此 63:32 无法由 RV32 软件显式访问。

mctrctl 的所有字段都必须实现吗?

不是。只有 M、S、U、BPFRZ 必须实现;其他字段可选且未实现时只读 0。实现 Sscofpmf 时 LCOFIFRZ 必须可写。