在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

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

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

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

環境配置:linux/optee雙系統環境下, linux系統的SCR.IRQ=0、SCR.FIQ=1, optee系統的SCR.IRQ=0、SCR.FIQ=0

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

1、當cpu處于REE,來了一個非安全中斷

當cpu處于normal側時,來了一個非安全中斷,根據SCR.NS=1/中斷在group1組,cpu interface將會給cpu一個IRQ,(由于SCR.IRQ=0,IRQ將被routing到EL1),cpu跳轉至linux的irq中斷異常向量表, 處理完畢后再返回到normal(linux)側.

2、當cpu處于TEE,來了一個安全中斷

當cpu處于secure側時,來了一個安全中斷,根據SCR.NS=0/中斷在secure group1組,cpu interface將會給cpu一個IRQ,(由于SCR.IRQ=0,IRQ將被routing到EL1),cpu跳轉至optee的irq中斷異常向量表, 處理完畢后再返回到secure(optee)側.

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

3、當cpu處于TEE,來了一個非安全中斷

當cpu處于secure側時,來了一個非安全中斷,根據SCR.NS=0/中斷在group1組,cpu interface將會給cpu一個FIQ,(由于SCR.FIQ=0,FIQ將被routing到EL1),跳轉至optee的fiq中斷異常向量表,再optee的fiq處理函數中,直接調用了smc跳轉到ATF, ATF再切換至normal EL1(linux), 此時SCR.NS的狀態發生變化,根據SCR.NS=1/中斷在group1組,cpu interface會再給cpu發送一個IRQ異常,cpu跳轉至linux的irq中斷異常向量表,處理完畢后,再依次返回到ATF---返回到optee

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

4、當cpu處于REE,來了一個安全中斷

當cpu處于normal側時,來了一個安全中斷,根據SCR.NS=0/中斷在group1組,cpu interface將會給cpu一個FIQ,(由于SCR.FIQ=1,FIQ將被routing到EL3),在EL3(ATF)中,判斷該中斷是需要optee來處理的,會切換到optee。此時SCR.NS的狀態發生變化,根據SCR.NS=0/中斷在secure group1組,cpu interface會再給cpu發送一個IRQ異常,cpu跳轉至optee的irq中斷異常向量表, 處理完畢后再依次返回到ATF---返回到linux

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

5、當cpu處于ATF時,來了一個安全中斷或非安全中斷(G1NS、G1S)

當cpu處于EL3時,來得任何target到EL3的中斷,都將被標記位FIQ

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

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

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

所以在 linux系統的SCR.IRQ=0、SCR.FIQ=1, optee系統的SCR.IRQ=0、SCR.FIQ=0的場景下,總結如下,當cpu運行在EL3時:

  • SCR_EL3為optee的cpu context時,來了一個G1S,中斷將不會被taken

  • SCR_EL3為optee的cpu context時,來了一個G1NS,中斷將不會被taken

  • SCR_EL3為linux的cpu context時,來了一個G1S,中斷將會直接target到EL3

  • SCR_EL3為linux的cpu context時,來了一個G1NS,中斷將不會被taken

6、當cpu處于EL3/EL2/EL1/EL0時,來了一個ATF(group0)中斷(G0)

當cpu處于EL3/EL2/EL1/EL0時,來了一個G0中斷,中斷將被標記位FIQ

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

在 linux系統的SCR.IRQ=0、SCR.FIQ=1, optee系統的SCR.IRQ=0、SCR.FIQ=0的場景下,總結如下:

  • 當cpu正在Non-secure EL0/1/2運行時,來了G0中斷,中斷被標記為FIQ,直接target到EL3

  • 當cpu正在secure EL0/1/2運行時,來了G0中斷,中斷被標記為FIQ,中斷target到了EL0/1/2,在該程序的fiq_offset會調用smc將cpu切回到EL3,到了EL3之后,中斷不會被taken, 會繼續返回到Non-secure EL0/1/2,然后cpu interface重新給core發送FIQ,接著又是直接target到EL3,EL3處理該中斷。

  • 當cpu正在EL3時,來了一個G0中斷,中斷會被標記為FIQ,中斷target到EL3。

