CSR 位字段

RISC-V sstatus CSR 寄存器详解

地址 0x100特权级 S模式访问 读写 / SXLENSupervisor 状态、trap 与中断 CSR

监管者状态寄存器,mstatus中与S模式相关的字段子集视图。

字段映射

按 bit 字段理解 sstatus

21 个关键字段
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 状态。

33:32

UXL

WARL

RV64 中 U 模式有效 XLEN 编码;SXLEN=32 时该字段不存在。

这个字段控制什么

  • - RV64 中 U 模式有效 XLEN 编码;SXLEN=32 时该字段不存在。

常见取值

132 位

对应有效 XLEN=32。

264 位

对应有效 XLEN=64。

3保留

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

24

SDT

WARL/RO0

Ssdbltrp 引入的 S-mode-disable-trap 位;显式写 1 会清零 SIE,SRET 将其清零。未实现 Ssdbltrp 时为只读零。

这个字段控制什么

  • - Ssdbltrp 引入的 S-mode-disable-trap 位;显式写 1 会清零 SIE,SRET 将其清零。未实现 Ssdbltrp 时为只读零。

常见取值

0允许正常进入 S 模式 trap

实现并启用 Ssdbltrp 时,若进入 S 模式 trap 前 SDT 为 0,硬件将其置 1 并按预期递送 trap。

1检测意外 trap

实现并启用 Ssdbltrp 时,若将要进入 S 模式 trap 时 SDT 已为 1,该 trap 是 unexpected trap,并按规范递送 double-trap exception 到 M 模式。

23

SPELP

读写(Zicfilp)

Zicfilp 增加的 previous expected landing pad 状态;V=0 时访问 mstatus.SPELP,V=1 时访问 vsstatus.SPELP。

这个字段控制什么

  • - Zicfilp 增加的 previous expected landing pad 状态;V=0 时访问 mstatus.SPELP,V=1 时访问 vsstatus.SPELP。

常见取值

0NO_LP_EXPECTED

不期望 landing pad 指令。

1LP_EXPECTED

期望 landing pad 指令。

19

MXR

读写

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

这个字段控制什么

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

常见取值

0关闭

Load 只能从可读页读取;MXR 对未启用分页地址转换时无影响。

1开启

Load 可从可读页或可执行页读取;MXR 对未启用分页地址转换时无影响。

18

SUM

读写/RO0

允许 S 模式访问 U 页;如果 satp.MODE 为只读 0,则 SUM 为只读 0。

这个字段控制什么

  • - 允许 S 模式访问 U 页;如果 satp.MODE 为只读 0,则 SUM 为只读 0。

常见取值

0关闭

S 模式访问 U=1 的页会 fault;SUM 对未启用分页地址转换时无影响。

1开启

S 模式 load/store 可访问 U=1 的页;S 模式仍不能从用户页取指。

16:15

XS

只读/派生

额外用户扩展状态摘要;没有需要新状态的额外用户扩展时为只读零。

这个字段控制什么

  • - 额外用户扩展状态摘要;没有需要新状态的额外用户扩展时为只读零。

常见取值

0Off

所有额外用户扩展状态均为 Off。

1Initial

没有额外扩展状态为 Clean 或 Dirty,且至少一个为 Initial。

2Clean

没有额外扩展状态为 Dirty,且至少一个为 Clean。

3Dirty

至少一个额外扩展状态为 Dirty。

14:13

FS

WARL/可选 RO0

浮点状态。实现 F 扩展时不得为只读零;实现 S 模式但未实现 F 时可选择为只读零,以允许或禁止通过 M 模式不可见 trap 模拟 F。

这个字段控制什么

  • - 浮点状态。实现 F 扩展时不得为只读零;实现 S 模式但未实现 F 时可选择为只读零,以允许或禁止通过 M 模式不可见 trap 模拟 F。

常见取值

0Off

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

1Initial

