6. Processor state

ARMv8-A相关历史文章:

  • 1. Fundamentals of ARMv8-A
  • 2. Execute states
  • 3. Changing Exception Levels
  • 4. Changing Execution state
  • 5. Registers

AArch64没有类似于ARMv7-A的CPSR(Current Program Status Register),在AArch64中对应CPSR的各个字段可以独立提供,这些都统称为PSTATE(Processor State),AArch64中有操作PSTATE中字段的指令。
PSTATE字段的定义有如下:

6. Processor state_第1张图片

PSTATE字段可以通过特殊用途的寄存器来访问,通过 MRS指令读取,通过 MSR指令来写入。
特殊寄存器为:
6. Processor state_第2张图片

比如,访问SPSel:

MRS  X0,  SPSel    //Read SPSel into X0
MSR  SPSel,  X0    //Write X0 to SPSel

异常处理函数,能从使用SP_ELn切换到使用SP_EL0。
SP_EL1可能指向一块内存,其中包含内核保证能用的小片栈区,SP_EL0可能指向一个更大的内核任务栈,但不是不能保证不会溢出,可以通过写入SPSel比特位来进行切换:

MSR  SPSel,  #0    // switch to SP_EL0
MSR  SPSel,  #1    // switch to the SP of the current Exception Level ELn

下边的操作也能对PSTATE中的字段进行处理:


6. Processor state_第3张图片

比如:

MSR  DAIFSet,  #Imm4    // used to set any or all of DAIF to 1
MSR  DAIFClr,  #Imm4    // used to clear any or all of DAIF to 0
MSR  SPSel,  #Imm1       // used to select the stack pointer, between SP_EL0 and SP_ELn

在AArch64,中,在异常中通过执行ERET指令来返回,这个过程会将SPSR_ELn的内容拷贝到PSTATE中。ALU标志、执行状态、Exception Level和Processor branch都会被保存,从ELR_ELn中返回后,将继续执行。
PSTATE{N, Z, C, V}字段可以在EL0被访问,其他的PSTATE字段能被EL1或更高的Exception Level访问。

你可能感兴趣的:(6. Processor state)