0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FIQ為例說明其中斷處理流程

麥辣雞腿堡 ? 來源:TrustZone ? 作者:TrustZone ? 2023-11-07 17:48 ? 次閱讀

1-保存環(huán)境

FIQ中斷觸發(fā)時, PE將異常發(fā)生時的PSTATE保存到SPSR_EL3 , 將返回地址保存到ELR_EL3(以上是由硬件完成的) ,( pstate可能指CPU忙時的電源管理,也可能是其它的,但是肯定關于此時CPU狀態(tài)的。)然后跳轉到異常向量 表入口處執(zhí)行中斷處理流程 。

2-執(zhí)行中斷處理流程

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)跳轉到中斷處理函數并執(zhí)行實際的中斷處理


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)跳轉到中斷處理函數并執(zhí)行實際的中斷處理

在bl31中實際的中斷處理函數有兩類,group 0中斷和secure group 1中斷。 group 0中斷由exception handler framework(ehf)管理,該框架實現了對bl31中group 0中斷的注冊和管理 ,當前sdei框架使用了這種中斷類型。

而secure EL1中斷一般是bl31為bl32接收并轉發(fā)給bl32的 ,如optee在bl31中注冊了一個secure el1中斷處理函數opteed_sel1_interrupt_handler,該函數比較簡單,只是執(zhí)行了異常等級上下文切換,跳轉到bl32的fiq異常處理入口,將中斷處理轉交給bl32。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10890

    瀏覽量

    212429
  • 中斷
    +關注

    關注

    5

    文章

    900

    瀏覽量

    41597
  • 函數
    +關注

    關注

    3

    文章

    4344

    瀏覽量

    62813
收藏 人收藏

    評論

    相關推薦

    ARM中斷模式(IRQ)和快速中斷模式(FIQ)區(qū)別比較

    ※ 概念 IRQ(Interrupt Request):指中斷模式。 FIQ(Fast Interrupt Request):指快速中斷模式。 IRQ與FIQ是ARM
    發(fā)表于 10-13 10:43

    fx3和fiq為什么會中斷?

    所有IRQ和FIQ中斷都被屏蔽。在SDK代碼中,FIQ中斷處理程序永遠不會完成,因此系統(tǒng)完全凍結。我不知道
    發(fā)表于 08-16 14:22

    ARM異常中斷處理流程分析

    ,而且CPSR寄存器中的I控制位被清除時,處理器產生外部中斷請求異常中斷。系統(tǒng)中各個外設通常通過該異常中斷請求處理器服務。快速中斷請求(
    發(fā)表于 08-28 08:09

    FIQ比IRQ快的原因

    1、FIQ比IRQ快的原因:A、FIQ模式的R8–R14寄存器是獨有的,FIQ處理程序可以不必執(zhí)行保存和恢復中斷現場的指令。B、
    發(fā)表于 11-03 07:59

    中斷處理函數(IRQHandler)的標準流程

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是以i.MXRT的GPIO模塊談談中斷處理函數(IRQHandler)的標準
    發(fā)表于 02-09 07:10

    MPC860 的中斷處理技術研究

    MPC860 是網絡通信設備中應用最廣的一款RISC 嵌入式處理器。本文介紹MPC860 的中斷體系結構及中斷發(fā)生后服務程序的處理流程;以S
    發(fā)表于 05-18 13:08 ?19次下載

    ARM微處理器編程模型之異常中斷處理分析

    3.4 異常中斷處理 異?;?b class='flag-5'>中斷是用戶程序中最基本的一種執(zhí)行流程和形態(tài)。這部分主要對ARM架構下的異常中斷做詳細
    發(fā)表于 10-18 13:29 ?1次下載

    一種支持多個FIQ的向量中斷控制器設計

    請求( Fast Interrupt Request,FIQ)2種類型的中斷。與IRQ相比,FIQ有額外的5個物理寄存器(R8_fiq - R12_f
    發(fā)表于 01-18 16:50 ?0次下載
    一種支持多個<b class='flag-5'>FIQ</b>的向量<b class='flag-5'>中斷</b>控制器設計

    一文讀懂LPC中的中斷處理

    LPC中的中斷處理小結,近來在 LPC 的中斷過程上看了點文獻,作為一個初學者感覺這個內容與其它的處理器還是有很大的區(qū)別,比如說三星的 S3C4510B ,兩者在
    發(fā)表于 05-30 01:22 ?5421次閱讀

    ARM中斷向量表與響應流程的系列資料詳細說明

    本文檔的主要內容詳細介紹的是ARM中斷向量表與響應流程的系列資料詳細說明包括了:一首先中斷向量表定義在哪里?如何加載?,二 中斷向量表與
    發(fā)表于 07-05 17:41 ?2次下載
    ARM<b class='flag-5'>中斷</b>向量表與響應<b class='flag-5'>流程</b>的系列資料詳細<b class='flag-5'>說明</b>

    ARM7的定時器中斷和外部中斷與串口中斷的原理詳細說明

    快速中斷請求(FIQ)要求具有最高優(yōu)先級。如果分配給FIQ 的請求多于1 個,VIC將中斷請求“相或”后向ARM 處理器產生
    發(fā)表于 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
    的頭像 發(fā)表于 02-29 16:45 ?2601次閱讀

    痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊談談中斷處理函數(IRQHandler)的標準流程...

      大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是以i.MXRT的GPIO模塊談談中斷處理函數(IRQHandler)的標準
    發(fā)表于 12-05 15:21 ?1次下載
    痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊<b class='flag-5'>為</b><b class='flag-5'>例</b>談談<b class='flag-5'>中斷</b><b class='flag-5'>處理</b>函數(IRQHandler)的標準<b class='flag-5'>流程</b>...

    控制IRQ和FIQ中斷的編譯器內部函數 - 基于Keil MDK

    編譯器內部函數__disable_irq、__enable_irq、__disable_fiq和__enable_fiq用于控制IRQ和FIQ中斷
    發(fā)表于 01-26 17:16 ?1次下載
    控制IRQ和<b class='flag-5'>FIQ</b><b class='flag-5'>中斷</b>的編譯器內部函數 - 基于Keil MDK

    Bl31中斷處理流程概述

    中斷處理需要軟件和硬件配合完成,GICv3根據中斷分組情況以及系統(tǒng)當前運行的異常等級確定中斷是以IRQ還是FIQ觸發(fā)。 CPU通過設置SCR
    的頭像 發(fā)表于 11-07 17:43 ?666次閱讀
    Bl31<b class='flag-5'>中斷</b><b class='flag-5'>處理</b><b class='flag-5'>流程</b>概述