第四节 处理器状态
1. 处理器状态
处理器状态主要包括条件标志,异常屏蔽标志、执行状态和权限级等信息。飞腾CPU的当前处理器状态不是单一系统寄存器来描述的,是由若干系统寄存器一起来描述的。
在AArch64模式中,处理器状态PSTATE包括以下域:
- {N, Z, C, V} 条件标志
寄存器NZCV是一个32位寄存器,描述了用于数据处理过程的条件标志,包括第31位的负标志N、第30位的零标志Z、第29位的借位标志C和第28位的溢出标志V。这些条件标志位可以在EL0权限级修改。
mrs x0, nzcv
msr nzcv, x0
- SS 软件单步控制位,包含在监控调试系统控制寄存器MDSCR的第0位SS。
- 调试器首先使能该软件单步控制位
- 调试器对异常链接寄存器elr编程,指向要执行指令,并异常返回eret。
- 处理器执行一条指令,触发一次软件单步异常,然后将控制权交给调试器。
- 调试器返回上面2,循环下一步;或者将该软件单步控制位关闭,退出。
mrs x0, mdscr_el1
msr mdscr_el1, x0
- IL 非法执行状态位,非法返回事件包括
- 非法异常返回
- 从调试状态非法返回
- 在调试状态执行dprs指令
从调试状态返回,处理器状态就会保存在寄存器dspsr_el0中,而不是寄存器spsr_elx。
- {D, A, I, F} 调试掩码位D,中断掩码位A/I/F,软件可以独立修改每一位;寄存器DAIF是一个32位寄存器,设置异常屏蔽标志,包括:
- 调试异常屏蔽位D
- 系统错误屏蔽位A
- 中断IRQ屏蔽位I
- 快速中断FIQ屏蔽位F
如果某个异常掩码位设置为1,对应的异常事件就被飞腾CPU屏蔽。这些异常屏蔽位一般不允许在EL0权限级访问;在高权限级下,MRS/MSR指令用于访问DAIF寄存器。
mrs x0, daif
msr daif, x0
msr daifset, #imm
msr daifclr, #imm
- nRW 当前执行模式,执行模式是指CPU位长模式,即
- AArch64
- AArch32
- EL 当前权限级。CurrentEL寄存器是一个32位只读寄存器,描述了飞腾CPU当前所处的权限级,其中第2、3两位有效:
- 0b00是EL0;
- 0b01是EL1;
- 0b10是EL2;
- 0b11是EL3。
该寄存器不允许在EL0权限级访问,在高权限级下是只读寄存器。
mrs x0, CurrentEL
- SP 堆栈指针寄存器选择位
- 一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
- 为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。
- 飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。
- 如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问;
- 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。
msr SPSel, #imm
- 根据权限级和堆栈寄存器选择,飞腾CPU可以分为
- 权限级为EL0: EL0t(堆栈寄存器为SP_EL0)
- 权限级为EL1:EL1t(堆栈寄存器为SP_EL0)和EL1h(堆栈寄存器为SP_EL1)
- 权限级为EL2:EL2t(堆栈寄存器为SP_EL0)和EL2h(堆栈寄存器为SP_EL2)
- 权限级为EL3:EL3t(堆栈寄存器为SP_EL0)和EL3h(堆栈寄存器为SP_EL3)
2. 堆栈寄存器选择
一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。
- 如果直接访问这四个堆栈寄存器SP_ELx,必须用MRS/MSR指令才能直接访问。直接访问这四个堆栈寄存器有最低权限级要求。
- 另外,也可以通过通用堆栈寄存器SP来访问相应的堆栈寄存器SP_ELx。
- 在权限级EL0下,堆栈寄存器只能是SP_EL0;
- 权限级EL1下,堆栈寄存器可以是SP_EL0或者SP_EL1;
- 权限级EL2和EL3的情况和EL1类似。
因此,飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问; 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。
Linux4.19操作系统内核实现中
- 当飞腾CPU处于EL0权限级时,堆栈寄存器SP是SP_EL0;
- 在EL1权限级时,堆栈寄存器SP是SP_EL1。
3. 处理器状态保存
除了描述当前处理器状态的系统寄存器组,飞腾CPU还提供了保存处理器状态寄存器,专门用于权限级切换的处理器状态保存。
飞腾CPU提供了3个异常链路寄存器ELR_ELx(x=1/2/3),当异常进入ELx权限级时,ELR_ELx就用于保存异常返回地址。
飞腾CPU提供了七个SPSR寄存器,其中包含了三个常规SPSR_ELx(x=1/2/3)寄存器;其他的四个处理器保存寄存器是:
- spsr_abt,异常进入Abort状态,采用该寄存器保存处理器状态
- spsr_fiq,异常进入FIQ状态,采用该寄存器保存处理器状态
- spsr_irq,异常进入IRQ状态,采用该寄存器保存处理器状态
- spsr_und,异常进入未定义状态,采用该寄存器保存处理器状态