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

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

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

armv8/armv9中斷系列詳解-中斷示例展示

Linux閱碼場 ? 來源:Linux閱碼場 ? 作者:Linux閱碼場 ? 2022-04-29 10:48 ? 次閱讀

一、中斷示例展示(不含虛擬化部分)

環(huán)境配置:linux/optee雙系統(tǒng)環(huán)境下, linux系統(tǒng)的SCR.IRQ=0、SCR.FIQ=1, optee系統(tǒng)的SCR.IRQ=0、SCR.FIQ=0

說明:group1是非安全中斷、secure group1是安全中斷

1、當(dāng)cpu處于REE,來了一個(gè)非安全中斷

當(dāng)cpu處于normal側(cè)時(shí),來了一個(gè)非安全中斷,根據(jù)SCR.NS=1/中斷在group1組,cpu interface將會(huì)給cpu一個(gè)IRQ,(由于SCR.IRQ=0,IRQ將被routing到EL1),cpu跳轉(zhuǎn)至linux的irq中斷異常向量表, 處理完畢后再返回到normal(linux)側(cè).

2、當(dāng)cpu處于TEE,來了一個(gè)安全中斷

當(dāng)cpu處于secure側(cè)時(shí),來了一個(gè)安全中斷,根據(jù)SCR.NS=0/中斷在secure group1組,cpu interface將會(huì)給cpu一個(gè)IRQ,(由于SCR.IRQ=0,IRQ將被routing到EL1),cpu跳轉(zhuǎn)至optee的irq中斷異常向量表, 處理完畢后再返回到secure(optee)側(cè).

f22f1298-c750-11ec-bce3-dac502259ad0.png

3、當(dāng)cpu處于TEE,來了一個(gè)非安全中斷

當(dāng)cpu處于secure側(cè)時(shí),來了一個(gè)非安全中斷,根據(jù)SCR.NS=0/中斷在group1組,cpu interface將會(huì)給cpu一個(gè)FIQ,(由于SCR.FIQ=0,F(xiàn)IQ將被routing到EL1),跳轉(zhuǎn)至optee的fiq中斷異常向量表,再optee的fiq處理函數(shù)中,直接調(diào)用了smc跳轉(zhuǎn)到ATF, ATF再切換至normal EL1(linux), 此時(shí)SCR.NS的狀態(tài)發(fā)生變化,根據(jù)SCR.NS=1/中斷在group1組,cpu interface會(huì)再給cpu發(fā)送一個(gè)IRQ異常,cpu跳轉(zhuǎn)至linux的irq中斷異常向量表,處理完畢后,再依次返回到ATF---返回到optee

f24bdf40-c750-11ec-bce3-dac502259ad0.png

4、當(dāng)cpu處于REE,來了一個(gè)安全中斷

當(dāng)cpu處于normal側(cè)時(shí),來了一個(gè)安全中斷,根據(jù)SCR.NS=0/中斷在group1組,cpu interface將會(huì)給cpu一個(gè)FIQ,(由于SCR.FIQ=1,F(xiàn)IQ將被routing到EL3),在EL3(ATF)中,判斷該中斷是需要optee來處理的,會(huì)切換到optee。此時(shí)SCR.NS的狀態(tài)發(fā)生變化,根據(jù)SCR.NS=0/中斷在secure group1組,cpu interface會(huì)再給cpu發(fā)送一個(gè)IRQ異常,cpu跳轉(zhuǎn)至optee的irq中斷異常向量表, 處理完畢后再依次返回到ATF---返回到linux

f26ca284-c750-11ec-bce3-dac502259ad0.png

5、當(dāng)cpu處于ATF時(shí),來了一個(gè)安全中斷或非安全中斷(G1NS、G1S)

當(dāng)cpu處于EL3時(shí),來得任何target到EL3的中斷,都將被標(biāo)記位FIQ

f289c062-c750-11ec-bce3-dac502259ad0.png

當(dāng)cpu處于EL3時(shí),配置SCR.XXX(XXX=EA或IRQ或FIQ)為0的中斷不會(huì)被taken,配置SCR.XXX為1的中斷將會(huì)直接target到EL3。

f2a8c64c-c750-11ec-bce3-dac502259ad0.png

