ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常

1.前言

本文介绍异常相关内容,包括异常类型,异常进入,异常返回,异常层次结构,异常的路由等

2.  RESET

  • ARMV8体系结构支持两种类型的RESET

Cold reset:Reset PE所有的逻辑,包括集成的debug功能

Warm reset:Reset PE所有的逻辑,不包括集成的debug功能

注:ARMV8也支持外部debug reset

  • Reset时pe进入最高的异常级别
  • 运行状态

(1)Reset后最高异常级别可以选用任何一种运行状态

(2)cold reset由输入信号配置,warm reset由RMR_ELx.AA64配置

(3)如果reset后最高异常级别选用A64,则

a).选用SP_ELx

b).Reset向量的执行地址由厂商定义,RVBAR持有向量地址

3. 异常处理

3.1 AArch64 state异常处理流程


流程


说明


1、保存PSTATE 数据到SPSR_ELx,(x = 1,2,3)


异常返回时需要从SPSR_ELx中恢复PSTATE


2、保存异常进入地址到ELR_ELx,同步异常(und/abt等)是当前地址,而异步异常(irq/fiq等)是下一条指令地址


64位架构LR和ELR是独立分开的,这点和32位架构有所差别


3、保存异常原因信息到ESR_ELx


ESR_ELx.EC代表Exception Class,关注这个bit


4、PE根据目标EL的异常向量表中定义的异常地址强制跳转到异常处理程序


跳转到哪个EL使用哪个向量偏移地址又路由关系决定


5、堆栈指针SP的使用由目标EL决定


(SPSR_ELx.M[0] == 1) ? h(ELx): t(EL0)

3.2 AArch32 state异常处理流程


流程


说明


1、PE根据异常类型跳转到对应的异常模式x,

x = {und/svc/abt/irq/fiq/hyp/mon}


PE跳转到哪一种模式通常由路由关系决定


2、保存异常返回地址到LR_x,用于异常返回用


LR也是对应模式的R[14]_x寄存器,32位系统下LR和ELR是同一个寄存器,而64位是独立的


3、备份PSTATE 数据到SPSR_x


异常返回时需要从SPSR_x恢复PSTATE


4、PSTATE 操作:

PSTATE.M[4:0]设置为异常模式x

PSTATE.{A,I,F} = 1

PSTATE.T = 1,强制进入A32模式

PSTATE.IT[7:2] = “00000”


PSTATE.M[4]只是对32位系统有效,64为下是保留的,因为64位下没有各种mode的概念.

异常处理都要切换到ARM下进行;

进入异常时需要暂时关闭A,I,F中断;


5、据异常模式x的向量偏移跳转到进入异常处理


各个mode有对应的Vector base addr + offset

3.3 AArch64异常向量表偏移量


exception level迁移情况


Synchronous exception的offset值


IRQ和vIRQ exception的offset值


FIQ和vFIQ exception的offset值


SError和vSError exception的offset值


同级exception level迁移,使用SP_EL0。例如EL1迁移到EL1


0x000


0x080


0x100


0x180


同级exception level迁移,使用SP_ELx。例如EL1迁移到EL1


0x200


0x280


0x300


0x380


ELx迁移到ELy,其中y>x并且ELx处于AArch64状态


0x400


0x480


0x500


0x580


ELx迁移到ELy,其中y>x并且ELx处于AArch32状态


0x600


0x680


0x700


0x780


注:每个异常等级都有一个关联的 Vector Base Address Register (VBAR),它定义了每个异常等级向量表的基址

.

4.  异常返回

如下为AArch64 ERET异常返回流程:


1. 用ELR_ELx恢复PC值


2. SPSR_ELx恢复PSTATE值


注:ERET指令同时会为执行ERET指令的PE设置event register,reset local monitor

5.异常层级控制

表 异常层级的控制

5.1 EL3异常层级系统寄存器控制


SCR_EL3


SCTLR_EL3


MDCR_EL3


 


NS:决定了EL1和EL0的安全状态;


{A, SA}:使能对齐检查,A-EL3访问数据时做对齐检查;SA-EL3对SP做对齐检查;


{EPMAD, EDAD}:

使能外部debugger访问;


RW:决定了低一级的异常等级运行状态;


{M, C, I, WXN}:

内存系统控制位;


{SPME, SDD, SPD32}:

安全debug控制;


{EA, FIQ, IRQ}:EA-SError和同步Aborts切换到EL3;FIQ-物理FIQ切换到EL3;IRQ-物理IRQ切换到EL3;


