SD
只读状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
这个字段控制什么
- - 状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
常见取值
FS、VS、XS 中没有字段处于 Dirty 状态。
FS、VS 或 XS 至少有一个字段处于 Dirty 状态。
监管者状态寄存器,mstatus中与S模式相关的字段子集视图。
状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
FS、VS、XS 中没有字段处于 Dirty 状态。
FS、VS 或 XS 至少有一个字段处于 Dirty 状态。
RV64 中 U 模式有效 XLEN 编码;SXLEN=32 时该字段不存在。
对应有效 XLEN=32。
对应有效 XLEN=64。
保留编码;可移植软件不应写入或依赖。
Ssdbltrp 引入的 S-mode-disable-trap 位;显式写 1 会清零 SIE,SRET 将其清零。未实现 Ssdbltrp 时为只读零。
实现并启用 Ssdbltrp 时,若进入 S 模式 trap 前 SDT 为 0,硬件将其置 1 并按预期递送 trap。
实现并启用 Ssdbltrp 时,若将要进入 S 模式 trap 时 SDT 已为 1,该 trap 是 unexpected trap,并按规范递送 double-trap exception 到 M 模式。
Zicfilp 增加的 previous expected landing pad 状态;V=0 时访问 mstatus.SPELP,V=1 时访问 vsstatus.SPELP。
不期望 landing pad 指令。
期望 landing pad 指令。
允许从可执行页读取数据。
Load 只能从可读页读取;MXR 对未启用分页地址转换时无影响。
Load 可从可读页或可执行页读取;MXR 对未启用分页地址转换时无影响。
允许 S 模式访问 U 页;如果 satp.MODE 为只读 0,则 SUM 为只读 0。
S 模式访问 U=1 的页会 fault;SUM 对未启用分页地址转换时无影响。
S 模式 load/store 可访问 U=1 的页;S 模式仍不能从用户页取指。
额外用户扩展状态摘要;没有需要新状态的额外用户扩展时为只读零。
所有额外用户扩展状态均为 Off。
没有额外扩展状态为 Clean 或 Dirty,且至少一个为 Initial。
没有额外扩展状态为 Dirty,且至少一个为 Clean。
至少一个额外扩展状态为 Dirty。
浮点状态。实现 F 扩展时不得为只读零;实现 S 模式但未实现 F 时可选择为只读零,以允许或禁止通过 M 模式不可见 trap 模拟 F。
扩展状态关闭;使用相关扩展状态会触发异常或不可用。
扩展状态处于初始值。
扩展状态与内存中保存的上下文一致。
扩展状态可能已被修改,通常需要在上下文切换时保存。
向量状态。实现 v 寄存器时不得为只读零;实现 S 模式但未实现 v 寄存器时可选择为只读零。
扩展状态关闭;使用相关扩展状态会触发异常或不可用。
扩展状态处于初始值。
扩展状态与内存中保存的上下文一致。
扩展状态可能已被修改,通常需要在上下文切换时保存。
进入 S 模式 trap 前的特权级;SRET 后该位被置 0。
陷入 S 模式前的特权级为 User;SRET 返回到 U 模式。
陷入 S 模式前的特权级为 Supervisor;SRET 返回到 S 模式。
U 模式显式内存访问字节序控制;实现可使其为 S 模式字节序的只读副本。
U 模式显式内存访问按小端解释;指令取指不受该位影响。
U 模式显式内存访问按大端解释;指令取指不受该位影响。
进入 S 模式 trap 前的 SIE 值。
进入 S 模式陷阱前 SIE 为 0,或保存的返回后中断状态为关闭。
进入 S 模式陷阱前 SIE 为 1,SRET 可按规则恢复。
S 模式全局中断使能;当前在 U 模式运行时该位的值被忽略,supervisor-level 中断视为全局开启。
当前在 S 模式运行时,Supervisor 全局中断关闭。
当前在 S 模式运行时,Supervisor 全局中断开启;具体递送还取决于 sie/sip。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
保留位;写入时保留原值,读取值应由软件忽略。
这个字段更适合结合上下文字段解释,不用按固定枚举背诵。
sstatus 是 Supervisor 状态、trap 与中断 CSR 中的 读写 CSR,地址为 0x100。先确认当前特权级和扩展实现情况,再根据位字段判断该 CSR 影响的架构状态。
使用 csrr/csrw/csrs/csrc 指令读写 sstatus,参考 RISC-V Privileged Architecture §2.8
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) 使可执行页可读
初始化或进入相关特权流程时,软件先读取 sstatus 了解当前状态。
根据字段定义只修改目标位,保留其余位的原值。
修改后再次读取或通过后续 trap/中断/上下文切换行为验证配置是否生效。
不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;sstatus 当前记录为 S模式,权限不足或未实现时访问会触发非法指令异常。
不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WPRI 或保留字段。