0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FIQ为例说明其中断处理流程

麦辣鸡腿堡 来源:TrustZone 作者:TrustZone 2023-11-07 17:48 次阅读

1-保存环境

FIQ中断触发时, PE将异常发生时的PSTATE保存到SPSR_EL3将返回地址保存到ELR_EL3(以上是由硬件完成的) ,( pstate可能指CPU忙时的电源管理,也可能是其它的,但是肯定关于此时CPU状态的。)然后跳转到异常向量 表入口处执行中断处理流程

2-执行中断处理流程

fiq_aarch64函数主要由handle_interrupt_exception宏实现,该宏的定义如下:

该函数主要实现了

  • • 1、 异常切换时的上下文保存
  • • 2、运行时栈的切换
  • • 3、 中断处理函数查询
  • • 4、参数设置和跳转功能。

其详细流程如下:

.macro handle_interrupt_exception label
    bl save_gp_pmcr_pauth_regs1)
(1)将通用寄存器x0x29以及sp_el0),pmcr以及pauth寄存器保存到sp_el3指定的el3栈中

#if ENABLE_PAUTH
    /* Load and program APIAKey firmware key */
    bl pauth_load_bl31_apiakey
#endif

    mrs x0, spsr_el3
    mrs x1, elr_el3
    stp x0, x1, [sp, #CTX_EL3STATE_OFFSET + CTX_SPSR_EL3]2)
    (2)将spsr_el3elr_el3保存到sp_el3指定的el3栈中

    /* Switch to the runtime stack i.e. SP_EL0 */
    ldr x2, [sp, #CTX_EL3STATE_OFFSET + CTX_RUNTIME_SP]3)
(3)从el3栈中读取sp_el0栈指针

    mov x20, sp4)
(4)将sp_el3栈指针暂存到x20寄存器中

    msr spsel, #MODE_SP_EL05)
(5)将当前的runtime栈切换为sp_el0

    mov sp, x26)
(6)恢复sp_el0栈的值

    bl plat_ic_get_pending_interrupt_type7)
(7)读取当前中断的中断号,并根据中断号获取中断类型


    cmp x0, #INTR_TYPE_INVAL
    b.eq interrupt_exit_label8)
(8)若中断类型为非法,则直接退出中断处理


    bl get_interrupt_type_handler9)
(9)获取该中断类型对应的处理函数

    cbz x0, interrupt_exit_label10)
(10)若获取处理函数失败,则直接退出中断处理

    mov x21, x011)
(11)将中断类型处理函数指针暂存到x21寄存器中


    mov x0, #INTR_ID_UNAVAILABLE

    /* Set the current security state in the 'flags' parameter */
    mrs x2, scr_el3
    ubfx x1, x2, #0, #112)
(12)设置中断处理函数的输入参数0和参数1


    /* Restore the reference to the 'handle' i.e. SP_EL3 */
    mov x2, x2013)
(13)将sp_el3指针设置中断处理函数的输入参数2


    /* x3 will point to a cookie (not used now) */
    mov x3, xzr14)
(14)设置中断处理函数的输入参数3,该参数始终当前为0


    /* Call the interrupt type handler */
    blr x2115)
(15)跳转到中断处理函数并执行实际的中断处理


interrupt_exit_label:                                              
    /* Return from exception, possibly in a different security state */
    b el3_exit

    .endm

(1)将通用寄存器(x0 – x29以及sp_el0),pmcr以及pauth寄存器保存到sp_el3指定的el3栈中

(2)将spsr_el3和elr_el3保存到sp_el3指定的el3栈中

(3)从el3栈中读取sp_el0栈指针

(4)将sp_el3栈指针暂存到x20寄存器中

(5)将当前的runtime栈切换为sp_el0

(6)恢复sp_el0栈的值

(7)读取当前中断的中断号,并根据中断号获取中断类型

(8)若中断类型为非法,则直接退出中断处理

(9)获取该中断类型对应的处理函数

(10)若获取处理函数失败,则直接退出中断处理

(11)将中断类型处理函数指针暂存到x21寄存器中

(12)设置中断处理函数的输入参数0和参数1

(13)将sp_el3指针设置中断处理函数的输入参数2

(14)设置中断处理函数的输入参数3,该参数始终当前为0

(15)跳转到中断处理函数并执行实际的中断处理

在bl31中实际的中断处理函数有两类,group 0中断和secure group 1中断。 group 0中断由exception handler framework(ehf)管理,该框架实现了对bl31中group 0中断的注册和管理 ,当前sdei框架使用了这种中断类型。

