CSR 位字段

RISC-V menvcfg CSR 寄存器详解

地址 0x30A特权级 M模式访问 读写 / 64 位;RV32 通过 menvcfg 和 menvcfgh 访问高/低半部Machine 委托、环境配置与状态使能 CSR

机器环境配置寄存器;控制低于 M 模式的执行环境特性。

字段映射

按 bit 字段理解 menvcfg

13 个关键字段
63

STCE

读写/只读零

Sstc 的 STimecmp Enable。实现且置 1 时为 S 模式启用 stimecmp;否则低于 M 模式访问会触发非法指令异常。未实现 Sstc 时只读零。

这个字段控制什么

  • - Sstc 的 STimecmp Enable。实现且置 1 时为 S 模式启用 stimecmp;否则低于 M 模式访问会触发非法指令异常。未实现 Sstc 时只读零。

常见取值

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

62

PBMTE

读写/只读零

控制 Svpbmt 是否可用于 S 模式和 G-stage 地址转换;未实现 Svpbmt 时只读零。

这个字段控制什么

  • - 控制 Svpbmt 是否可用于 S 模式和 G-stage 地址转换;未实现 Svpbmt 时只读零。

常见取值

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

61

ADUE

读写/只读零

实现 Svadu 时,控制 S 模式和 G-stage 地址转换的 PTE A/D 位硬件更新;未实现 Svadu 时只读零。

这个字段控制什么

  • - 实现 Svadu 时,控制 S 模式和 G-stage 地址转换的 PTE A/D 位硬件更新;未实现 Svadu 时只读零。

常见取值

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

60

CDE

读写/只读零

Smcdeleg 计数器委托使能。置 1 时启用 Smcdeleg 计数器委托;未实现 Smcdeleg 时只读零。

这个字段控制什么

  • - Smcdeleg 计数器委托使能。置 1 时启用 Smcdeleg 计数器委托;未实现 Smcdeleg 时只读零。

常见取值

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

59

DTE

读写/只读零

Ssdbltrp double-trap-enable 字段。为 0 时,实现表现为未实现 Ssdbltrp;未实现 Ssdbltrp 时该字段只读零。

这个字段控制什么

  • - Ssdbltrp double-trap-enable 字段。为 0 时,实现表现为未实现 Ssdbltrp;未实现 Ssdbltrp 时该字段只读零。

常见取值

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

34:32

PMM

WARL/只读零

Smnpm 为下一个较低特权级提供的指针屏蔽字段。合法值:00 禁用、01 保留、10 PMLEN=XLEN-57、11 PMLEN=XLEN-48;未实现 Smnpm 时只读零,RV32 上只读零。

这个字段控制什么

  • - Smnpm 为下一个较低特权级提供的指针屏蔽字段。合法值:00 禁用、01 保留、10 PMLEN=XLEN-57、11 PMLEN=XLEN-48;未实现 Smnpm 时只读零,RV32 上只读零。

常见取值

00禁用

指针屏蔽禁用,PMLEN=0。

01保留

保留编码;可移植软件不应写入。

10PMLEN=XLEN-57

启用指针屏蔽;RV64 上 PMLEN=7。

11PMLEN=XLEN-48

启用指针屏蔽;RV64 上 PMLEN=16。

7

CBZE

读写/只读零

Zicboz 的 Cache Block Zero 指令使能,作用于低于 M 的特权级;未实现 Zicboz 时只读零。

这个字段控制什么

  • - Zicboz 的 Cache Block Zero 指令使能,作用于低于 M 的特权级;未实现 Zicboz 时只读零。

常见取值

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

6

CBCFE

读写/只读零

Zicbom 的 Cache Block Clean/Flush 指令使能,作用于低于 M 的特权级;未实现 Zicbom 时只读零。

这个字段控制什么

  • - Zicbom 的 Cache Block Clean/Flush 指令使能,作用于低于 M 的特权级;未实现 Zicbom 时只读零。

常见取值

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

5:4

CBIE

WARL/只读零

