目录
- 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安全产品的设计和开发。
1、gic的版本
GIC是一个为Cortex-A和Arm Cortex-R设计的标准的中断控制器
2、GICv3/gicv4的模型图
3、gic中断号的划分
-
Shared Peripheral Interrupt (SPI)
-
Private Peripheral Interrupt (PPI)
-
Software Generated Interrupt (SGI)
-
Locality-specific Peripheral Interrupt (LPI)
(使用示例)
4、GIC连接方式
5、gic的状态
中断的生命周期:
对于电平触发的中断(level-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线保持高电平直到PE断言该中断信号.
对于边沿触发的中断(edge-sensitive interrupts),一个上升沿输入,将中断变成pending,中断信号线不会保持高电平.
6、gic框架
• Distributor interface
• Redistributor interface
• CPU interface
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
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
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
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.
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
软件读取中断号
中断优先级
中断结束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
中断号的状态
产生SGI中断
PE在secure执行时,可以产生secure和non-secure的SGI;
PE在non-secure执行时,也是可以产生secure的SGI,但是取决于GICR_NSACR寄存器的配置,该寄存器只能在secure中读写
比较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 ARE==0, affinity routing is disabled (legacy operation)
- When ARE==1, affinity routing is enabled (GICv3 operation)
推荐
- ARMv8/ARMv9架构从入门到精通 --博客专栏
- 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
- 8天入门ARM架构 --入门课程