所以在 linux系統(tǒng)的SCR.IRQ=0、SCR.FIQ=1, optee系統(tǒng)的SCR.IRQ=0、SCR.FIQ=0的場景下,總結(jié)如下,當(dāng)cpu運(yùn)行在EL3時(shí):

  • SCR_EL3為optee的cpu context時(shí),來了一個(gè)G1S,中斷將不會(huì)被taken

  • SCR_EL3為optee的cpu context時(shí),來了一個(gè)G1NS,中斷將不會(huì)被taken

  • SCR_EL3為linux的cpu context時(shí),來了一個(gè)G1S,中斷將會(huì)直接target到EL3

  • SCR_EL3為linux的cpu context時(shí),來了一個(gè)G1NS,中斷將不會(huì)被taken

6、當(dāng)cpu處于EL3/EL2/EL1/EL0時(shí),來了一個(gè)ATF(group0)中斷(G0)

當(dāng)cpu處于EL3/EL2/EL1/EL0時(shí),來了一個(gè)G0中斷,中斷將被標(biāo)記位FIQ

f2c92b12-c750-11ec-bce3-dac502259ad0.png

在 linux系統(tǒng)的SCR.IRQ=0、SCR.FIQ=1, optee系統(tǒng)的SCR.IRQ=0、SCR.FIQ=0的場景下,總結(jié)如下:

  • 當(dāng)cpu正在Non-secure EL0/1/2運(yùn)行時(shí),來了G0中斷,中斷被標(biāo)記為FIQ,直接target到EL3

  • 當(dāng)cpu正在secure EL0/1/2運(yùn)行時(shí),來了G0中斷,中斷被標(biāo)記為FIQ,中斷target到了EL0/1/2,在該程序的fiq_offset會(huì)調(diào)用smc將cpu切回到EL3,到了EL3之后,中斷不會(huì)被taken, 會(huì)繼續(xù)返回到Non-secure EL0/1/2,然后cpu interface重新給core發(fā)送FIQ,接著又是直接target到EL3,EL3處理該中斷。

  • 當(dāng)cpu正在EL3時(shí),來了一個(gè)G0中斷,中斷會(huì)被標(biāo)記為FIQ,中斷target到EL3。

7、思考-中斷流程舉例:在TEE側(cè)時(shí)產(chǎn)生了FIQ,回到REE后為啥又產(chǎn)生了IRQ

在深入研讀GICV3文檔后,終于找到了答案。

首先我們了解下中斷優(yōu)先級(jí),在CPU interfaces (ICC*ELn)寄存器的描述中:

? Provide general control and configuration to enable interrupt handling? Acknowledge an interrupt? Perform a priority drop and deactivation of interrupts? Set an interrupt priority mask for the PE? Define the preemption policy for the PE? Determine the highest priority pending interrupt for the PE

也就是cpu interface掌管著中斷優(yōu)先級(jí)和將IRQ/FIQ發(fā)送給ARM Core.

我們以Level sensitive interrupts的中斷為例,先不考慮active and pending的情況:CPU interface發(fā)送給Core后,中斷狀態(tài)變?yōu)閜ending,當(dāng)Core acknowledge中斷后(PE跳轉(zhuǎn)到中斷向量表), 中斷狀態(tài)變?yōu)閍ctive,當(dāng)中斷退出后,Cpu interface會(huì)再次將優(yōu)先級(jí)最高的中斷發(fā)送給Core,Core處理下一個(gè)中斷。

f2e2182a-c750-11ec-bce3-dac502259ad0.png

我們再看下中斷的退出流程( End of interrupt), 中斷的退出有兩種方式:? Priority drop 將中斷優(yōu)先級(jí)降到中斷產(chǎn)生之前的值? Deactivation 將中斷從active變成inactive -- ( 多數(shù)情況下,使用這個(gè)場景)

重點(diǎn)來了,在中斷退出的時(shí)候,軟件中一般會(huì)有Priority drop和Deactivation,既要么將中斷優(yōu)先級(jí)降低,要么將中斷變?yōu)閕nactive,那么中斷退出之后,cpu interface感知到的優(yōu)先級(jí)最高的中斷,就可能不會(huì)是此中斷了,一切運(yùn)行正常,符合業(yè)務(wù).....