扩展状态处于初始值。

2Clean

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

3Dirty

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

10:9

VS

WARL/可选 RO0

向量状态。实现 v 寄存器时不得为只读零;实现 S 模式但未实现 v 寄存器时可选择为只读零。

这个字段控制什么

  • - 向量状态。实现 v 寄存器时不得为只读零;实现 S 模式但未实现 v 寄存器时可选择为只读零。

常见取值

0Off

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

1Initial

扩展状态处于初始值。

2Clean

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

3Dirty

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

8

SPP

WARL

进入 S 模式 trap 前的特权级;SRET 后该位被置 0。

这个字段控制什么

  • - 进入 S 模式 trap 前的特权级;SRET 后该位被置 0。

常见取值

0U

陷入 S 模式前的特权级为 User;SRET 返回到 U 模式。

1S

陷入 S 模式前的特权级为 Supervisor;SRET 返回到 S 模式。

6

UBE

WARL/RO-copy

U 模式显式内存访问字节序控制;实现可使其为 S 模式字节序的只读副本。

这个字段控制什么

  • - U 模式显式内存访问字节序控制;实现可使其为 S 模式字节序的只读副本。

常见取值

0小端

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

1大端

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

5

SPIE

读写

进入 S 模式 trap 前的 SIE 值。

这个字段控制什么

  • - 进入 S 模式 trap 前的 SIE 值。

常见取值

00

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

11

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

1

SIE

读写

S 模式全局中断使能;当前在 U 模式运行时该位的值被忽略,supervisor-level 中断视为全局开启。

这个字段控制什么

  • - S 模式全局中断使能;当前在 U 模式运行时该位的值被忽略,supervisor-level 中断视为全局开启。

常见取值

0关闭

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

1开启

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

62:34

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

31:25

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

22:20

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

17

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

12:11

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

7

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

4:2

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

0

WPRI

WPRI

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

这个字段控制什么

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

常见取值

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

官方依据与检索要点

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

sstatus 的地址、最低访问特权级和读写属性按官方 CSR 表核对:0x100,S模式,读写。
先按 Supervisor 状态、trap 与中断 CSR 理解它影响的架构状态,再看页面中的位字段说明。
写入前只修改目标字段并保留未修改位;WPRI/保留字段应按官方规范和实现返回值解释。

汇编操作示例

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

csrr t0, sstatus
在 S 模式下读取 sstatus(受限视图)
csrs sstatus, t0
设置 sstatus 中的使能位(如开启 SIE)
li t0, 0x00000002; csrs sstatus, t0
开启 SIE(bit1)——允许 S 模式中断

与其他 CSR 的关系

sstatus 是 mstatus 中 S 模式相关字段的受限视图——S 模式软件通过 sstatus 操作自身特权级可见字段。S 模式中断是否进入,取决于当前特权级、sstatus.SIE 以及 sip/sie 中对应挂起与使能位;不要把它简化成由 mstatus.MIE 控制。陷阱进入时硬件将 SIE 保存到 SPIE,并清零 SIE;sret 执行时从 SPIE 恢复到 SIE。

关键位字段速查

SIE(bit1) S模式中断使能 | SPIE(bit5) 陷阱前SIE保存值 | SPP(bit8) 陷阱前特权模式(0=U,1=S) | SUM(bit18) 允许S模式访问U模式内存 | MXR(bit19) 使可执行页可读

读这个 CSR 时先看什么

  • - 先确认当前 hart 是否实现 sstatus,未实现或权限不足的访问会触发非法指令异常。
  • - 结合地址 0x100 和最低访问特权级(Supervisor)判断软件是否可以直接读取。
  • - 读取保留位、WPRI 或 WARL 位时不要假设固定值,应按规范和实现返回值解释。

写入前的风险检查

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

放回真实流程里理解

1

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

2

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

3

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

常见问题

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

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

写 sstatus 时最容易忽略什么?

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