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

    文章

    10437

    浏览量

    206524
  • Linux
    +关注

    关注

    87

    文章

    10988

    浏览量

    206724
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41021

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

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

收藏 人收藏

    评论

    相关推荐

    u-boot armv8链接脚本

    u-boot armv8链接脚本 在进行源码分析之前,首先看看u-boot的链接脚本,通过链接脚本可以从整体了解一个u-boot的组成,并且可以在启动分析中知道某些逻辑是在完成什么工作
    的头像 发表于 12-07 11:19 243次阅读

    armv8 u-boot的启动介绍

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

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

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

    ARMv8工作模式有哪些

    ARMv8 工作模式 ARMv8 没有 Privilege level 的概念,取而代之的是 Exception level(异常级别),简称为EL,用于描述特权级别,一共有 4 个级别:EL0
    的头像 发表于 09-11 16:34 783次阅读
    <b class='flag-5'>ARMv8</b>工作模式有哪些

    ARMv7-A工作模式介绍

    TF-A 一开始是为 ARMv8 准备的,ARMv8 最突出的特点就是支持 64 位指令,但是为了兼容原来的 ARMv7,ARMv8提供了两种指令集:AAarch64 和 AArch3
    的头像 发表于 09-11 16:31 485次阅读
    <b class='flag-5'>ARMv</b>7-A工作模式介绍

    ARMv8-A TrustZone软件对实施SVE的系统的影响

    本文档介绍ARMv8-A[ARMv8]的可伸缩向量扩展[SVE]对在应用程序处理器上以安全状态执行的软件的影响。 本文档考虑了部署现有ARMv8-A TrustZone软件对实施SVE的系统的影响,并为实施SVE的系统更新该软件
    发表于 08-23 06:17

    ARM Cortex-A系列ARMv8-A程序员指南

    。 有关ARMv7-A架构的一般介绍,请参阅ARM®Cortex®-A系列程序员指南。 本指南还可以帮助您熟悉本卷讨论的一些概念。 然而,ARMv8-A架构配置文件向后兼容早期版本,
    发表于 08-22 07:22

    rk3588是armv8吗?rk3588硬件资料

    rk3588是armv8吗?rk3588 硬件资料 RK3588是一款高性能处理器,是Rockchip公司推出的最新芯片。本文将详细介绍RK3588的硬件资料。 首先,我们需要了解一下RK3588
    的头像 发表于 08-21 17:32 2054次阅读

    深入了解ARMv9对不可屏蔽中断的支持

    Arm A-profile 架构的有一个长期缺陷就是不支持不可屏蔽中断 (NMI) 。
    发表于 08-08 11:40 504次阅读
    深入了解<b class='flag-5'>ARMv9</b>对不可屏蔽<b class='flag-5'>中断</b>的支持

    如何使用CSAT调试Armv8平台

    本教程概述了如何使用CoreSight Access Tool执行低级调试(CSAT)与Armv8目标。低级调试允许您: •操作单个寄存器,包括不能正常访问的调试寄存器 应用程序级调试器。 •执行
    发表于 08-02 10:27

    ARMv8-M处理器故障处理和检测

    特定功能。ARMv8‑M处理器的体系结构包含故障通过异常处理功能,以及用于处理系统级的非屏蔽中断(NMI) 错误,例如,褐化检测。特定于实现的功能,如错误此处不包括存储器的纠正代码(ECC
    发表于 08-02 06:28

    Armv7和Armv8系统中跟踪的高级视图详解

    本指南主要介绍Armv7系统和Armv8系统中跟踪的高级视图,最高可达Armv8.4版本。 该指南涵盖: •跟踪是什么以及如何使用 •跟踪体系结构是如何定义的,以及它如何映射到不同的跟踪组件实现 •在Arm系统
    发表于 08-02 06:11

    ARMv8-M异常处理手册

    ARMv8-M异常模型描述了处理器如何响应异常与每个异常关联的属性,例如其优先级和异常返回行为。通常有一个异常处理程序与每个异常类型相关联。 ARMv8-M处理器与其他ARM处理器系列之间存在差异
    发表于 08-02 06:09

    Armv9核心A710、A715和A510微架构解读

    在介绍Armv9系列前,我们先看一下ARM的Cortex-X定制CPU计划。Cortex-X方案先于Armv9发布,在Arm发布A78时,同时也发布了Cortex-X1这一颗性能强大的CPU,后续大家习惯称之为超级大核。
    发表于 06-12 09:27 1.8w次阅读
    <b class='flag-5'>Armv9</b>核心A710、A715和A510微架构解读

    Armv9引入的MTE已成内存安全的新防线

    面世,如今更是完全融入了兼容Armv9架构的CPU中。   MTE 提供的内存安全保障   内存已经成了近几个世纪以来最大的漏洞来源之一
    的头像 发表于 06-01 00:11 1390次阅读