而secure EL1中断一般是bl31为bl32接收并转发给bl32的 ,如optee在bl31中注册了一个secure el1中断处理函数opteed_sel1_interrupt_handler,该函数比较简单,只是执行了异常等级上下文切换,跳转到bl32的fiq异常处理入口,将中断处理转交给bl32。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10543

    浏览量

    207635
  • 中断
    +关注

    关注

    5

    文章

    885

    浏览量

    41109
  • 函数
    +关注

    关注

    3

    文章

    4117

    浏览量

    61550
收藏 人收藏

    评论

    相关推荐

    ARM中断模式(IRQ)和快速中断模式(FIQ)区别比较

    ※ 概念 IRQ(Interrupt Request):指中断模式。 FIQ(Fast Interrupt Request):指快速中断模式。 IRQ与FIQ是ARM
    发表于 10-13 10:43

    fx3和fiq为什么会中断

    所有IRQ和FIQ中断都被屏蔽。在SDK代码中,FIQ中断处理程序永远不会完成,因此系统完全冻结。我不知道
    发表于 08-16 14:22

    ARM异常中断处理流程分析

    ,而且CPSR寄存器中的I控制位被清除时,处理器产生外部中断请求异常中断。系统中各个外设通常通过该异常中断请求处理器服务。快速中断请求(
    发表于 08-28 08:09

    FIQ比IRQ快的原因

    1、FIQ比IRQ快的原因:A、FIQ模式的R8–R14寄存器是独有的,FIQ处理程序可以不必执行保存和恢复中断现场的指令。B、
    发表于 11-03 07:59

    中断处理函数(IRQHandler)的标准流程

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是以i.MXRT的GPIO模块谈谈中断处理函数(IRQHandler)的标准
    发表于 02-09 07:10

    s3c2410中断处理程序

    s3c2410中断程序在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常
    发表于 09-11 18:49 2250次阅读

    ARM微处理器编程模型之异常中断处理分析

    3.4 异常中断处理 异常或中断是用户程序中最基本的一种执行流程和形态。这部分主要对ARM架构下的异常中断做详细
    发表于 10-18 13:29 1次下载

    一种支持多个FIQ的向量中断控制器设计

    请求( Fast Interrupt Request,FIQ)2种类型的中断。与IRQ相比,FIQ有额外的5个物理寄存器(R8_fiq - R12_f
    发表于 01-18 16:50 0次下载
    一种支持多个<b class='flag-5'>FIQ</b>的向量<b class='flag-5'>中断</b>控制器设计

    关于F2812的C语言处理中断说明

    关于F2812的C语言处理中断说明
    发表于 04-10 15:54 2次下载

    一文读懂LPC中的中断处理

    LPC中的中断处理小结,近来在 LPC 的中断过程上看了点文献,作为一个初学者感觉这个内容与其它的处理器还是有很大的区别,比如说三星的 S3C4510B ,两者在
    发表于 05-30 01:22 5114次阅读

    ARM中断向量表与响应流程的系列资料详细说明

    本文档的主要内容详细介绍的是ARM中断向量表与响应流程的系列资料详细说明包括了:一首先中断向量表定义在哪里?如何加载?,二 中断向量表与
    发表于 07-05 17:41 2次下载
    ARM<b class='flag-5'>中断</b>向量表与响应<b class='flag-5'>流程</b>的系列资料详细<b class='flag-5'>说明</b>

    ARM7的定时器中断和外部中断与串口中断的原理详细说明

    快速中断请求(FIQ)要求具有最高优先级。如果分配给FIQ 的请求多于1 个,VIC将中断请求“相或”后向ARM 处理器产生
    发表于 09-27 17:26 14次下载
    ARM7的定时器<b class='flag-5'>中断</b>和外部<b class='flag-5'>中断</b>与串口<b class='flag-5'>中断</b>的原理详细<b class='flag-5'>说明</b>

    控制IRQ和FIQ中断的编译器内部函数 基于Keil MDK

    控制IRQ和FIQ中断的编译器内部函数 - 基于Keil MDK
    的头像 发表于 02-29 16:45 2160次阅读

    控制IRQ和FIQ中断的编译器内部函数 - 基于Keil MDK

    编译器内部函数__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中断
    发表于 01-26 17:16 1次下载
    控制IRQ和<b class='flag-5'>FIQ</b><b class='flag-5'>中断</b>的编译器内部函数 - 基于Keil MDK

    Bl31中断处理流程概述

    中断处理需要软件和硬件配合完成,GICv3根据中断分组情况以及系统当前运行的异常等级确定中断是以IRQ还是FIQ触发。 CPU通过设置SCR
    的头像 发表于 11-07 17:43 369次阅读
    Bl31<b class='flag-5'>中断</b><b class='flag-5'>处理</b><b class='flag-5'>流程</b>概述