CSR 位字段

RISC-V mstatus CSR 寄存器详解

地址 0x300特权级 M模式访问 读写 / MXLENMachine 状态、trap 与中断 CSR

机器模式状态寄存器,包含全局中断使能、特权级栈、扩展状态等控制字段。

字段映射

按 bit 字段理解 mstatus

33 个关键字段
63

SD

只读

状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。

这个字段控制什么

  • - 状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。

常见取值

00

FS、VS、XS 中没有字段处于 Dirty 状态。

11

FS、VS 或 XS 至少有一个字段处于 Dirty 状态。

62:43

WPRI

WPRI

保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

这个字段控制什么

  • - 保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

常见取值

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

42

MDT

WARL/硬件更新

M 模式禁用陷阱位(Smdbltrp);用于控制 M 模式敏感陷阱阶段的意外/双重陷阱行为。显式写 1 会清除 MIE;在 M 模式执行 MRET/SRET 会清零。

这个字段控制什么

  • - M 模式禁用陷阱位(Smdbltrp);用于控制 M 模式敏感陷阱阶段的意外/双重陷阱行为。显式写 1 会清除 MIE;在 M 模式执行 MRET/SRET 会清零。

常见取值

00

未设置机器双重陷阱保护位。

11

机器双重陷阱保护位已设置;后续 M 模式陷阱按 Smdbltrp 规则处理。

41

MPELP

读写/硬件更新(Zicfilp)

Zicfilp 定义的机器先前期望落点状态。陷阱进入 M 模式时保存先前 ELP;MRET 按目标特权级的 LPE 恢复 ELP 后将其清为 NO_LP_EXPECTED。

这个字段控制什么

  • - Zicfilp 定义的机器先前期望落点状态。陷阱进入 M 模式时保存先前 ELP;MRET 按目标特权级的 LPE 恢复 ELP 后将其清为 NO_LP_EXPECTED。

常见取值

00

不期望落点指令。

11

期望落点指令。

40

WPRI

WPRI

保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

这个字段控制什么

  • - 保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

常见取值

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

39

MPV

读写/硬件更新

Hypervisor 扩展定义的机器先前虚拟化模式;记录进入 M 模式陷阱前的 V 状态。未实现 Hypervisor 扩展时该字段不存在。

这个字段控制什么

  • - Hypervisor 扩展定义的机器先前虚拟化模式;记录进入 M 模式陷阱前的 V 状态。未实现 Hypervisor 扩展时该字段不存在。

常见取值

00

陷入 M 模式前未处于虚拟化执行状态。

11

陷入 M 模式前处于虚拟化执行状态。

38

GVA

读写/硬件更新

Hypervisor 扩展定义的客户虚拟地址标志;指示写入 mtval 的地址是否为客户虚拟地址。未实现 Hypervisor 扩展时该字段不存在。

这个字段控制什么

  • - Hypervisor 扩展定义的客户虚拟地址标志;指示写入 mtval 的地址是否为客户虚拟地址。未实现 Hypervisor 扩展时该字段不存在。

常见取值

00

mtval 中的地址不是 guest virtual address。

11

mtval 中的地址是 guest virtual address。

37

MBE

WARL

M 模式大端控制(Machine Big-Endian)。当 MPRV=0 时控制 M 模式的非取指内存访问;指令取指始终小端。SBE 和 UBE 可设为 MBE 的只读副本。

这个字段控制什么

  • - M 模式大端控制(Machine Big-Endian)。当 MPRV=0 时控制 M 模式的非取指内存访问;指令取指始终小端。SBE 和 UBE 可设为 MBE 的只读副本。

常见取值

0小端

MPRV=0 时,M 模式非取指内存访问按小端解释;指令取指始终为小端。

1大端

MPRV=0 时,M 模式非取指内存访问按大端解释;指令取指仍始终为小端。

36

SBE

WARL/只读0/只读副本

S 模式数据访问字节序控制;0 为小端,1 为大端,指令取指仍为小端。

