aarch64 当前运行状态和状态保存-pstate 寄存器组和SPSR寄存器
参考:Arm Architecture Reference Manual for A-profile architecture C5.2 Special-purpose registers
当前运行状态
PSTATE不是一个寄存器,它表示的是保存当前 process 状态信息的一组寄存器或者一些标志位信息的统称
aarch64 状态下,PSTATE 里面包含的 信息包括下面 字段。
type ProcState is ( bits (1) N, // Negative condition flag bits (1) Z, // Zero condition flag bits (1) C, // Carry condition flag bits (1) V, // Overflow condition flag bits (1) D, // Debug mask bit [AArch64 only] bits (1) A, // SError interrupt mask bit bits (1) I, // IRQ mask bit bits (1) F, // FIQ mask bit bits (1) PAN, // Privileged Access Never Bit [v8.1] bits (1) UAO, // User Access Override [v8.2] bits (1) DIT, // Data Independent Timing [v8.4] bits (1) TCO, // Tag Check Override [v8.5, AArch64 only] bits (2) BTYPE, // Branch Type [v8.5] bits (1) ZA, // Accumulation array enabled [SME] bits (1) SM, // Streaming SVE mode enabled [SME] bits (1) ALLINT, // Interrupt mask bit bits (1) SS, // Software step bit bits (1) IL, // Illegal Execution state bit bits (2) EL, // Exception level bits (1) nRW, // not Register Width: 0=64, 1=32 bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only] bits (1) SSBS, // Speculative Store Bypass Safe )
有些字段可以通过 特殊寄存器 读写
NZCV
DAIF
CurrentEL
spsel
PAN
UAO
DIT
ALLINT
SSBS
下面这些字段 可以使用 MSR 指令直接 写入
PSTATE.{D, A, I, F, SP, PAN, UAO, SSBS, TCO}
下面这些字段,可以在 EL0 级别访问
PSTATE.{N, Z, C, V, SSBS, DIT, TCO}.
如果 SCTLR_EL1.UMA 为 0, 这些也可以在 EL 0 访问: PSTATE.{D, A, I, F}
异常发生时的状态保存
SPSR_EL1 SPSR_EL2 SPSR_EL3
SPSR_EL1 Holds the saved process state when an exception is taken to EL1
异常目标等级
SPSR_EL1 寄存器 保存 异常切换目标等级为 EL1 的 ,程序切换前的状态。
相应的,SPSR_EL2 SPSR_EL3 保存,异常切换目标等级位 EL2 EL3 的,程序切换前的状态。
异常发生前程序运行状态
在异常发生前,程序可能在 32 位模式 或者 64 位模式。 通过 SPSR_EL1 的 bit[4] 来确定, bit[4] == 1, 则异常发生前,程序是 32 位模式, bit[4]==0,则异常发生前,程序是 64位模式。
根据 bit[4] 为 0 或 1 的不同, SPSR_EL1 的其他 字段也有差异。
当 bit[4] == 0 时,之前的模式为 64 位模式,SPSR_EL1 包含字段
当 bit[4] == 1 时,之前模式位 32 位模式, SPSR_EL1 包含字段
SPSR_EL2 和 SPSR_EL3 也相同的逻辑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了