EE:定义了端;


{TDOSA, TDA, TPM}:

陷阱控制


SMD:禁用SMC;


HCE:使能Hypervisor call异常;


ST:使能secure EL1访问secure timer;


SIF:安装指令获取,当secure state禁止从non secuer内存取指;


TWI:陷入WFI;


TWE:陷入WFE

5.2 EL2异常层级系统寄存器控制


HCR_EL2


SCTLR_EL2


MDCR_EL2


HSTR_EL2


RW:决定了低一级的异常等级运行状态;


{A, SA}:

使能对齐检查


{TDRA, TDOSA, TDA}:


Tn, for values of n in the set {0-3, 5-13, 15}:


{AMO, IMO, FMO}:路由物理中断到EL2


{M, C, I, WXN}:

内存系统控制位;


TDE:路由从非安全EL0 EL1 EL2来的debug异常


{VSE, VI, VF}:设置虚拟中断pending;


EE:定义了端;


{TPM, TPMCR}:陷阱控制;


VM:


HPMN:


{SWIO, PTW, FB, BSU, DC, CD, ID}:


HCD Hypervisor Call Disable


{TRVM, TDZ, TVM, TTLB, TPU, TPC, TSW, TACR, TIDCP, TSC, TID1, TID2, TID3, TWE, TWI}:


TGE: Trap General Exceptions

5.3 EL1异常层级系统寄存器控制

  TLR_EL1 MDSCR_EL1  
 
{A, SA}:

使能对齐检查

{MDE, SS}  
 

{M, C, I, WXN}:

内存系统控制位;

KDE:

 
 
EE:定义了端;

E0E:EL0端;

UMA:非特权mask访问

TDCC:  
  {SED, ITD, CP15BEN}:    

6. 同步异常类型、路由和优先级

6.1 同步异常类型

异常类型


描述


Undefined Instruction


未定义指令异常


Illegal Execution State


非法执行状态异常


System Call


系统调用指令异常(SVC/HVC/SMC)


Misaligned PC/SP


PC/SP未对齐异常


Instruction Abort


指令终止异常


Data Abort


数据终止异常


Debug exception


软件断点指令/断点/观察点/向量捕获/软件单步 等Debug异常

6.2 同步异常路由

如果HCR_EL2.TGE为1,None-secure EL0下的异常不会传递给None-secure EL1,而是直接传递给EL2

6.3   AArch64同步异常优先级


优先级


说明


1


单步异常


2


PC对齐错误异常


3


指令终止异常


4


断点异常或向量捕获异常??


5


非法执行状态异常


6


HSTR_EL2.Tn和HCR_EL2.TIDCP设置使得异常从EL1传递给EL2


7


指令未定义异常


8


除1-7外,通过设置HCR_EL2.TGE 为1,使得异常从EL1传递到EL2


9


设置HSTR_EL2.Tn和HCR_EL2.TIDCP使得异常从EL0传递到EL2


10


配置CPTR_EL2使得异常传递给EL2


11


通过配置HCR_EL2, other than the TIDCP bit  或 CNTHCTL_EL2 或MDCR_EL2使得异常传递给EL2


12


除1-11外,通过配置其它一些寄存器使得异常传递给EL2


13


SCR_EL3.SMD设为1,导致SMC指令未定义产生的异常


14


执行了异常产生指令而产生的异常


15


配置CPTR_EL3使得异常传递给EL3


16


AArch32 Secure EL1 trap到EL3指令的执行使得异常传递给EL3


17


配置MDCR_EL3使得EL0 EL1 EL2的异常都传递给EL3


18


除1-17外,通过配置其它一些寄存器使得异常传递给EL3


19


Trapped 浮点异常


20


SP对齐异常


21


数据终止异常,不是translation table walk产生的同步外部终止异常除外


22


Watchpoint异常


23


数据终止异常,由translation table walk产生的同步外部终止异常


EL1异常层级系统寄存器控制


 


SCTLR_EL1


MDSCR_EL1


 


{A, SA}:

使能对齐检查


{MDE, SS}:


{M, C, I, WXN}:

内存系统控制位;


KDE:


EE:定义了端;

E0E:EL0端;

UMA:非特权mask访问


TDCC:


{SED, ITD, CP15BEN}:


 

时间: 2024-10-05 06:05:19

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(3)- 异常的相关文章

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(4)- 其它

