【转】ARM GIC中断系列(七):gicv3架构-two secure state、中断bypass

1、two secure state

gicv3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。。

这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。

一、中断线的映射

当gic架构,使用gicv3后,中断的传递,和gicv2有所区别。

gicv3中,将cpu interface从gic中抽离,放入到了cpu中,cpu interface通过gic stream接口,与gic进行通信。

当gic要发送中断,gic通过gic stream接口,给cpu interface发送中断命令,cpu interface收到中断命令后,根据中断线映射配置,决定是通过IRQ还是FIQ管脚,向cpu发送中断。

而中断线映射配置,要根据中断的分组以及当前cpu所处的EL以及seucre状态,来决定。

二、2种安全状态中断线映射

当gic支持2种安全状态,EL3是AArch64和AArch32,映射情况不同

1、EL3是AArch64

当EL3是AArch64时,映射如下:

在这里插入图片描述

  • 对于group0中断,中断线均映射到FIQ
  • 对于group1安全中断,secure EL1或EL0,中断线映射到IRQ,其他EL映射到FIQ
  • 对于group1非安全中断,secure EL1或EL0以及EL3,中断线映射到FIQ,其他EL映射到IRQ(脑子里一定要有)

(其实为什么要给安全使用FIQ,这是因为平时的操作还是都是运行在REE的环境之中的,希望安全的操作都是很快的,不只是中断的处理,包括cpu的时候,在进入到安全世界的环境中,运行操作的性能cpu都会全力以赴,尽快完成任务。至于这个具体在哪里看到的,我有点搞忘了。找到了的时候我就来这里补上!)

2、EL3是AArch32

当EL3是AArch32时,映射如下:

在这里插入图片描述

  • 对于group0中断,中断线均映射到FIQ
  • 对于group1安全中断,secure EL0和EL3,中断线映射到IRQ,其余EL映射到FIQ
  • 对于group1非安全中断,secure EL0和EL3,中断线映射到FIQ,其余EL映射到IRQ

(其实造成这样的差异是因为32其实本身的安全等级和64的划分还是有点区别,专栏里有篇文章可以看一下,搜索32)

三、1种安全状态中断线映射

在这里插入图片描述

  • group0中断线,直接映射到FIQ
  • group1中断线,直接映射到IRQ

四、GICD寄存器

在GICD中的GICR_CTLR寄存器的DS bit,表示是否支持2种安全模式。

该bit描述如下,如果0,表示支持2种安全状态,为1,表示不支持。

在这里插入图片描述

1、支持2种安全模式下GICD_CTLR

在支持2种安全模式下,GICD中寄存器会进行备份成2份,一份提供给secure访问,。一份提供给non-secure访问。

比如对于GICD_CTLR寄存器,secure访问,寄存器描述如下:

在这里插入图片描述
而如果是non-secure访问,其寄存器描述如下:

在这里插入图片描述

2、支持1种安全模式下GICD_CTLR

在1种安全模式下,寄存器描述如下,此时不论是non-secure访问,还是secure访问,都访问的同一个寄存器。

在这里插入图片描述
(其实这里说安全状态不太合适,应该成为执行状态。安全状态应该是: secure security/non-secure security/ Root/Realm四个)

2、中断bypass

在GICv2架构中,GIC与core之间,是直接通过irq,fiq管脚,传递中断信号。

但是在GICv3架构中,GIC通过gic stream接口向cpu interface传递中断信息,然后由cpu interface向core传递中断信息,而且,cpu interface被设计在了core当中。

GICv3支持中断bypass功能,以下是我画的一个框图:

在这里插入图片描述
对于core而言,中断有2种(不考虑虚拟中断),分别是IRQ和FIQ。 在ICC_SRE_ELx寄存器,有DFB和DIB bit,分别控制FIQ,IRQ是否bypass。

在这里插入图片描述
对于DIB bit的描述:

在这里插入图片描述
对于DFB bit的描述:

在这里插入图片描述
这2个bit,复位值都是0,表示系统在复位后,中断bypass功能是开启的,此时外部的中断信号,是直接输入到core中的。 当软件,关闭中断bypass后,此时,才是由cpu interface给core发送中断,而忽略掉外部发送的中断。 在gicv3架构描述中,提到了中断bypass功能,会受到下面几个配置的影响: 一个是,是否运行系统寄存器访问icc寄存器,也就是ICC_CTLR.SRE bit是否为高,如果允许系统寄存器访问icc寄存器,那么中断bypass功能是禁止的。 一个是,ICC_SRE寄存器,由当前设计中支持的最高EL级的ICC_SRE寄存器的DFB和DIB bit来控制。

在这里插入图片描述
最后一个,就是中断分组使能,也就是ICC_IGPREN0_EL1和ICC_IGRPEN1_EL1的enable bit。 如果需要开启中断bypass功能,那么需要将中断分组使能给关掉。

以下是FIQ中断bypass的伪代码:

在这里插入图片描述
IRQ的处理,和FIQ是一致的。

(这个功能从gicv2上来理解是绕过gic控制的。当时的cpu interface还在gic中,现在集成到了core上。增加了系统寄存器,gic通过专门的stream axi线与core interface交互,不占用axi总线。在gic这个bypass还是直接发到core?一般来说不会开,但是既然留着,肯定是有用的!!!)

在这里插入图片描述
(bypass就是不走interface,猜测就是圈出来的地方,通过配置这个门的其它位,让这个生效。)(有错请大佬指出)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值