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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

FIQ為例說(shuō)明其中斷處理流程

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

1-保存環(huán)境

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

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

fiq_aarch64函數(shù)主要由handle_interrupt_exception宏實(shí)現(xiàn),該宏的定義如下:

該函數(shù)主要實(shí)現(xiàn)了

  • ? 1、 異常切換時(shí)的上下文保存 ,
  • ? 2、運(yùn)行時(shí)棧的切換
  • ? 3、 中斷處理函數(shù)查詢(xún) 、
  • ? 4、參數(shù)設(shè)置和跳轉(zhuǎn)功能。

其詳細(xì)流程如下:

.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)將當(dāng)前的runtime棧切換為sp_el0

    mov sp, x26)
(6)恢復(fù)sp_el0棧的值

    bl plat_ic_get_pending_interrupt_type7)
(7)讀取當(dāng)前中斷的中斷號(hào),并根據(jù)中斷號(hào)獲取中斷類(lèi)型


    cmp x0, #INTR_TYPE_INVAL
    b.eq interrupt_exit_label8)
(8)若中斷類(lèi)型為非法,則直接退出中斷處理


    bl get_interrupt_type_handler9)
(9)獲取該中斷類(lèi)型對(duì)應(yīng)的處理函數(shù)

    cbz x0, interrupt_exit_label10)
(10)若獲取處理函數(shù)失敗,則直接退出中斷處理

    mov x21, x011)
(11)將中斷類(lèi)型處理函數(shù)指針暫存到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)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)0和參數(shù)1


    /* Restore the reference to the 'handle' i.e. SP_EL3 */
    mov x2, x2013)
(13)將sp_el3指針設(shè)置中斷處理函數(shù)的輸入?yún)?shù)2


    /* x3 will point to a cookie (not used now) */
    mov x3, xzr14)
(14)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)3,該參數(shù)始終當(dāng)前為0


    /* Call the interrupt type handler */
    blr x2115)
(15)跳轉(zhuǎn)到中斷處理函數(shù)并執(zhí)行實(shí)際的中斷處理


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)將當(dāng)前的runtime棧切換為sp_el0

(6)恢復(fù)sp_el0棧的值

(7)讀取當(dāng)前中斷的中斷號(hào),并根據(jù)中斷號(hào)獲取中斷類(lèi)型

(8)若中斷類(lèi)型為非法,則直接退出中斷處理

(9)獲取該中斷類(lèi)型對(duì)應(yīng)的處理函數(shù)

(10)若獲取處理函數(shù)失敗,則直接退出中斷處理

(11)將中斷類(lèi)型處理函數(shù)指針暫存到x21寄存器中

(12)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)0和參數(shù)1

(13)將sp_el3指針設(shè)置中斷處理函數(shù)的輸入?yún)?shù)2

(14)設(shè)置中斷處理函數(shù)的輸入?yún)?shù)3,該參數(shù)始終當(dāng)前為0

(15)跳轉(zhuǎn)到中斷處理函數(shù)并執(zhí)行實(shí)際的中斷處理

在bl31中實(shí)際的中斷處理函數(shù)有兩類(lèi),group 0中斷和secure group 1中斷。 group 0中斷由exception handler framework(ehf)管理,該框架實(shí)現(xiàn)了對(duì)bl31中g(shù)roup 0中斷的注冊(cè)和管理 ,當(dāng)前sdei框架使用了這種中斷類(lèi)型。

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10721

    瀏覽量

    209572
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    889

    瀏覽量

    41227
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4240

    瀏覽量

    62004
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    fx3和fiq為什么會(huì)中斷?

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

    ARM異常中斷處理流程分析

    ,而且CPSR寄存器中的I控制位被清除時(shí),處理器產(chǎn)生外部中斷請(qǐng)求異常中斷。系統(tǒng)中各個(gè)外設(shè)通常通過(guò)該異常中斷請(qǐng)求處理器服務(wù)??焖?b class='flag-5'>中斷請(qǐng)求(
    發(fā)表于 08-28 08:09

    FIQ比IRQ快的原因

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

    中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是以i.MXRT的GPIO模塊談?wù)?b class='flag-5'>中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)
    發(fā)表于 02-09 07:10

    MPC860 的中斷處理技術(shù)研究

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

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

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

    一種支持多個(gè)FIQ的向量中斷控制器設(shè)計(jì)

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

    一文讀懂LPC中的中斷處理

    LPC中的中斷處理小結(jié),近來(lái)在 LPC 的中斷過(guò)程上看了點(diǎn)文獻(xiàn),作為一個(gè)初學(xué)者感覺(jué)這個(gè)內(nèi)容與其它的處理器還是有很大的區(qū)別,比如說(shuō)三星的 S3C4510B ,兩者在
    發(fā)表于 05-30 01:22 ?5237次閱讀

    ARM中斷向量表與響應(yīng)流程的系列資料詳細(xì)說(shuō)明

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

    ARM7的定時(shí)器中斷和外部中斷與串口中斷的原理詳細(xì)說(shuō)明

    快速中斷請(qǐng)求(FIQ)要求具有最高優(yōu)先級(jí)。如果分配給FIQ 的請(qǐng)求多于1 個(gè),VIC將中斷請(qǐng)求“相或”后向ARM 處理器產(chǎn)生
    發(fā)表于 09-27 17:26 ?14次下載
    ARM7的定時(shí)器<b class='flag-5'>中斷</b>和外部<b class='flag-5'>中斷</b>與串口<b class='flag-5'>中斷</b>的原理詳細(xì)<b class='flag-5'>說(shuō)明</b>

    控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) 基于Keil MDK

    控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) - 基于Keil MDK
    的頭像 發(fā)表于 02-29 16:45 ?2321次閱讀

    痞子衡嵌入式:以i.MXRT1xxx的GPIO模塊談?wù)?b class='flag-5'>中斷處理函數(shù)(IRQHandler)的標(biāo)準(zhǔn)流程...

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

    控制IRQ和FIQ中斷的編譯器內(nèi)部函數(shù) - 基于Keil MDK

    編譯器內(nèi)部函數(shù)__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>的編譯器內(nèi)部函數(shù) - 基于Keil MDK

    Bl31中斷處理流程概述

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