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 interruptsSet 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

    文章

    10802

    浏览量

    210768
  • Linux
    +关注

    关注

    87

    文章

    11199

    浏览量

    208691
  • 中断
    +关注

    关注

    5

    文章

    895

    浏览量

    41343

原文标题:armv8/armv9中断系列详解-中断示例展示

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Armv9 CPUSVE2的实际用例

    随着每一代新产品的推出,Arm CPU 都会实现代际性能提升,并引入架构改进,以满足不断演进的计算工作负载的需求。本文将重点介绍三个用例,以展示 Armv9 CPU 的架构特性在实际场景中产
    的头像 发表于 10-21 09:54 181次阅读
    <b class='flag-5'>Armv9</b> CPU<b class='flag-5'>中</b>SVE2的实际用例

    ARM CORE支持中断嵌套吗?GIC中断控制器支持中断嵌套吗?

    在默认情况下,本文讲述的都是ARMV8-aarch64架构,gicv3, linux kernel 5.14
    的头像 发表于 08-07 09:29 565次阅读
    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 928次阅读

    STM32中断分组及外部中断的配置过程分享

    STM32中断分组   STM32 的每一个GPIO都能配置成一个外部中断触发源,这点也是 STM32 的强大之处。STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0
    发表于 04-08 08:05

    使用stm8l的外部中断的pin7的中断,进行中断处理时会立刻造成新的pin7中断,会有什么影响吗?

    使用stm8l的外部中断的pin7的中断,进行中断处理时会立刻造成新的pin7中断,会有什么影响吗?目前可以看到的结果是该pin7
    发表于 04-07 09:05

    M0516中断优先级怎么设置?

    新唐M0516中断优先级的设置,有没有示例,没找到相关接口,谢谢!
    发表于 01-16 07:25

    s3c2410中断控制模块的中断源状态寄存器是?

    S3C2410是一款由三星电子公司设计的具有多种功能的嵌入式处理器。其中的中断控制模块用于管理系统的中断请求和中断服务程序。在S3C2410中断
    的头像 发表于 01-05 17:28 627次阅读

    stm32中断怎么处理的

    STM32是一款非常强大的微控制器系列,具有丰富的外设和功能。中断是STM32非常重要的部分,能够帮助我们提高系统的响应速度和效率。本文将详细介绍STM32中断的处理方法。 一、
    的头像 发表于 01-02 17:35 2387次阅读

    ADE7753开启了过零中断和线周期中断,可是没有过零中断产生只有周期中断产生是为什么?

    开启了过零中断和线周期中断,可是没有过零中断产生,只有周期中断产生,用示波器测了channel2的两个管脚的波形是周期为20ms的正弦波。而读取电压寄存器一直是一个恒定的小值,无论有没
    发表于 12-27 07:05

    u-boot armv8链接脚本

    armv8,u-boot使用arch/arm/cpu/armv8/u-boot.lds进行链接。 u-boot-spl和u-boot-tpl使用arch/arm/cpu/armv8
    的头像 发表于 12-07 11:19 560次阅读

    armv8 u-boot的启动介绍

    先看arm官网提供的一张图: 上图详细概括了arm官方推荐的armv8的启动层次结构: 官方将启动分为了BL1,BL2,BL31,BL32,BL33阶段,根据顺序,芯片启动后首先执行BL1阶段代码
    的头像 发表于 12-07 11:09 1836次阅读
    <b class='flag-5'>armv8</b> u-boot的启动介绍

    Arm微架构学习—开启Armv9时代

    在上一篇文章“从A76到A78——在变化中学习Arm微架构”,我们了解了Arm处理器微架构的基本组成,介绍了Armv8架构最后几代经典处理器架构。
    的头像 发表于 11-27 16:46 1154次阅读
    Arm微架构学习—开启<b class='flag-5'>Armv9</b>时代

    中断流程分析与示例

    CPU在处理某一事件A时,发生了另一事件B的请求(中断请求);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被
    的头像 发表于 11-25 12:30 1909次阅读
    <b class='flag-5'>中断</b>流程分析与<b class='flag-5'>示例</b>

    什么是LInux 操作系统中断

    进程来持有CPU进行需要的操作! 有了中断之后,提升了操作系统的性能!可以异步并行处理很多任务! 软中断(80中断) 由CPU产生的;CPU检查到程序代码段发生异常会切换到内核态; 硬中断
    的头像 发表于 11-10 11:29 568次阅读
    什么是LInux 操作系统<b class='flag-5'>中断</b>