1. 前言 2.可配置的指令使能/禁用控制和trap控制 指令使能/禁用 当指令被禁用,则这条指令就会变成未定义 指令Trap控制 控制某条或某些指令在运行时进入陷阱,进入陷阱的指令会产生trap异常,路由规则如下: (1)当前为EL1,则陷阱异常传递给EL1(HCR_EL2.TGE定义为1时,会路由到EL2); (2)当前为EL2,则陷阱异常传递给EL2; (3)当前为EL3,则陷阱异常传递给EL3; 3. 系统调用 SVC 默认情况下SVC产生supervisor call,同步异常目标级别

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(5)- Self-hosted debug

1. 前言 2. 关于self-hosted debug Debugger调试器 是操作系统或系统软件的一部分,它会处理debug exception或修改debug system register,debugger运行在EL0,提供了用户debugger接口; Debugger异常 Debugger异常是在程序正常运行过程中由debugger编程PE来产生,满足如下两个条件,PE可以产生某个特定的异常: (1)当前的异常级别和安全状态下使能了debug异常: (2)Debugger使能了某个特

ARMV8 datasheet学习笔记5:异常模型

1.前言 2.异常类型描述 见 ARMV8 datasheet学习笔记4:AArch64系统级体系结构之编程模型(1)-EL/ET/ST 一文 3. 异常处理路由对比 AArch32.AArch64架构下IRQ 和Data Abort 异常处理流程图对比. 3.1 IRQ 路由 3.1.1.   AArch32 IRQ 路由 图 AArch32 IRQ 路由 3.1.2.    AArch64 IRQ 路由 图 AArch64 IRQ路由 图 AArch64 IRQ向量查找 3.2.     D

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之系统级存储模型

1.前言 关于存储系统体系架构,可以概述如下: 存储系统体系结构的形式 VMSA 存储属性   2. 存储系统体系结构 2.1.    地址空间 指令地址空间溢出 指令地址计算((address_of_current_instruction) + (size_of_executed_instruction))超过0xFFFF FFFF FFFF FFFF,PC变成不可知 2.2    Cache支持 Caches的一般行为 (1)Cache中已解锁的项不会一直驻留在cache; (2)Cache

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之Generic timer

1.前言 2.generate timer 2.1 概述 提供了一个系统计数器,用来实时测量流逝的时间: 提供了一个虚拟计数器,用来测量某个虚拟机上流逝的虚拟时间: 定时器,每隔一段时间会触发事件,支持正向计时和倒计时: 通用timer实现必须包含一个内存映射的系统组件:提供system counter; 2.2 完整的generic timer组件 System counter Generic timer的PE实现 (1)一个物理的counter,它访问system counter的计数值:

ARMV8 datasheet学习笔记4:AArch64系统级体系结构之VMSA

1. 前言 2. VMSA概述 2.1 ARMv8 VMSA naming VMSAv8 整个转换机中,地址转换有一个或两个stage VMSAv8-32 由运行AArch32的异常级别来管理 VMSAv8-64 由运行AArch64的异常级别来管理 2.2 某些异常级别使用AArch32的ARMv8 VMSA EL3运行AArch32时的地址转换stages和转换regimes; EL3运行AArch64时任何运行AArch32的异常级别的的地址转换stages和转换regimes; 当EL0

ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Synchronization and semapores

1.前言 2. Exclusive access instructions and Non-shareable memory locations Load-Exclusive Load-Exclusive指令执行时local monitor标记PE执行load EX的地址为独占,local monitor由Open Access状态转换为Exclusive Access状态: Store-Exclusive 依赖local monitor的状态: (1)如果local monitor 为Excl

ARMV8 datasheet学习笔记1:概述

1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AArch64架构,除了新增A64(ARM 64bit)指令集外,也扩充了现有的A32(ARM 32bit)和T32(Thumb2 32bit)指令集,另外还新增加了CRYPTO(加密)模块支持.

stm32学习笔记之win8系统下,keil4出现黑块的解决方法

前不久,笔者安装keil4启动会出现黑块,如图所示 当时询问了不少技术群都没有找到解决办法,并且还在百度贴吧发贴,最终都无果而终 这是当时发贴地址 http://tieba.baidu.com/p/3176578044 后来重做了个系统,才勉强能使用.直至今天又出现了同样的状况.在此之间笔者发现当keil4出现黑块,win8自带的记事本也会出现未响应状况,于是上网找解决方法,最终网友 oafaq给了我思路 这是他的原文地址 http://blog.sina.com.cn/key9928 .原来我