SD
只读状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
这个字段控制什么
- - 状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
常见取值
FS、VS、XS 中没有字段处于 Dirty 状态。
FS、VS 或 XS 至少有一个字段处于 Dirty 状态。
机器模式状态寄存器,包含全局中断使能、特权级栈、扩展状态等控制字段。
状态脏摘要位;当 FS、VS 或 XS 表示 Dirty 时为 1。RV32 中对应 bit31。
FS、VS、XS 中没有字段处于 Dirty 状态。
FS、VS 或 XS 至少有一个字段处于 Dirty 状态。
机器禁用陷阱位;进入 M 模式陷阱时由硬件置位,MRET 返回时清零,用于控制双重陷阱行为。
未设置机器双重陷阱保护位。
机器双重陷阱保护位已设置;后续 M 模式陷阱按 Smdbltrp 规则处理。
机器先前虚拟化模式;记录进入 M 模式陷阱前是否处于虚拟化执行状态。
陷入 M 模式前未处于虚拟化执行状态。
陷入 M 模式前处于虚拟化执行状态。
客户虚拟地址标志;指示写入 mtval 的地址是否为客户虚拟地址。
mtval 中的地址不是 guest virtual address。
mtval 中的地址是 guest virtual address。
M 模式大端控制(Machine Big-Endian)。0=小端,1=大端。仅控制 M 模式下的显式内存访问。指令取指始终小端。SBE 和 UBE 可设为 MBE 的只读副本。
M 模式显式内存访问按小端解释;指令取指不受该位影响。
M 模式显式内存访问按大端解释;指令取指不受该位影响。
S 模式数据访问字节序控制;0 为小端,1 为大端,指令取指仍为小端。
S 模式显式内存访问按小端解释;指令取指不受该位影响。
S 模式显式内存访问按大端解释;指令取指不受该位影响。
RV64 中 S 模式有效 XLEN 编码。
对应有效 XLEN=32。
对应有效 XLEN=64。
保留编码;可移植软件不应写入或依赖。
RV64 中 U 模式有效 XLEN 编码。
对应有效 XLEN=32。
对应有效 XLEN=64。
保留编码;可移植软件不应写入或依赖。
为 1 时,S 模式执行 SRET 会陷入 M 模式。
S 模式执行 SRET 不因 TSR 置位而陷入。
S 模式执行 SRET 会触发非法指令异常。
为 1 时,低特权级 WFI 可被实现转为非法指令陷入。
低特权级 WFI 不因 TW 置位而被强制超时陷入。
低特权级 WFI 可在未及时完成时触发非法指令异常。
为 1 时,S 模式访问 satp 或执行 SFENCE.VMA 会陷入。
S 模式可按通常规则访问 satp 并执行地址转换栅栏。
S 模式访问 satp 或执行 SFENCE.VMA/SINVAL.VMA 会陷入。
允许从可执行页读取数据。
Load 不能仅因为页可执行就读取该页。
Load 可从可执行页读取数据。
允许 S 模式访问 U 页。
S 模式不能访问 U=1 的页,除非还有其他架构规则允许。
S 模式可访问 U=1 的页,但执行取指仍受规范限制。
数据内存访问使用 MPP 指定的有效特权级。
数据内存访问使用当前特权级。
数据内存访问按 MPP 指定的有效特权级执行。
额外用户扩展状态。
对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。
扩展状态处于初始值。
扩展状态与内存中保存的上下文一致。
扩展状态可能已被修改,通常需要在上下文切换时保存。
浮点状态。
对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。
扩展状态处于初始值。
扩展状态与内存中保存的上下文一致。
扩展状态可能已被修改,通常需要在上下文切换时保存。
进入 M 模式 trap 前的特权级。
陷入 M 模式前的特权级为 User。
陷入 M 模式前的特权级为 Supervisor。
该编码保留;可移植软件不应写入或依赖。
陷入 M 模式前的特权级为 Machine。
向量状态;控制向量指令和向量 CSR 是否可用并跟踪脏状态。
对应扩展状态关闭;使用相关扩展状态会触发异常或不可用。
扩展状态处于初始值。
扩展状态与内存中保存的上下文一致。
扩展状态可能已被修改,通常需要在上下文切换时保存。
进入 S 模式 trap 前的特权级。
陷入 S 模式前的特权级为 User。
陷入 S 模式前的特权级为 Supervisor。
进入 M 模式 trap 前的 MIE 值。
进入 M 模式陷阱前 MIE 为 0,或保存的返回后中断状态为关闭。
进入 M 模式陷阱前 MIE 为 1,MRET 可按规则恢复。
用户模式大小端控制;0=小端,1=大端。
U 模式显式内存访问按小端解释;指令取指不受该位影响。
U 模式显式内存访问按大端解释;指令取指不受该位影响。
进入 S 模式 trap 前的 SIE 值。
进入 S 模式陷阱前 SIE 为 0,或保存的返回后中断状态为关闭。
进入 S 模式陷阱前 SIE 为 1,SRET 可按规则恢复。
M 模式全局中断使能。
当前在 M 模式运行时,Machine 全局中断关闭。
当前在 M 模式运行时,Machine 全局中断开启;具体递送还取决于 mie/mip 和委托状态。
S 模式全局中断使能。
当前在 S 模式运行时,Supervisor 全局中断关闭。
当前在 S 模式运行时,Supervisor 全局中断开启;具体递送还取决于 sie/sip 和委托状态。
mstatus 是 Machine 状态、trap 与中断 CSR 中的 读写 CSR,地址为 0x300。先确认当前特权级和扩展实现情况,再根据位字段判断该 CSR 影响的架构状态。
使用 csrr/csrw/csrs/csrc 指令读写 mstatus,参考 RISC-V Privileged Architecture §2.8
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)
初始化或进入相关特权流程时,软件先读取 mstatus 了解当前状态。
根据字段定义只修改目标位,保留其余位的原值。
修改后再次读取或通过后续 trap/中断/上下文切换行为验证配置是否生效。
不能只看 CSR 名称判断。官方 CSR 地址编码和表格给出最低访问特权级;mstatus 当前记录为 M模式,权限不足或未实现时访问会触发非法指令异常。
不要把整个 CSR 当普通整数覆盖。应只修改目标字段,保留未修改位,并按规范处理 WARL、WLRL、WPRI 或保留字段。