嵌入式开发论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 121|回复: 0

ARMv8中的异常向量介绍

[复制链接]

59

主题

62

帖子

249

积分

版主

Rank: 7Rank: 7Rank: 7

积分
249
发表于 2018-11-29 18:24:09 | 显示全部楼层 |阅读模式

在ARMV8架构中使用execption level来表示AArch64的执行等级,而在ARMV7架构中则使用PL的方式来进行定义。在ARMv8中ARM核的执行等级划分如下图所示。

        而在ARMv7架构中,因为是使用PL的方式来定义ARM核的执行等级,ARM核中各种运行模式与PL的对应关系如下表所示:

        在ARMv8架构的AArch64时,每种EL都具有独立的16个entires,这16个entires分为四类异常, 分别为:IRQ, FIQ,SError, Synchronous。而根据触发一种异常时是否会产生EL级别的迁移和使用产生迁移时使用的是AArch64还是AArch32的指令集又具有四种不同的区域。整个16个entires的分类和在向量表中的偏移关系如下表所示:

Address Execption typeDescription
VBAR_Eln+0x000SynchronousCurrent EL wit SP0
0x080IRQ/vIRQ
0x100FIQ/vFIQ
0x180Serror/vSError
0x200SynchronousCurrent EL wit SPx
0x280IRQ/vIRQ
0x300FIQ/vFIQ
0x380Serror/vSError
0x400SynchronousLower EL using AArch64
0x480IRQ/vIRQ
0x500FIQ/vFIQ
0x580Serror/vSError
0x600SynchronousLower EL using AArch32
0x680IRQ/vIRQ
0x700FIQ/vFIQ
0x780Serror/vSError

        当在EL0产生异常而位产生EL的迁移时,使用的是SP0保存的栈空间地址。而在除EL0之外的ELx产生异常而未导致EL的迁移时使用的是对应的SPx保存的栈空间地址。在AArch64中,EL的迁移只能是从低EL向高EL进行迁移,如果使用AArch64指令集和AArch32指令集时产生了异常并且也发生了EL的迁移时,则使用的是将迁移到的EL对应的SPx。
        为方便理解在ARMv8 AArch64中异常向量表的定义,以下以ATF中bl31为例进行说明, 在ATF的bl31中,其异常向量表的定义如下:
/* 用于处理EL0产生异常时的entire */
vector_entry sync_exception_sp_el0
b report_unhandled_exception
check_vector_size sync_exception_sp_el0
vector_entry irq_sp_el0
b report_unhandled_interrupt
check_vector_size irq_sp_el0
vector_entry fiq_sp_el0
b report_unhandled_interrupt
check_vector_size fiq_sp_el0
vector_entry serror_sp_el0
b report_unhandled_exception
check_vector_size serror_sp_el0

/* 用于处理当前ELx产生异常时的entire */
vector_entry sync_exception_sp_elx
b report_unhandled_exception
check_vector_size sync_exception_sp_elx
vector_entry irq_sp_elx
b report_unhandled_interrupt
check_vector_size irq_sp_elx
vector_entry fiq_sp_elx
b report_unhandled_interrupt
check_vector_size fiq_sp_elx
vector_entry serror_sp_elx
b report_unhandled_exception
check_vector_size serror_sp_elx

/* 用于处理AArch64指令产生的异常,且发生了EL的迁移的entire */
vector_entry sync_exception_aarch64
handle_sync_exception
check_vector_size sync_exception_aarch64
vector_entry irq_aarch64
handle_interrupt_exception irq_aarch64
check_vector_size irq_aarch64
vector_entry fiq_aarch64
handle_interrupt_exception fiq_aarch64
check_vector_size fiq_aarch64
vector_entry serror_aarch64
b report_unhandled_exception
check_vector_size serror_aarch64

/* 用于处理AArch32指令产生的异常,且发生了EL的迁移的entire */
vector_entry sync_exception_aarch32
handle_sync_exception
check_vector_size sync_exception_aarch32
vector_entry irq_aarch32
handle_interrupt_exception irq_aarch32
check_vector_size irq_aarch32
vector_entry fiq_aarch32
handle_interrupt_exception fiq_aarch32
check_vector_size fiq_aarch32
vector_entry serror_aarch32
b report_unhandled_exception
check_vector_size serror_aarch32
        在支持Trustzone的ARRMv8中,当在non-secure world或者secure world中触发了smc或者hvc指令时都属于产生sync类型的异常。根据产生该异常是否会导致EL的迁移从异常向量表中确定最终用于处理该异常的handle。
        ARMv8中,EL1,EL2,EL3都具有独立的VBAR寄存器,该寄存器就是用于存放各ELx的异常向量表的基地址。当发生异常时,如果该异常产生了EL的迁移,那么完成迁移操作之后会到迁移到的EL中的VBAR寄存器中找到向量表的基地址,然后命中对应的handl。值得注意的是,EL的迁移都是只能由低往高进行迁移,EL0不能直接迁移到EL3。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|TEE and Virtualization

GMT+8, 2019-3-18 23:26 , Processed in 0.088313 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表