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

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

3天内不再提示

多系统中断路由的9种示例

冬至子 来源:我是Trustonic 作者:周贺贺 2023-09-01 17:31 次阅读

说明:
本文不考虑EL2,默认NS-EL2、S-EL2都是disabled的
本文以Armv9-aarch64、Armv8-aarch64为基准,不讨论aarch32的情况
中断控制器以gicv3/gicv4为例,不讨论其它中断控制器和gicv2。

前置条件

我们先补充几个概念:

(1)CPU有三种执行环境(Runtime):

  • CPU执行在ATF
  • CPU执行在REE
  • CPU执行在TEE

image.png

(2)而对于中断,有3种分类:

  • NS-Group 1 :想给REE处理的中断
  • S-Group 1 :想给TEE处理的中断
  • Group 0:想给ATF处理的中断

所以呢,就出现9种情况:

  • (1)CPU执行在REE时,来了一个NS-Group 1中断,想给REE处理的中断
  • (2)CPU执行在ATF时,来了一个NS-Group 1中断,想给REE处理的中断
  • (3)CPU执行在TEE时,来了一个NS-Group 1中断,想给REE处理的中断
  • (4)CPU执行在TEE时,来了一个S-Group 1中断,想给TEE处理的中断
  • (5)CPU执行在ATF时,来了一个S-Group 1中断,想给TEE处理的中断
  • (6)CPU执行在REE时,来了一个S-Group 1中断,想给TEE处理的中断
  • (7)CPU执行在ATF时,来了一个Group 0中断,想给ATF处理的中断
  • (8)CPU执行在TEE时,来了一个Group 0中断,想给ATF处理的中断
  • (9)CPU执行在REE时,来了一个Group 0中断,想给ATF处理的中断

那么接下来,我们就开始分析,这9种情况,在整个多系统的软硬件架构中,是如何设计、如何处理的。

1、CPU执行在REE时,来了一个NS-Group 1中断

CPU执行在REE时,来了一个NS-Group 1中断,想给REE处理的中断。

在REE执行过程中,当发生一个来自NS-Group 1的中断时,旨在传递给REE处理。鉴于当前CPU处于非安全状态且中断类型为NS-Group 1,因此该中断被标记为IRQ。此时,由于SCR_EL3.IRQ的值为0,所以此IRQ将会被路由至EL1。这一路由机制十分简洁明了,直接将IRQ传递,使得CPU会进入Linux Kernel的异常向量表中的irq向量,从而进行处理。

image.png

2、CPU执行在ATF时,来了一个NS-Group 1中断

CPU执行在ATF时,来了一个NS-Group 1中断,想给REE处理的中断。

透过事物看本质,我们可以理解这是一种想给REE处理的中断,因此最终目标是将CPU重新路由回REE,使其能够正确处理此中断。

接下来,我们将探讨软硬件设计问题。当CPU处于ATF执行状态时,PSTATE.I和PSTATE.F都被屏蔽(MASK),因此,此时CPU不会响应任何中断,所有产生的中断都将保持在待处理状态。只有在CPU从EL3切换回EL3以下状态时,且PSTATE.F/I解除屏蔽(unmasked)时,待处理的中断才会被taken。

考虑到CPU从EL3切换到EL3以下状态有两种路径,因此,我们需要对此进行分组讨论:

  • 当CPU从EL3返回到REE端时,情况等同于“CPU处于REE执行状态,此时发生一个NS-Group 1中断”,这会直接触发将中断传递到Linux内核中的IRQ,使Linux内核能够继续处理此中断。
  • 当CPU从EL3返回到TEE端时,情况等同于“CPU处于TEE执行状态,此时发生一个NS-Group 1中断”,这时将会重复执行第3小节所述的中断路由步骤。

image.png

3、CPU执行在TEE时,来了一个NS-Group 1中断

CPU执行在TEE时,来了一个NS-Group 1中断,想给REE处理的中断。

透过事物看本质,我们可以理解这是一种想给REE处理的中断。因此,你的软硬件协同设计的最终目标是将CPU拉回到REE,让REE处理这个中断。

我们接着关注软硬件的设计。由于当前CPU运行在安全状态,中断类型为NS-Group 1,因此中断被标记为FIQ。然而,考虑到此刻的SCR_EL3.IRQ=0,所以这个FIQ将会被路由至EL1。CPU进入TEE OS的异常向量的FIQ向量,在fiq_handler的实现中,未读取中断IAR就调用了smc。这采用了一种主动的软件调用方式,将CPU切回了ATF。ATF察觉到这是一个中断转换过来的情况,因此继续将CPU切换回REE。在此过程中,该中断一直保持为挂起状态。

