首页 > 代码库 > ARMV8 datasheet学习笔记5:异常模型

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.     Data Abort 路由

3.2.1.    AArch32 Data Abort 路由

技术分享

 

 

 

3.2.2.    AArch64 Data Abort 路由

 技术分享

4. 源代码异常入口

4.1     C函数入口

 异常类型

AArch32 State

AArch64 State

所在文件

函数

所在文件

函数

Und

arm/kernel/traps.c

do_undefinstr

Arm64/kernel/traps.c

do_undefinstr

Data Abort

arm/mm/fault.c

do_DataAbort

arm64/mm/fault.c

do_mem_abort

IRQ

arm/kernel/irq.c

asm_do_IRQ

arm64/kernel/irq.c

handle_IRQ

FIQ

       

System Call

       

 

4.2    上报流程图

例举Data Abort 和 IRQ中断的入口流程图

  • Data Abort 上报

技术分享

  

  • IRQ上报

技术分享

 

4.3.    异常进入压栈准备

分析64位kernel_entry 压栈代码逻辑(代码路径:kernel/arch/arm64/kernel/entry.S)

压栈准备

说明

? sp指向 #S_LR – #S_FRAME_SIZE 位置

#S_FRAME_SIZE是pt_regs结构图的size

? 依次把x28-x29 … x0-x1 成对压入栈内

每压入一对寄存器,sp指针就移动 -16 =((64/8)*2)字节长度,栈是向地址减少方向增长的.

? 保存sp+#S_FRAME_SIZE数据到x21

add x21, sp, #SP_FRAME_SIZE

? 保存elr_el1到x22

mrs x22, elr_el1

? 保存spsr_el1到x23

mrs x23, spsr_el1

? 把lr、x21写入sp+#S_LR地址内存

保存lr和x21的数据到指定栈内存位置

? 把x22、x23写入sp+#S_PC地址内存

保存elr,spsr数据到指定栈内存位置

 

4.4.     栈布局

 

5. 参考文档

[1] DDI0487A_k_armv8_arm_iss10775.pdf

 

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