那么我們再看下上述的中斷流程舉例,在TEE中,cpu interface發(fā)了一個(gè)FIQ給Core,跳轉(zhuǎn)到optee的FIQ向量表,在FIQ的處理流程中,軟件幾乎什么都沒干,沒有Priority drop和Deactivation, 那么當(dāng)SMC切換到了EL3之后,又退回REE后,Cpu interface感知到上一個(gè)中斷處理完成,會(huì)再次發(fā)送下一個(gè)優(yōu)先級(jí)最高的中斷,由于之前的中斷號(hào)的優(yōu)先級(jí)沒變,此時(shí)基本上依然是最高的優(yōu)先級(jí)。此時(shí)CPU interface會(huì)再次發(fā)送該中斷給Core,由于SCR.NS發(fā)生了變化,此時(shí)Cpu interface發(fā)送給Core的就變成了IRQ...

8、思考-G1NS G1S G0都有可能產(chǎn)生target到EL3的FIQ,如何區(qū)分?

其實(shí)在我們的linux系統(tǒng)的SCR.IRQ=0、SCR.FIQ=1, optee系統(tǒng)的SCR.IRQ=0、SCR.FIQ=0的場景下,不考慮aarch32的情況,有兩種情況會(huì)產(chǎn)生target到EL3的FIQ:

  • (1)cpu在EL0/1/2運(yùn)行時(shí),來了一個(gè)G0中斷,最終CPU將會(huì)進(jìn)入到EL3的向量表中的第三組向量表。

f30a3076-c750-11ec-bce3-dac502259ad0.png

  • (2)ccpu在EL3運(yùn)行時(shí),來了一個(gè)G0中斷,最終CPU將會(huì)進(jìn)入到EL3的向量表中的第二組向量表 不過很遺憾,ATF中的向量表中未實(shí)現(xiàn)第二組向量表。那么為什么不需要實(shí)現(xiàn)呢?在ATF/docs/firmware-design.md中找到了答案, 原來是在進(jìn)入ATF之前,disable了所有的exception,ATF又沒有修改PSTATE.DAIF,所有在ATF Runtime時(shí) irq/fiq/serror/svnc都是disabled。所以異常向量表的第二行,也就用不著了。

Required CPU state when calling bl31_entrypoint() during cold boot
This function must only be called by the primary CPU.
On entry to this function the calling primary CPU must be executing in AArch64EL3, little-endian data access, and all interrupt sources masked:

  • PSTATE.EL = 3

  • PSTATE.RW = 1

  • PSTATE.DAIF = 0xf

  • SCTLR_EL3.EE = 0

  • (3)cpu在normal EL0/1/2/3運(yùn)行時(shí)(Linux側(cè)的SCR_EL3.FIQ=1的情況下),來了一個(gè)G1S中斷,CPU將會(huì)target到EL3的向量表中的第三組向量表。

那么在ATF中第三組向量表中的fiqoffset中,是如何區(qū)分上述(1)(3)中的場景呢,即如何區(qū)分該中斷是給EL3 handler處理的,還是給optee的handler處理的?此時(shí)1020-1023號(hào)中斷發(fā)生了作用。

f32a2728-c750-11ec-bce3-dac502259ad0.png

我們應(yīng)該會(huì)用到1020,那么用在哪里的呢?請看上述匯編代碼bl platicgetpendinginterrupttype的具體實(shí)現(xiàn):


	
  1. uint32_t plat_ic_get_pending_interrupt_type(void)

  2. {

  3. unsignedint irqnr;

  4. assert(IS_IN_EL3());

  5. irqnr = gicv3_get_pending_interrupt_type();

  6. switch(irqnr) {

  7. case PENDING_G1S_INTID:

  8. return INTR_TYPE_S_EL1;

  9. case PENDING_G1NS_INTID:

  10. return INTR_TYPE_NS;

  11. case GIC_SPURIOUS_INTERRUPT:

  12. return INTR_TYPE_INVAL;

  13. default:

  14. return INTR_TYPE_EL3;

  15. }

  16. }

其實(shí)就是在讀取pending的中斷號(hào),看看有沒有1020或1021,從而獲得此次的中斷是從secure或non-secure過來的,還是在EL3產(chǎn)生的。然后走相應(yīng)的邏輯。