这个字段控制什么

  • - S 模式数据访问字节序控制;0 为小端,1 为大端,指令取指仍为小端。

常见取值

0小端

S 模式显式内存访问按小端解释;指令取指不受该位影响。

1大端

S 模式显式内存访问按大端解释;指令取指不受该位影响。

35:34

SXL

WARL/只读0

RV64 中 S 模式有效 XLEN 编码;未实现 S 模式时为只读 0。

这个字段控制什么

  • - RV64 中 S 模式有效 XLEN 编码;未实现 S 模式时为只读 0。

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

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

33:32

UXL

WARL/只读0

RV64 中 U 模式有效 XLEN 编码;未实现 U 模式时为只读 0。

这个字段控制什么

  • - RV64 中 U 模式有效 XLEN 编码;未实现 U 模式时为只读 0。

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

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

31:25

WPRI

WPRI

保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

这个字段控制什么

  • - 保留的 WPRI 位;软件写入时应保留原值,读取值应忽略。

常见取值

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

24

SDT

WARL/硬件更新/只读0

Ssdbltrp 定义的 S 模式禁用陷阱位。显式写 1 会清除 SIE;陷阱进入 S 模式时若原值为 0 则置 1,若已为 1 则按双重陷阱规则处理;SRET 将其清零。未实现 Ssdbltrp 时为只读 0。

这个字段控制什么

  • - Ssdbltrp 定义的 S 模式禁用陷阱位。显式写 1 会清除 SIE;陷阱进入 S 模式时若原值为 0 则置 1,若已为 1 则按双重陷阱规则处理;SRET 将其清零。未实现 Ssdbltrp 时为只读 0。

常见取值

00

S 模式双重陷阱保护未置位。

11

S 模式双重陷阱保护已置位。

23

SPELP

读写/硬件更新(Zicfilp)

Zicfilp 定义的 S 模式先前期望落点状态。陷阱进入 S/HS 模式时保存先前 ELP;SRET 按目标特权级的 LPE 恢复 ELP 后将其清为 NO_LP_EXPECTED。

这个字段控制什么

  • - Zicfilp 定义的 S 模式先前期望落点状态。陷阱进入 S/HS 模式时保存先前 ELP;SRET 按目标特权级的 LPE 恢复 ELP 后将其清为 NO_LP_EXPECTED。

常见取值

00

不期望落点指令。

11

期望落点指令。

22

TSR

WARL/只读0

为 1 时,S 模式执行 SRET 会陷入 M 模式。

这个字段控制什么

  • - 为 1 时,S 模式执行 SRET 会陷入 M 模式。

常见取值

00

S 模式执行 SRET 不因 TSR 置位而陷入。

11

S 模式执行 SRET 会触发非法指令异常。

21

TW

WARL/只读0

为 1 时,低特权级 WFI 若未在实现定义的有界时限内完成,将触发非法指令异常;实现也可以总是触发该异常。

这个字段控制什么

  • - 为 1 时,低特权级 WFI 若未在实现定义的有界时限内完成,将触发非法指令异常;实现也可以总是触发该异常。

常见取值

00

低特权级 WFI 不因 TW 置位而被强制超时陷入。

11

低特权级 WFI 若未在实现定义的有界时限内完成,将触发非法指令异常。

20

TVM

WARL/只读0

为 1 时,S 模式访问 satp 或执行 SFENCE.VMA/SINVAL.VMA 会触发非法指令异常;未实现 S 模式时为只读 0。

这个字段控制什么

  • - 为 1 时,S 模式访问 satp 或执行 SFENCE.VMA/SINVAL.VMA 会触发非法指令异常;未实现 S 模式时为只读 0。

常见取值

00

S 模式可按通常规则访问 satp 并执行地址转换栅栏。

11

S 模式访问 satp 或执行 SFENCE.VMA/SINVAL.VMA 会陷入。

19

MXR

读写/只读0

允许从可执行页读取数据。

这个字段控制什么

  • - 允许从可执行页读取数据。

