CSR 位字段

RISC-V senvcfg CSR 寄存器详解

地址 0x10A特权级 S模式访问 读写 / XLENSupervisor 环境配置与状态使能 CSR

监管者环境配置寄存器,控制 U 模式执行环境中的 FIOM、CBO、pointer masking、Zicfilp 和 Zicfiss 相关开关。

字段映射

按 bit 字段理解 senvcfg

10 个关键字段
63:34

WPRI

WPRI/RV64

RV64 `senvcfg` 高位保留写保留值字段;RV32 格式不包含这些位。

这个字段控制什么

  • - RV64 `senvcfg` 高位保留写保留值字段;RV32 格式不包含这些位。

常见取值

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

33:32

PMM

WARL/RV32 只读零

Ssnpm 定义的 U/VU 模式 pointer masking 模式字段。未实现 Ssnpm 或在 RV32 上该字段为只读零。

这个字段控制什么

  • - Ssnpm 定义的 U/VU 模式 pointer masking 模式字段。未实现 Ssnpm 或在 RV32 上该字段为只读零。

常见取值

00禁用

Pointer masking 禁用,PMLEN=0。

01保留

保留编码;软件不应写入或依赖。

10PMLEN=XLEN-57

启用 pointer masking;RV64 上 PMLEN=7。

11PMLEN=XLEN-48

启用 pointer masking;RV64 上 PMLEN=16。

31:8

WPRI

WPRI

保留写保留值字段。

这个字段控制什么

  • - 保留写保留值字段。

常见取值

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

7

CBZE

RW/可为只读零

Zicboz 定义的 CBO.ZERO 使能。只有 S 模式也启用 CBO.ZERO 且 CBZE=1 时,U/VU 模式执行 CBO.ZERO 才被允许;未实现 Zicboz 时为只读零。

这个字段控制什么

  • - Zicboz 定义的 CBO.ZERO 使能。只有 S 模式也启用 CBO.ZERO 且 CBZE=1 时,U/VU 模式执行 CBO.ZERO 才被允许;未实现 Zicboz 时为只读零。

常见取值

0关闭

U/VU 模式 CBO.ZERO 触发非法指令异常,或该位因未实现 Zicboz 为只读零。

1开启

若 S 模式也启用 CBO.ZERO,则允许 U/VU 模式执行 CBO.ZERO。

6

CBCFE

RW/可为只读零

Zicbom 定义的 CBO.CLEAN/CBO.FLUSH 使能。只有 S 模式也启用这些指令且 CBCFE=1 时,U/VU 模式执行才被允许;未实现 Zicbom 时为只读零。

这个字段控制什么

  • - Zicbom 定义的 CBO.CLEAN/CBO.FLUSH 使能。只有 S 模式也启用这些指令且 CBCFE=1 时,U/VU 模式执行才被允许;未实现 Zicbom 时为只读零。

常见取值

0关闭

U/VU 模式 CBO.CLEAN/CBO.FLUSH 触发非法指令异常,或该位因未实现 Zicbom 为只读零。

1开启

若 S 模式也启用 CBO.CLEAN/CBO.FLUSH,则允许 U/VU 模式执行。

5:4

CBIE

WARL/可为只读零

Zicbom 定义的 CBO.INVAL 使能 WARL 字段;`10b` 保留。未实现 Zicbom 时为只读零。

这个字段控制什么

  • - Zicbom 定义的 CBO.INVAL 使能 WARL 字段;`10b` 保留。未实现 Zicbom 时为只读零。

常见取值

00非法指令

U/VU 模式 CBO.INVAL 触发非法指令异常。

01按 flush 执行

若 S 模式也启用,U/VU 模式 CBO.INVAL 以 CBO.FLUSH 行为执行。

10保留

保留编码;软件不应写入或依赖。

11按 invalidate 执行

若 S 模式也启用并且 S 模式未强制 flush,U/VU 模式 CBO.INVAL 按 invalidate 行为执行。