7、思考-中斷流程舉例:在TEE側時產生了FIQ,回到REE后為啥又產生了IRQ

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

首先我們了解下中斷優先級,在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掌管著中斷優先級和將IRQ/FIQ發送給ARM Core.

我們以Level sensitive interrupts的中斷為例,先不考慮active and pending的情況:CPU interface發送給Core后,中斷狀態變為pending,當Core acknowledge中斷后(PE跳轉到中斷向量表), 中斷狀態變為active,當中斷退出后,Cpu interface會再次將優先級最高的中斷發送給Core,Core處理下一個中斷。

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

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

重點來了,在中斷退出的時候,軟件中一般會有Priority drop和Deactivation,既要么將中斷優先級降低,要么將中斷變為inactive,那么中斷退出之后,cpu interface感知到的優先級最高的中斷,就可能不會是此中斷了,一切運行正常,符合業務.....

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

8、思考-G1NS G1S G0都有可能產生target到EL3的FIQ,如何區分?

其實在我們的linux系統的SCR.IRQ=0、SCR.FIQ=1, optee系統的SCR.IRQ=0、SCR.FIQ=0的場景下,不考慮aarch32的情況,有兩種情況會產生target到EL3的FIQ:

  • (1)cpu在EL0/1/2運行時,來了一個G0中斷,最終CPU將會進入到EL3的向量表中的第三組向量表。

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

  • (2)ccpu在EL3運行時,來了一個G0中斷,最終CPU將會進入到EL3的向量表中的第二組向量表 不過很遺憾,ATF中的向量表中未實現第二組向量表。那么為什么不需要實現呢?在ATF/docs/firmware-design.md中找到了答案, 原來是在進入ATF之前,disable了所有的exception,ATF又沒有修改PSTATE.DAIF,所有在ATF Runtime時 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運行時(Linux側的SCR_EL3.FIQ=1的情況下),來了一個G1S中斷,CPU將會target到EL3的向量表中的第三組向量表。

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

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

我們應該會用到1020,那么用在哪里的呢?請看上述匯編代碼bl platicgetpendinginterrupttype的具體實現:


	
  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. }

其實就是在讀取pending的中斷號,看看有沒有1020或1021,從而獲得此次的中斷是從secure或non-secure過來的,還是在EL3產生的。然后走相應的邏輯。

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

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

以下是這些比特位的路由規則的總結:

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