二、中斷示例展示(虛擬化部分)

影響中斷routing的相關(guān)控制位主要是 HCR_EL2.IMO/FMO/AMO(本文只探討irq/virq,所以我們只看 IMO比特位),除此之外還有 HCR_EL2.TGE比特位影響Application是做為Host還是Guest.

以下是這些比特位的路由規(guī)則的總結(jié):

f3520928-c750-11ec-bce3-dac502259ad0.png

我們學(xué)習(xí)了其原理之后,我們再看4個(gè)示例:(1)、HCREL2.IMO=1 , HCREL2.TGE=1 --routing到EL2,Application做為Guest

f36d82ac-c750-11ec-bce3-dac502259ad0.png

(2)、HCREL2.IMO=1 , HCREL2.TGE=0 --routing到EL2,Application做為Host

f3900ec6-c750-11ec-bce3-dac502259ad0.png

(3)、HCREL2.IMO=0 , HCREL2.TGE=1 --routing到EL1,Application做為Guest

f3b0904c-c750-11ec-bce3-dac502259ad0.png

(4)、HCREL2.IMO=0 , HCREL2.TGE=0 --routing到EL1,Application做為host

f3d1da90-c750-11ec-bce3-dac502259ad0.png

審核編輯 :李倩


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

    關(guān)注

    68

    文章

    10776

    瀏覽量

    210462
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11177

    瀏覽量

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

    關(guān)注

    5

    文章

    894

    瀏覽量

    41322