3

SSE

RW/可为只读零

Zicfiss 定义的 shadow stack enable。SSE=1 时在 U/VU 模式激活 Zicfiss;SSE=0 时 U/VU 模式 Zicfiss 保持不活动。未实现 Zicfiss 时为只读零。

这个字段控制什么

  • - Zicfiss 定义的 shadow stack enable。SSE=1 时在 U/VU 模式激活 Zicfiss;SSE=0 时 U/VU 模式 Zicfiss 保持不活动。未实现 Zicfiss 时为只读零。

常见取值

0关闭

U/VU 模式 Zicfiss 不活动;未实现 Zicfiss 时该位为只读零。

1开启

在 U/VU 模式激活 Zicfiss。

2

LPE

RW/可为只读零

Zicfilp 定义的 landing pad enable。LPE=1 时在 U/VU 模式启用 Zicfilp;LPE=0 时 U/VU 模式不启用 Zicfilp。未实现 Zicfilp 时为只读零。

这个字段控制什么

  • - Zicfilp 定义的 landing pad enable。LPE=1 时在 U/VU 模式启用 Zicfilp;LPE=0 时 U/VU 模式不启用 Zicfilp。未实现 Zicfilp 时为只读零。

常见取值

0关闭

U/VU 模式不启用 Zicfilp;未实现 Zicfilp 时该位为只读零。

1开启

在 U/VU 模式启用 Zicfilp。

1

WPRI

WPRI

保留写保留值字段。

这个字段控制什么

  • - 保留写保留值字段。

常见取值

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

0

FIOM

RW/可为只读零

Fence of I/O implies Memory。FIOM=1 时,U 模式 FENCE 的设备 I/O 排序也隐含主存排序;当 `satp.MODE` 只读为 Bare 时实现可使 FIOM 只读零。

这个字段控制什么

  • - Fence of I/O implies Memory。FIOM=1 时,U 模式 FENCE 的设备 I/O 排序也隐含主存排序;当 `satp.MODE` 只读为 Bare 时实现可使 FIOM 只读零。

常见取值

0关闭

U 模式 FENCE 的 I/O 排序不隐含主存排序。

1开启

U 模式 I/O FENCE 排序也包括主存排序。

官方依据与检索要点

senvcfg 控制 U/VU 模式执行环境。当前官方格式包括 FIOM、LPE、SSE、CBIE、CBCFE、CBZE 和 RV64 PMM,并对未实现扩展定义只读零行为。

官方 Supervisor-Level ISA 将 `senvcfg` 定义为 SXLEN 位读写 CSR。
CBO 字段只在对应 Zicboz/Zicbom 扩展存在并且 S 模式也启用时允许 U/VU 模式执行。
PMM 是 Ssnpm 的 RV64 WARL 字段;未实现 Ssnpm 或 RV32 时为只读零。

读这个 CSR 时先看什么

  • - `senvcfg` 是 SXLEN 位读写 CSR;RV64 图包含 PMM[33:32],RV32 中 PMM 为只读零。
  • - FIOM、CBO、PMM、LPE 和 SSE 字段均有扩展或模式条件;未实现相关扩展时相应字段可能为只读零。

写入前的风险检查

  • - 保留 WPRI 位,不要写入 PMM=01 或 CBIE=10 等保留编码。
  • - 启用 CBO 字段前还要确认相同指令已对 S 模式启用。

放回真实流程里理解

1

确认目标 hart 的相关扩展:Zicboz、Zicbom、Ssnpm、Zicfilp、Zicfiss 以及 `satp` 模式能力。

2

只修改需要的 senvcfg 字段并保留 WPRI 位。

3

读回确认 WARL/只读零字段接受的实际值。

常见问题

senvcfg 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;senvcfg 当前记录为 S模式,权限不足或未实现时访问会触发非法指令异常。

写 senvcfg 时最容易忽略什么?

不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WLRL、WPRI 或保留字段。