常见取值

00

Load 不能仅因为页可执行就读取该页。

11

Load 可从可执行页读取数据。

18

SUM

读写/只读0

允许 S 模式访问 U 页。

这个字段控制什么

  • - 允许 S 模式访问 U 页。

常见取值

00

S 模式不能访问 U=1 的页,除非还有其他架构规则允许。

11

S 模式可访问 U=1 的页,但执行取指仍受规范限制。

17

MPRV

读写/只读0

数据内存访问使用 MPP 指定的有效特权级。

这个字段控制什么

  • - 数据内存访问使用 MPP 指定的有效特权级。

常见取值

00

数据内存访问使用当前特权级。

11

数据内存访问按 MPP 指定的有效特权级执行。

16:15

XS

只读/由扩展状态汇总

额外用户扩展状态。

这个字段控制什么

  • - 额外用户扩展状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

14:13

FS

WARL

浮点状态。

这个字段控制什么

  • - 浮点状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

12:11

MPP

WARL

进入 M 模式 trap 前的特权级。

这个字段控制什么

  • - 进入 M 模式 trap 前的特权级。

常见取值

0U

陷入 M 模式前的特权级为 User。

1S

陷入 M 模式前的特权级为 Supervisor。

2保留

该编码保留;可移植软件不应写入或依赖。

3M

陷入 M 模式前的特权级为 Machine。

10:9

VS

WARL/只读0

向量状态;控制向量指令和向量 CSR 是否可用并跟踪脏状态。

这个字段控制什么

  • - 向量状态;控制向量指令和向量 CSR 是否可用并跟踪脏状态。

常见取值

0Off

对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。

1Initial

扩展状态处于初始值。

2Clean

扩展状态与内存中保存的上下文一致。

3Dirty

扩展状态可能已被修改,通常需要在上下文切换时保存。

8

SPP

WARL/只读0

进入 S 模式 trap 前的特权级。

这个字段控制什么

  • - 进入 S 模式 trap 前的特权级。

常见取值

0U

陷入 S 模式前的特权级为 User。

1S

陷入 S 模式前的特权级为 Supervisor。

7

MPIE

读写

进入 M 模式 trap 前的 MIE 值。

这个字段控制什么

  • - 进入 M 模式 trap 前的 MIE 值。

常见取值

00

进入 M 模式陷阱前 MIE 为 0,或保存的返回后中断状态为关闭。

11

进入 M 模式陷阱前 MIE 为 1,MRET 可按规则恢复。

6

UBE

WARL/只读0/只读副本

U 模式显式加载/存储字节序控制;0=小端,1=大端。未实现 U 模式时为只读 0,也可能是 MBE 或 SBE 的只读副本。

这个字段控制什么

  • - U 模式显式加载/存储字节序控制;0=小端,1=大端。未实现 U 模式时为只读 0,也可能是 MBE 或 SBE 的只读副本。

常见取值

0小端

U 模式显式内存访问按小端解释;指令取指不受该位影响。

1大端

U 模式显式内存访问按大端解释;指令取指不受该位影响。

5

SPIE

读写/只读0

进入 S 模式 trap 前的 SIE 值;未实现 S 模式时为只读 0。

这个字段控制什么

  • - 进入 S 模式 trap 前的 SIE 值;未实现 S 模式时为只读 0。

常见取值

00

进入 S 模式陷阱前 SIE 为 0,或保存的返回后中断状态为关闭。

11

进入 S 模式陷阱前 SIE 为 1,SRET 可按规则恢复。

4

WPRI

保留

保留位,写入保留原值,读取忽略(WPRI)。

这个字段控制什么

  • - 保留位,写入保留原值,读取忽略(WPRI)。

常见取值

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

3

MIE

读写

M 模式全局中断使能。

这个字段控制什么

  • - M 模式全局中断使能。

常见取值

0关闭

当前在 M 模式运行时,Machine 全局中断关闭。

1开启

当前在 M 模式运行时,Machine 全局中断开启;具体递送还取决于 mie/mip 和委托状态。