原文標(biāo)題:armv8/armv9中斷系列詳解-中斷示例展示

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Armv9 CPUSVE2的實(shí)際用例

    隨著每一代新產(chǎn)品的推出,Arm CPU 都會(huì)實(shí)現(xiàn)代際性能提升,并引入架構(gòu)改進(jìn),以滿足不斷演進(jìn)的計(jì)算工作負(fù)載的需求。本文將重點(diǎn)介紹三個(gè)用例,以展示 Armv9 CPU 的架構(gòu)特性在實(shí)際場景中產(chǎn)
    的頭像 發(fā)表于 10-21 09:54 ?107次閱讀
    <b class='flag-5'>Armv9</b> CPU<b class='flag-5'>中</b>SVE2的實(shí)際用例

    ARM CORE支持中斷嵌套嗎?GIC中斷控制器支持中斷嵌套嗎?

    在默認(rèn)情況下,本文講述的都是ARMV8-aarch64架構(gòu),gicv3, linux kernel 5.14
    的頭像 發(fā)表于 08-07 09:29 ?472次閱讀
    ARM CORE支持<b class='flag-5'>中斷</b>嵌套嗎?GIC<b class='flag-5'>中斷</b>控制器支持<b class='flag-5'>中斷</b>嵌套嗎?

    armv8在啟動(dòng)剛開始時(shí)調(diào)用了關(guān)中斷,一直到切換第一個(gè)線程,在哪里開啟的中斷呢?

    例如當(dāng)前使用的armv8芯片,在啟動(dòng)剛開始時(shí)調(diào)用了關(guān)中斷,一直到切換第一個(gè)線程,在哪里開啟的中斷呢? int rtthread_startup(void
    發(fā)表于 07-04 07:00

    移動(dòng)端芯片性能提升,Armv9架構(gòu)新升級(jí)引發(fā)關(guān)注

    “數(shù)碼博主”5月17日的最新爆料指出,聯(lián)發(fā)科積極推進(jìn)Armv9新一代IP BLACKHAWK“黑鷹”的架構(gòu)設(shè)計(jì),預(yù)計(jì)天璣9400芯片將采用這一架構(gòu),有望以“全大核”設(shè)計(jì)再度領(lǐng)跑移動(dòng)SoC CPU性能榜單。
    的頭像 發(fā)表于 05-17 16:51 ?890次閱讀

    使用stm8l的外部中斷的pin7的中斷,進(jìn)行中斷處理時(shí)會(huì)立刻造成新的pin7中斷,會(huì)有什么影響嗎?

    使用stm8l的外部中斷的pin7的中斷,進(jìn)行中斷處理時(shí)會(huì)立刻造成新的pin7中斷,會(huì)有什么影響嗎?目前可以看到的結(jié)果是該pin7
    發(fā)表于 04-07 09:05

    M0516中斷優(yōu)先級(jí)怎么設(shè)置?

    新唐M0516中斷優(yōu)先級(jí)的設(shè)置,有沒有示例,沒找到相關(guān)接口,謝謝!
    發(fā)表于 01-16 07:25

    s3c2410中斷控制模塊的中斷源狀態(tài)寄存器是?

    S3C2410是一款由三星電子公司設(shè)計(jì)的具有多種功能的嵌入式處理器。其中的中斷控制模塊用于管理系統(tǒng)的中斷請求和中斷服務(wù)程序。在S3C2410,中斷
    的頭像 發(fā)表于 01-05 17:28 ?591次閱讀

    stm32中斷怎么處理的

    STM32是一款非常強(qiáng)大的微控制器系列,具有豐富的外設(shè)和功能。中斷是STM32非常重要的部分,能夠幫助我們提高系統(tǒng)的響應(yīng)速度和效率。本文將詳細(xì)介紹STM32中斷的處理方法。 一、
    的頭像 發(fā)表于 01-02 17:35 ?2322次閱讀

    u-boot armv8鏈接腳本

    armv8,u-boot使用arch/arm/cpu/armv8/u-boot.lds進(jìn)行鏈接。 u-boot-spl和u-boot-tpl使用arch/arm/cpu/armv8
    的頭像 發(fā)表于 12-07 11:19 ?532次閱讀

    armv8 u-boot的啟動(dòng)介紹

    先看arm官網(wǎng)提供的一張圖: 上圖詳細(xì)概括了arm官方推薦的armv8的啟動(dòng)層次結(jié)構(gòu): 官方將啟動(dòng)分為了BL1,BL2,BL31,BL32,BL33階段,根據(jù)順序,芯片啟動(dòng)后首先執(zhí)行BL1階段代碼
    的頭像 發(fā)表于 12-07 11:09 ?1662次閱讀
    <b class='flag-5'>armv8</b> u-boot的啟動(dòng)介紹

    Arm微架構(gòu)學(xué)習(xí)—開啟Armv9時(shí)代

    在上一篇文章“從A76到A78——在變化中學(xué)習(xí)Arm微架構(gòu)”,我們了解了Arm處理器微架構(gòu)的基本組成,介紹了Armv8架構(gòu)最后幾代經(jīng)典處理器架構(gòu)。
    的頭像 發(fā)表于 11-27 16:46 ?1060次閱讀
    Arm微架構(gòu)學(xué)習(xí)—開啟<b class='flag-5'>Armv9</b>時(shí)代

    中斷流程分析與示例

    CPU在處理某一事件A時(shí),發(fā)生了另一事件B的請求(中斷請求);CPU暫時(shí)中斷當(dāng)前的工作,轉(zhuǎn)去處理事件B(中斷響應(yīng)和中斷服務(wù));待CPU將事件B處理完畢后,再回到原來事件A被
    的頭像 發(fā)表于 11-25 12:30 ?1781次閱讀
    <b class='flag-5'>中斷</b>流程分析與<b class='flag-5'>示例</b>

    GIC中斷 redistributor介紹

    就是PPI中斷線 從上面可以看出來,所謂的“私有”是說這些中斷信號(hào)是core專有的。對于PPI,ARMv8定義了三種規(guī)格,8,12和16。所以對于不同的core來說,可能PPI數(shù)量不一
    的頭像 發(fā)表于 11-07 17:38 ?583次閱讀
    GIC<b class='flag-5'>中斷</b> redistributor介紹

    RK3568外部IO中斷示例

    ?外部IO中斷介紹本篇文章以萬象奧科HD-RK3568-IOT評(píng)估板GPIO30為例,介紹Linux內(nèi)核中斷的注冊方法,使用中斷的方式檢測GPIO30是否出現(xiàn)上升沿信號(hào)。
    的頭像 發(fā)表于 11-03 13:56 ?835次閱讀
    RK3568外部IO<b class='flag-5'>中斷</b><b class='flag-5'>示例</b>

    STM8中斷優(yōu)先級(jí)怎么設(shè)置?

    STM8中斷優(yōu)先級(jí)怎么設(shè)置
    發(fā)表于 10-25 06:49