飞腾CPU体系结构(四)

第四节 处理器状态

1. 处理器状态

处理器状态主要包括条件标志,异常屏蔽标志、执行状态和权限级等信息。飞腾CPU的当前处理器状态不是单一系统寄存器来描述的,是由若干系统寄存器一起来描述的。
在AArch64模式中,处理器状态PSTATE包括以下域:

  1. {N, Z, C, V} 条件标志

寄存器NZCV是一个32位寄存器,描述了用于数据处理过程的条件标志,包括第31位的负标志N、第30位的零标志Z、第29位的借位标志C和第28位的溢出标志V。这些条件标志位可以在EL0权限级修改。
mrs x0, nzcv
msr nzcv, x0

  1. SS 软件单步控制位,包含在监控调试系统控制寄存器MDSCR的第0位SS。
  1. 调试器首先使能该软件单步控制位
  2. 调试器对异常链接寄存器elr编程,指向要执行指令,并异常返回eret。
  3. 处理器执行一条指令,触发一次软件单步异常,然后将控制权交给调试器。
  4. 调试器返回上面2,循环下一步;或者将该软件单步控制位关闭,退出。
    mrs x0, mdscr_el1
    msr mdscr_el1, x0
  1. IL 非法执行状态位,非法返回事件包括
  1. 非法异常返回
  2. 从调试状态非法返回
  3. 在调试状态执行dprs指令

从调试状态返回,处理器状态就会保存在寄存器dspsr_el0中,而不是寄存器spsr_elx。

  1. {D, A, I, F} 调试掩码位D,中断掩码位A/I/F,软件可以独立修改每一位;寄存器DAIF是一个32位寄存器,设置异常屏蔽标志,包括:
  1. 调试异常屏蔽位D
  2. 系统错误屏蔽位A
  3. 中断IRQ屏蔽位I
  4. 快速中断FIQ屏蔽位F

如果某个异常掩码位设置为1,对应的异常事件就被飞腾CPU屏蔽。这些异常屏蔽位一般不允许在EL0权限级访问;在高权限级下,MRS/MSR指令用于访问DAIF寄存器。

mrs x0, daif
msr daif, x0
msr daifset, #imm
msr daifclr, #imm

  1. nRW 当前执行模式,执行模式是指CPU位长模式,即
  1. AArch64
  2. AArch32
  1. EL 当前权限级。CurrentEL寄存器是一个32位只读寄存器,描述了飞腾CPU当前所处的权限级,其中第2、3两位有效:
  1. 0b00是EL0;
  2. 0b01是EL1;
  3. 0b10是EL2;
  4. 0b11是EL3。

该寄存器不允许在EL0权限级访问,在高权限级下是只读寄存器。

mrs x0, CurrentEL

  1. SP 堆栈指针寄存器选择位
  1. 一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
  2. 为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。
  3. 飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。
  1. 如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问;
  2. 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。
  3. msr SPSel, #imm
  1. 根据权限级和堆栈寄存器选择,飞腾CPU可以分为
  1. 权限级为EL0: EL0t(堆栈寄存器为SP_EL0)
  2. 权限级为EL1:EL1t(堆栈寄存器为SP_EL0)和EL1h(堆栈寄存器为SP_EL1)
  3. 权限级为EL2:EL2t(堆栈寄存器为SP_EL0)和EL2h(堆栈寄存器为SP_EL2)
  4. 权限级为EL3:EL3t(堆栈寄存器为SP_EL0)和EL3h(堆栈寄存器为SP_EL3)

2. 堆栈寄存器选择

一般说来,CPU会提供一个通用堆栈寄存器SP;因此当权限级切换时,软件需要对堆栈寄存器进行保存或恢复操作。
为了优化这种由权限级切换导致的堆栈寄存器保存恢复操作,飞腾CPU分别为四权限级定义了64位堆栈寄存器SP_ELx(x=0/1/2/3)。

  1. 如果直接访问这四个堆栈寄存器SP_ELx,必须用MRS/MSR指令才能直接访问。直接访问这四个堆栈寄存器有最低权限级要求。
  2. 另外,也可以通过通用堆栈寄存器SP来访问相应的堆栈寄存器SP_ELx。
  1. 在权限级EL0下,堆栈寄存器只能是SP_EL0;
  2. 权限级EL1下,堆栈寄存器可以是SP_EL0或者SP_EL1;
  3. 权限级EL2和EL3的情况和EL1类似。

因此,飞腾CPU提供了堆栈选择寄存器SPSel,用来决定哪一个SP_ELx作为通用堆栈寄存器SP来使用。如果堆栈选择寄存器SPSel的第0位为1,在权限级ELx下对寄存器SP的访问就是对相应的SP_ELx访问; 如果堆栈选择寄存器SPSel的第0位为0,无论哪一个权限级,对堆栈寄存器SP的访问就是对SP_EL0访问。

Linux4.19操作系统内核实现中

  1. 当飞腾CPU处于EL0权限级时,堆栈寄存器SP是SP_EL0;
  2. 在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)寄存器;其他的四个处理器保存寄存器是:

  1. spsr_abt,异常进入Abort状态,采用该寄存器保存处理器状态
  2. spsr_fiq,异常进入FIQ状态,采用该寄存器保存处理器状态
  3. spsr_irq,异常进入IRQ状态,采用该寄存器保存处理器状态
  4. spsr_und,异常进入未定义状态,采用该寄存器保存处理器状态
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值