baron · 1月14日

ARM gicv3/gicv4的总结-基础篇

目录
1、gic的版本
2、GICv3/gicv4的模型图
3、gic中断号的划分
4、GIC连接方式
5、gic的状态
6、gic框架
7、gic Configuring
推荐

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, armv8/armv9,trustzone/tee,secureboot,资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。image.png
97f572a354283f556608511eb2189a46dd030e.png
1、gic的版本
GIC是一个为Cortex-A和Arm Cortex-R设计的标准的中断控制器
d76ca52949440696d3c14577e38cda72f2931f.png
2、GICv3/gicv4的模型图
e900a6e23664c210df72405eea514115338549.png
3、gic中断号的划分
Shared Peripheral Interrupt (SPI)

Private Peripheral Interrupt (PPI)

Software Generated Interrupt (SGI)

Locality-specific Peripheral Interrupt (LPI)
d8ff67273c41a70e2205036cdf569cce726c9d.png
(使用示例)
c7926b81221ee0f31d7871ef455fdb02f76bb3.png
4、GIC连接方式
b2aaba180b74804345b06360a6cefb121a7a3c.png
5、gic的状态
b49334459ef236c6b9a0463505e4a57078df1e.png
中断的生命周期:
对于电平触发的中断(level-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线保持高电平直到PE断言该中断信号.
对于边沿触发的中断(edge-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线不会保持高电平.
01d2c2899acba181913728d032fc60621d2020.png
6、gic框架
• Distributor interface
• Redistributor interface
• CPU interface
a2e759c31e84b2128a0864a8c3775a0529b180.png
Distributor (GICD_*) for SPIs
• Interrupt prioritization and distribution of SPIs
• Enable and disable SPIs
• Set the priority level of each SPI
• Route information for each SPI
• Set each SPI to be level-sensitive or edge-triggered
• Generate message-signaled SPIs
• Control the active and pending state of SPIs
• Determine the programmer’s model that is used in each Security state: affinity routing or legacy

Redistributors (GICR_*)
• Enable and disable SGIs and PPIs
• Set the priority level of SGIs and PPIs
• Set each PPI to be level-sensitive or edge-triggered
• Assign each SGI and PPI to an interrupt group
• Control the state of SGIs and PPIs
• Control the base address for the data structures in memory that support the associated interrupt properties and pending state for LPIs
• Provide power management support for the connected PE

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

In Arm CoreLink GICv3, the CPU Interface registers are accessed as System registers: ICC_*_ELn.

7、gic Configuring
全局配置
GICD_CTLR.ARE: Enable Affinity routing (ARE bits), 1-使用gicv3 mode,0-使用legacy mode(gicv2 mode). 默认为1
GICD_CTLR.EnableGrp1S
GICD_CTLR.EnableGrp1NS
GICD_CTLR.EnableGrp0

注意在GIC-600 does not support legacy operation

(Redistributor)Settings for each PE
Redistributor中包含了一个GICR_WAKER寄存器,用于记录connected PE的状态是onLine还是offline. 如果让PE变成online,软件则必需这样做:
• Clear GICR_WAKER.ProcessorSleep to 0.
• Poll GICR_WAKER.ChildrenAsleep until it reads 0

如果PE is offline (GICR_WAKER.ProcessorSleep==1)时,来了一个中断target到该PE上,将产一个wake request信号,这个信号连接PE的power controller,该controller将会打开PE。然后PE clear the ProcessorSleep bit
image.png
CPU interfaces (ICC_*_ELn)

SRE bit— enable cpu interface
注:有些处理器可能不支持legacy operation,SRE比特位也是固定为1,那么软件就不需要处理该比特了

Set Priority Mask and Binary Point registers
ICC_PMR_EL1、ICC_BPRn_EL1

Set EOI mode (EOI:End of interrupt)
ICC_CTLR_EL1 and ICC_CTLR_EL3

Enable signaling of each interrupt group
ICC_IGRPEN1_EL1 (banked by Security state)
ICC_IGRPEN0_EL1

PE configuration

Routing controls - SCR_EL3 、 HCR_EL2
Interrupt masks - PSTATE
Vector table - VBAR_ELn
f48d7fb555b60db04c9029d7b85fe6a3c9bebe.pngb8f7ffb61c17aa7aec6605a5704482aa71d974.pnge9ad1ed6273689a63cd707cf216a79264c9e41.png
interrupt sources configuration

SPIs are configured through the Distributor, using the GICD_* registers.
PPIs and SGIs are configured through the individual Redistributors, using the GICR_* registers
对于每一个中断,软件必需配置的:

Priority: GICD_IPRIORITYn, GICR_IPRIORITYn
Group: GICD_IGROUPn, GICD_IGRPMODn, GICR_IGROUPn, GICR_IGRPMODn
Edge-triggered or level-sensitive: GICD_ICFGRn, GICR_ICFGRn
Enable: GICD_ISENABLERn, GICD_ICENABLER, GICR_ISENABLERn, GICR_ICENABLERn
e6399b1764ed12193c0744ffaf570afbeaaade.png
Setting the target PE for SPIs

GICD_IROUTERn.Interrupt_Routing_Mode == 0 rounting到制定的PE
GICD_IROUTERn.Interrupt_Routing_Mode == 1 Distributor硬件会自动选择一个PE,可以是0-n
A PE can opt out of receiving 1-of-N interrupts. This is controlled by the DPG1S, DPG1NS and DPG0 bits in GICR_CTLR.
05781f2777b9449a065797c9a42dbbf818a4dc.pnge60ab7a85b5cf5d545f71912b22826ae45e226.png
Routing a pending interrupt to a PE

Check that the group associated with the interrupt is enabled
Check that the interrupt is enabled
Check the routing controls to decide which PEs can receive the interrupt.
routing is controlled by GICD_IROUTERn,An SPI can target one specific PE, or any one of the connected PEs
Check the interrupt priority and priority mask to decide which PEs are suitable to handle the interrupt
Each PE has a Priority Mask register, ICC_PMR_EL1, in its CPU interface
Check the running priority to decide which PEs are available to handle the interrup
Only an interrupt with a higher priority than the running priority can preempt the current interrupt
软件读取中断号
750bebd187bb80670a786844925527c3706244.png
中断优先级
c77646618e862bde4091833e0f9832da7b141a.png
中断结束End of interrupt

Priority drop - 将中断优先级降到中断产生之前的值
Deactivation - 将中断从active变成inactive
在gicv3中,drop和deactivation通常是一起打开的。

ICC_CTLR_ELn.EOImode = 1: 通过写ICC_EOIR0_EL1、ICC_EOIR1_EL1让drop and deactivation同时生效
ICC_CTLR_ELn.EOImode = 0: 通过写ICC_EOIR0_EL1、ICC_EOIR1_EL1让drop生效,写ICC_DIR_EL1让deactivation生效,这在虚拟化中会用到.

大多数的软件系统中 EOIMode0,而下hypervisor的系统中 EOIMode1

中断号的状态
566fdfc622f21cf7439951e9327a0644b4ea74.png
产生SGI中断
f9aa3ba71f085a364c53652be530a18e3ca4f4 (1).pnge2f5b39238a6f598cb7882bbde7faf81fcc7f2.png
PE在secure执行时,可以产生secure和non-secure的SGI;

PE在non-secure执行时,也是可以产生secure的SGI,但是取决于GICR_NSACR寄存器的配置,该寄存器只能在secure中读写
a9a8d8d8419753ede297266af55b85cb30996c.png
比较GICv3和GICv2
在gicv2中,SGI INTIDs对于originating PE和the target PE是banked
在gicv3中,SGI仅仅对target PE是banked

在gicv2中同时收到两个SGI=5中断,两个中断都会被PE处理。
而在gicv3上,由于originating不是banked,所有前一个SGI=5中断将会丢失。PE只能收到一个

Legacy operation

When ARE0, affinity routing is disabled (legacy operation)
When ARE1, affinity routing is enabled (GICv3 operation)

48f67dd5077c94253c01000ee03b119f2544f2.png
推荐
ARMv8/ARMv9架构从入门到精通 --博客专栏
《Armv8/Armv9架构从入门到精通 第二期》 --大课程
8天入门ARM架构 --入门课程
添加威♥:sami01_2023,回复ARM中文,领取ARM中文手册

推荐阅读
关注数
9499
文章数
277
vx: coding_the_world
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息