我們學習了其原理之后,我們再看4個示例:(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

審核編輯 :李倩


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

    關注

    68

    文章

    10863

    瀏覽量

    211781
  • Linux
    +關注

    關注

    87

    文章

    11304

    瀏覽量

    209521
  • 中斷
    +關注

    關注

    5

    文章

    898

    瀏覽量

    41502

原文標題:armv8/armv9中斷系列詳解-中斷示例展示

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于Armv9架構的MediaTek天璣8400移動芯片問世

    如今,基于 Armv9 CPU 技術構建的人工智能 (AI) 旗艦智能手機立于技術前沿,為 AI 創新提供了前所未有的機遇。為了應對持續增長的 AI 工作負載的計算強度及復雜度,Armv9.2 CPU 集群帶來了更強性能、更高效率,以及更多功能,為新一代 AI 奠定了扎實
    的頭像 發表于 12-24 14:18 ?134次閱讀

    西門子博途中循環中斷功能的編程示例

    在以下示例,將讀取循環中斷 OB (OB31) 的相位和循環時間,并設置一個新的循環時間。
    的頭像 發表于 10-28 10:11 ?965次閱讀
    西門子博途中循環<b class='flag-5'>中斷</b>功能的編程<b class='flag-5'>示例</b>

    Armv9 CPUSVE2的實際用例

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

    stm32怎樣觸發軟件中斷

    了解STM32中斷系統 STM32微控制器具有豐富的中斷系統,包括NVIC(嵌套向量中斷控制器)和SYSTICK定時器。NVIC可以處理多達240個中斷源,包括外部
    的頭像 發表于 09-02 09:32 ?882次閱讀

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

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

    armv8在啟動剛開始時調用了關中斷,一直到切換第一個線程,在哪里開啟的中斷呢?

    例如當前使用的armv8芯片,在啟動剛開始時調用了關中斷,一直到切換第一個線程,在哪里開啟的中斷呢? int rtthread_startup(void
    發表于 07-04 07:00

    移動端芯片性能提升,Armv9架構新升級引發關注

    “數碼博主”5月17日的最新爆料指出,聯發科積極推進Armv9新一代IP BLACKHAWK“黑鷹”的架構設計,預計天璣9400芯片將采用這一架構,有望以“全大核”設計再度領跑移動SoC CPU性能榜單。
    的頭像 發表于 05-17 16:51 ?1020次閱讀

    STM8S TIM4中斷一開,程序異常怎么解決?

    |= (uint8_t)(0x01);//使能TIM4中斷 void main() { 。。。。。 __enable_interrupt(); while(1) { if(UART1->
    發表于 04-28 06:52

    請問tim2中斷函數里怎么觸發tim1的中斷

    tim2中斷函數里怎么觸發tim1的中斷
    發表于 04-10 06:37

    STM32中斷分組及外部中斷的配置過程分享

    STM32中斷分組   STM32 的每一個GPIO都能配置成一個外部中斷觸發源,這點也是 STM32 的強大之處。STM32 通過根據引腳的序號不同將眾多中斷觸發源分成不同的組,比如:PA0
    發表于 04-08 08:05

    使用stm8l的外部中斷的pin7的中斷,進行中斷處理時會立刻造成新的pin7中斷,會有什么影響嗎?

    使用stm8l的外部中斷的pin7的中斷,進行中斷處理時會立刻造成新的pin7中斷,會有什么影響嗎?目前可以看到的結果是該pin7
    發表于 04-07 09:05

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發送數據無法進入中斷的原因?

    N76E003開了一個定時器0中斷和串口0中斷,兩個中斷打開后,串口發送數據無法進入中斷,單獨使用沒有什么問題,還望各位指教
    發表于 01-17 06:44

    M0516中斷優先級怎么設置?

    新唐M0516中斷優先級的設置,有沒有示例,沒找到相關接口,謝謝!
    發表于 01-16 07:25

    s3c2410中斷控制模塊的中斷源狀態寄存器是?

    S3C2410是一款由三星電子公司設計的具有多種功能的嵌入式處理器。其中的中斷控制模塊用于管理系統的中斷請求和中斷服務程序。在S3C2410中斷
    的頭像 發表于 01-05 17:28 ?739次閱讀

    stm32中斷怎么處理的

    STM32是一款非常強大的微控制器系列,具有豐富的外設和功能。中斷是STM32非常重要的部分,能夠幫助我們提高系統的響應速度和效率。本文將詳細介紹STM32中斷的處理方法。 一、
    的頭像 發表于 01-02 17:35 ?2591次閱讀
    主站蜘蛛池模板: 三级第一页| 久久精品人| 国产农村妇女毛片精品久久| 午夜精品久久久久久影视riav | 天天操天天插| 91pao强力打造免费高清| 特黄特色的大片观看免费视频| 国产亚洲第一伦理第一区| 久久福利网| 亚洲图片综合区另类图片| 久久99免费| 国产女同| 无遮挡很爽很污很黄在线网站| 国产色爽女小说免费看| 黄色免费网站视频| 亚洲国产综合人成综合网站00| 国产三级黄色录像| 26uuu另类亚洲欧美日本一| 兔费看全黄三级| 99se亚洲综合色区| 在线观看国产一级强片| 日本特黄特色| 人人干人人搞| 亚洲合集综合久久性色| 播五月婷婷| 在线一区观看| 看一级特黄a大片日本片| 激情视频综合网| 天堂在线视频网站| 五月天婷婷视频在线观看| 黄蓉吕文德欲乱系列小说| 国产色丁香久久综合| 日本69xxxxxxxx69| 欧美午夜大片| 国产小视频在线高清播放| 天天摸日日添狠狠添婷婷| 一级特黄高清完整大片| 男女免费观看视频| 国产精品视频一区国模私拍| 看黄在线| 久久亚洲免费视频|