当CPU被重新引导回REE后,由于此时CPU运行在非安全状态,中断类型仍为NS-Group 1,所以该中断被重新标记为IRQ。随之而来的是重新触发中断,该中断被target至EL1,与下图中的步骤4对应。在中断处理完成后,依次将CPU拉回TEE,使其回到被打断的位置。

image.png

4、CPU执行在TEE时,来了一个S-Group 1中断

CPU执行在TEE时,来了一个S-Group 1中断,想给TEE处理的中断。

由于当前CPU运行在Secure Security State、中断类型为S-Group 1中断,所以该中断被标记为IRQ,由于此时SCR_EL3.IRQ=0,所以该中断被标记为IRQ,并被target到EL1。所以这种路由很干脆直接,将直接产生IRQ,让CPU进入TEE OS的异常向量表的irq向量去处理。

image.png

5、CPU执行在ATF时,来了一个S-Group 1中断

CPU执行在ATF时,来了一个S-Group 1中断,想给TEE处理的中断。

我们透过事物看本质,这是想给TEE处理的中断,所以最终的结果,一定是要把CPU拉回到TEE,让TEE去处理这个中断。

接下来我们讨论软硬件设计,CPU执行在ATF的时候,此时PSTATE.I和PSTATE.F都是MASK的,所以此时不会taken任何中断,一切产生的中断将处于pending状态。当CPU从EL3切回EL3以下的时候,PSTATE.F/I unmasked的时候,此时pending的中断才会被taken。由于CPU从EL3切换EL3以下有两条路径,所以我们需要分组讨论一下:

  • 当CPU从EL3往REE侧返回后,此时条件等同于“CPU执行在REE时,来了一个S-Group 1中断”,此时会将第6小节的中断路由步骤全部再走一遍。
  • 当CPU从EL3往TEE侧返回后,此时条件等同于“CPU执行在TEE时,来了一个S-Group 1中断”,也就是将直接产生target到TEE O中的irq,让TEE继续处理这个中断。

image.png

6、CPU执行在REE时,来了一个S-Group 1中断

CPU执行在REE时,来了一个S-Group 1中断,想给TEE处理的中断.

我们透过事物看本质,这是想给TEE处理的中断,所以最终的结果,你的软硬件协同的设计,一定是要把CPU拉回到TEE,让TEE去处理这个中断。

我们再来看软硬件的设计,由于当前CPU运行在Non Secure Security State、中断类型为S-Group 1中断,所以该中断被标记为FIQ,由于此时SCR_EL3.IRQ=1,所以该FIQ将被target到EL3。CPU 进入 ATF的异常向量的FIQ向量,在ATF的fiq_handler实现中,它会继续进行中断转发,转发到TEE OS中特定的入口(这里与TEE OS厂商设计相关,不同厂商有不同的实现),进入TEE OS后,真正处理这个中断,处理完毕后,再依次返回。

image.png

7、CPU执行在ATF时,来了一个Group 0中断

CPU执行在ATF时,来了一个Group 0中断,想给ATF处理的中断。

CPU执行在ATF的时候,此时PSTATE.I和PSTATE.F都是MASK的,所以此时不会taken任何中断,一切产生的中断将处于pending状态。当cpu从EL3切回EL3以下的时候,PSTATE.F/I unmasked的时候,此时pending的中断才会被take。由于CPU从EL3切换EL3以下有两条路径,所以我们需要分组讨论一下:

  • 当CPU从EL3往REE侧返回后,此时条件等同于“CPU执行在REE时,来了一个Group 0中断”,此时会将第9小节的中断路由步骤全部再走一遍。
  • 当CPU从EL3往TEE侧返回后,此时条件等同于“CPU执行在TEE时,来了一个Group 0中断”,此时会将第8小节的中断路由步骤全部再走一遍。

image.png

8、CPU执行在TEE时,来了一个Group 0中断

CPU执行在TEE时,来了一个Group 0中断,想给ATF处理的中断.

此时根据中断类型为Group 0,该中断将被标记为FIQ,根据SCR_EL3.FIQ=0,该fiq将直接被target到EL1,在tee中的fiq_handler中,将采取软件主动方式将CPU切回ATF,进入ATF后,该中断仍不会被taken,因为此时PSTATE.I/R都是masked的。直至CPU再返回REE端的时候,将重新产生target到EL3的FIQ,那时中断才会被处理。

image.png

9、CPU执行在REE时,来了一个Group 0中断

CPU执行在REE时,来了一个Group 0中断,想给ATF处理的中断。

由于是Group0中断,中断将被标记为FIQ,又由于SCR_EL3.FIQ=1,FIQ将被直接target到EL3,进入ATF的异常向量表的fiq向量进行处理。