Zicbom 的 Cache Block Invalidate 指令使能 WARL 字段:00 触发异常,01 按 flush 执行,10 保留,11 按 invalidate 执行(除非较低模式配置为 flush);未实现 Zicbom 时只读零。

这个字段控制什么

  • - Zicbom 的 Cache Block Invalidate 指令使能 WARL 字段:00 触发异常,01 按 flush 执行,10 保留,11 按 invalidate 执行(除非较低模式配置为 flush);未实现 Zicbom 时只读零。

常见取值

00非法指令异常

低于 M 的特权级执行 CBO.INVAL 会触发非法指令异常。

01按 flush 执行

CBO.INVAL 执行并执行 flush 操作。

10保留

保留编码;可移植软件不应写入。

11按 invalidate 执行

CBO.INVAL 执行并执行 invalidate 操作,除非低于 M 的模式配置为 flush。

3

SSE

读写/只读零

Zicfiss shadow stack 使能。置 1 时在 S 模式激活 Zicfiss;清零时低于 M 的 Zicfiss 行为遵循规范的禁用规则;未实现 Zicfiss 时只读零。

这个字段控制什么

  • - Zicfiss shadow stack 使能。置 1 时在 S 模式激活 Zicfiss;清零时低于 M 的 Zicfiss 行为遵循规范的禁用规则;未实现 Zicfiss 时只读零。

常见取值

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

2

LPE

读写/只读零

Zicfilp landing-pad 使能,作用于 S 模式;未实现 S 模式时作用于 U 模式;未实现 Zicfilp 时只读零。

这个字段控制什么

  • - Zicfilp landing-pad 使能,作用于 S 模式;未实现 S 模式时作用于 U 模式;未实现 Zicfilp 时只读零。

常见取值

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

0

FIOM

读写/只读零

Fence of I/O implies Memory。置 1 时,低于 M 的 FENCE I/O 排序和有序 I/O 原子操作也隐含普通内存排序。若无 S 模式或 satp.MODE 恒为 Bare,可为只读零。

这个字段控制什么

  • - Fence of I/O implies Memory。置 1 时,低于 M 的 FENCE I/O 排序和有序 I/O 原子操作也隐含普通内存排序。若无 S 模式或 satp.MODE 恒为 Bare,可为只读零。

常见取值

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

58:35, 31:8, 1

WPRI

WPRI

menvcfg 布局中的保留/WPRI 字段;软件写其他字段时应保留,读取时忽略。

这个字段控制什么

  • - menvcfg 布局中的保留/WPRI 字段;软件写其他字段时应保留,读取时忽略。

常见取值

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

官方依据与检索要点

menvcfg 是 M 模式为较低特权级设置执行环境开关的 64 位 CSR。多数位只有在相应扩展实现时才可写,否则读零。

RV32 使用 menvcfgh 访问 menvcfg 的高 32 位。
PBMTE 和 ADUE 改变后需要按规范执行 SFENCE.VMA 同步地址转换缓存。
CBIE 和 PMM 是 WARL 字段,且各自有保留编码。

读这个 CSR 时先看什么

  • - menvcfg 是 64 位读写 CSR;如果不支持 U 模式,则不应存在。
  • - RV32 上 menvcfgh 别名访问 menvcfg 的位 63:32;RV64 上不存在 menvcfgh。
  • - 许多字段只在定义它们的扩展存在时有效;未实现相应扩展时为只读零。

写入前的风险检查

  • - 修改 PBMTE 或 ADUE 后,应按规范执行 rs1=x0、rs2=x0 的 SFENCE.VMA 以同步地址转换缓存。
  • - 可移植软件不要写入保留的 CBIE=10 或 PMM=01 编码。
  • - 保留 WPRI 字段,并读回 PMM、CBIE 等 WARL 字段确认实现接受的值。

放回真实流程里理解

1

依赖 menvcfg 位之前,先确认定义该字段的扩展是否实现。

2

只设置 OS 或 hypervisor 需要的特定低特权级环境控制。

3

读回 WARL/RO0 字段;对影响地址转换的修改执行必要 fence。

常见问题

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

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

写 menvcfg 时最容易忽略什么?

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