2

WPRI

保留

保留位(WPRI)。

这个字段控制什么

  • - 保留位(WPRI)。

常见取值

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

1

SIE

读写/只读0

S 模式全局中断使能;未实现 S 模式时为只读 0。

这个字段控制什么

  • - S 模式全局中断使能;未实现 S 模式时为只读 0。

常见取值

0关闭

当前在 S 模式运行时,Supervisor 全局中断关闭。

1开启

当前在 S 模式运行时,Supervisor 全局中断开启;具体递送还取决于 sie/sip 和委托状态。

0

WPRI

保留

保留位,写入保留原值,读取忽略(WPRI)。

这个字段控制什么

  • - 保留位,写入保留原值,读取忽略(WPRI)。

常见取值

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

官方依据与检索要点

mstatus 是 Machine 状态、trap 与中断 CSR 中的 读写 CSR,地址为 0x300。先确认当前特权级和扩展实现情况,再根据位字段判断该 CSR 影响的架构状态。

mstatus 的地址和访问类别按官方 CSR 表核对:0x300,Machine,读写;各字段仍可能是 WARL、只读或由硬件更新。
RV64 与 RV32 的字段位置不同;RV32 的 MBE、SBE、GVA、MPV、MPELP 和 MDT 位于 mstatush。
SPELP/MPELP 由 Zicfilp 定义,SDT 由 Ssdbltrp 定义,MDT 由 Smdbltrp 定义;不要把扩展相关字段当作无条件可写位。

汇编操作示例

使用 csrr/csrw/csrs/csrc 指令读写 mstatus,参考 RISC-V Privileged Architecture §2.8

csrr t0, mstatus
读取完整的 mstatus 值到 t0
csrs mstatus, t0
原子设置 t0 中为 1 的位(用于开启 MIE 等)
csrc mstatus, t0
原子清除 t0 中为 1 的位(用于关闭 MIE)
li t0, 0x00002008; csrs mstatus, t0
开启 MIE(bit3)+设置 FS=Initial(bit13,01)

与其他 CSR 的关系

mstatus 是 M 模式的核心状态寄存器。sstatus 是 mstatus 中与 S 模式相关字段的受限视图,包括 SIE、SPIE、SPP、SUM、MXR 等字段。mstatus.MIE 控制 M 模式全局中断使能;M 模式中断还需要结合 mie/mip 和委托状态判断。FS/VS/XS 字段控制浮点/向量/扩展寄存器的上下文保存策略。

关键位字段速查

MIE(bit3) 全局中断使能 | MPIE(bit7) 陷阱前 MIE 的保存值 | MPP(bits12:11) 陷阱前特权模式(00=U,01=S,11=M) | FS(bits14:13) FPU 状态(00=Off,01=Initial,10=Clean,11=Dirty) | SD(XLEN-1;RV64 bit63,RV32 bit31) 状态脏位汇总(FS/VS/XS 任一为 Dirty 时置 1)

读这个 CSR 时先看什么

  • - mstatus 是地址 0x300 的 M 模式 CSR;低于 M 模式的直接访问会触发非法指令异常。
  • - 先按当前 MXLEN 选择 RV32 或 RV64 字段图;RV32 的若干高位状态字段位于 mstatush。
  • - 读取 WPRI、WARL 或扩展相关字段时,应按官方字段规则和实现返回值解释。

写入前的风险检查

  • - 写入前保留未修改的位,避免把保留位或实现定义位写成非规范值。
  • - 优先使用 CSRRS/CSRRC 做局部置位或清位,避免 CSRRW 覆盖并发更新的状态位。

放回真实流程里理解

1

初始化或进入相关特权流程时,软件先读取 mstatus 了解当前状态。

2

根据字段定义只修改目标位,保留其余位的原值。

3

修改后再次读取或通过后续 trap/中断/上下文切换行为验证配置是否生效。

常见问题

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

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

写 mstatus 时最容易忽略什么?

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