image.png

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

    关注

    2

    文章

    131

    浏览量

    43682
  • ARM处理器
    +关注

    关注

    6

    文章

    346

    浏览量

    41323
  • 中断处理
    +关注

    关注

    0

    文章

    92

    浏览量

    10890
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • 中断控制器
    +关注

    关注

    0

    文章

    59

    浏览量

    9373
收藏 人收藏

    评论

    相关推荐

    Aurix的DMA硬件请求源自于中断路由模块,请问是否支持一个外设请求(中断)对应多个DMA通道?

    Aurix的DMA硬件请求源自于中断路由模块,请问是否支持一个外设请求(中断)对应多个DMA通道?
    发表于 01-26 07:15

    [求助]如何判断路由器电源适配器的进出接线?

    [求助]如何判断路由器电源适配器的进出接线?各位大大,小弟请教一事。天热,改装路由器,加风扇,拆了电源适配器,220v转9v,1a的不小心把拆后的塑料外壳弄丢,只剩下一个里面的线圈,一时大意剪断
    发表于 07-06 22:10

    请教一下汽车can总线路由表中的信号路由、报文路由和诊断路由中各个参数的设置要求规则?

    本帖最后由 zhshw12345 于 2017-10-17 22:00 编辑 请教一下各位汽车电子大牛,汽车can路由表中的信号路由、报文路由和诊断路由中各个参数的设置要求规则,
    发表于 10-16 21:34

    怎么实现基于嵌入式Linux平台的协议路由器的设计?

    本文介绍在分级Ad Hoc网络中协议路由器的地位及功能,在此基础上提出一协议路由器设计方案。结合设计方案,介绍实现方案中所采用的Mot
    发表于 06-07 06:12

    中断系统的外部中断示例

    中断系统(2)–外部中断示例1.想实现的目标2.分析3.代码#include#include***it LED1=P1^0;***it LED2=P1^1; //对两个led灯进行位定
    发表于 12-07 13:33

    中断系统的相关资料推荐

    中断系统TC27x中断系统框图TC27x中的中断系统中断路
    发表于 02-22 06:38

    PCI中断机制分析

    PCI中断机制分析:PCI 总线有四条中断线,所有PCI 设备共同使用这四条线向系统申请中断,中断请求经可编程
    发表于 06-28 19:21 26次下载

    从Flash和SRAM中触发中断的过程示例

    使用LPC2106的Timer 1 进行的简单的中断处理。示例代码中Timer1分为FIQ和IRQ,用户可以从Flash或者SRAM中运行这些代码。
    发表于 09-28 11:29 2667次阅读

    单片机学习##中断系统(2)--外部中断示例

    中断系统(2)–外部中断示例1.想实现的目标2.分析3.代码#include<reg52.h>#include<intrins.h>sbit
    发表于 11-24 16:21 3次下载
    单片机学习##<b class='flag-5'>中断</b><b class='flag-5'>系统</b>(2)--外部<b class='flag-5'>中断</b><b class='flag-5'>示例</b>

    Arduino中断学习

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Arduino中断一、外部中断学习1、Arduino 开发板的外部中断引脚2、一个从轮询到中断的代码改进1) 轮
    发表于 12-16 16:47 3次下载
    Arduino<b class='flag-5'>中断</b>学习

    AURIX系列之TC275学习笔记(五):中断系统

    中断系统 TC27x中断系统框图TC27x中的中断
    发表于 12-27 19:20 18次下载
    AURIX系列之TC275学习笔记(五):<b class='flag-5'>中断</b><b class='flag-5'>系统</b>

    MPC82G516 MCU的串行UART中断示例代码

    MPC82G516 MCU的串行UART中断示例代码
    发表于 06-30 17:32 0次下载
    MPC82G516 MCU的串行UART<b class='flag-5'>中断</b><b class='flag-5'>示例</b>代码

    51单片机中断程序示例

    51单片机中断程序示例
    发表于 05-17 18:03 0次下载

    硬件中断事件的示例

    根据硬件中断模块触发的示例来说明 S7-1500 CPU 中面向事件的程序执行的功能原理。
    的头像 发表于 08-29 09:45 628次阅读
    硬件<b class='flag-5'>中断</b>事件的<b class='flag-5'>示例</b>

    时间中断函数的编程示例

    在以下示例中,将读取延时中断 OB (OB20) 的状态,设置新的延时并启动或禁用 OB20。
    的头像 发表于 09-01 09:47 629次阅读
    时间<b class='flag-5'>中断</b>函数的编程<b class='flag-5'>示例</b>