Chapter 1: 简介
本章提供了GIC架构的简介。它提供了GIC架构的概述以及该架构中的新特性。还提供了本文档使用的术语定义。包含以下部分:
-
关于Generic Interrupt Controller (GIC) .
-
术语 .
-
支持的配置和兼容性 . 1.1 关于Generic Interrupt Controller (GIC)
1.1 关于Generic Interrupt Controller (GIC)
GICv3架构被设计用来与Armv8-A和Armv8-R兼容的_处理单元_ ,PE配合工作。
Generic Interrupt Controller (GIC)架构定义:
-
对任何连接到GIC的PE处理所有中断源的架构要求。
-
适用于单处理器或多处理器系统的通用中断控制器编程接口。
GIC是支持和控制中断的架构化资源。它提供:
-
用于管理中断源、中断行为以及中断路由到一个或多个PE的寄存器。
-
支持:
- Armv8架构。
-
Locality-specific Peripheral Interrupts (LPI)。
- Private Peripheral Interrupts (PPI)。
-
Software Generated Interrupts (SGI)。
-
Shared Peripheral Interrupts (SPI)。
-
中断屏蔽和优先级处理。
-
单处理器和多处理器系统。
-
-
电源管理环境中的唤醒事件。
对于每个PE,GIC架构描述了如何从系统内不同类型的中断生成IRQ和FIQ中断。Armv8-A异常模型描述了PE如何处理这些IRQ和FIQ中断。
中断处理也依赖于Armv8架构的其他方面,如安全状态和虚拟化支持。Arm架构提供了两种安全状态,每种都有相关的物理内存地址空间:
-
安全状态。
-
非安全状态。
GIC架构支持与两种安全状态相关的中断路由和处理。有关更多信息,请参阅_中断分组和安全性_。
GIC架构支持与_虚拟机_,VM相关的虚拟中断处理的Armv8模型。虚拟化系统有:
-
一个管理程序必须包含在EL2执行的组件,负责在VM之间进行切换。
-
在EL1执行的多个VM。
-
在VM上的EL0执行的应用程序。
有关Armv8架构的更多信息,请参阅_Arm[®] Architecture Reference Manual, Armv8, for Armv8-A architecture profile_。有关VM的更多信息,请参阅_关于GIC虚拟化支持_。
本规范定义了GIC架构的版本3.0、版本3.1、版本3.2(统称为GICv3)、版本4.0和版本4.1(统称为GICv4.1)。版本2.0(GICv2)仅在GICv3可选的传统操作支持方面进行描述,请参阅_具有传统操作的GICv3_。有关GICv2架构的详细信息,请参阅_Arm[®] Generic Interrupt Controller, Architecture version 2.0, Architecture Specification_。
注意 由于GICv4是GICv3.0和GICv3.1的扩展,本手册中对GICv3的所有引用同样适用于GICv4,除非明确另有说明。GICv4.1架构规范的任何变更都会相应地标出。
1.1.1 从GICv2开始的GIC架构变更
GIC可扩展性
GICv2架构只支持最多八个PE,因此具有无法扩展到大型系统的功能。GICv3通过改变中断路由的机制(称为_亲和性路由_)以及在中断分发中引入一个新组件(称为_Redistributor_)来解决这个问题。有关更多信息,请参阅第3章_GIC分区_。
通过将GICD_CTLR.ARE_S或GICD_CTLR.ARE_NS设置为1来启用安全状态的亲和性路由。
中断分组
_中断分组_是GICv3用来将中断处理与Armv8异常模型对齐的机制:
-
Group 0物理中断预期在最高实现的异常级别处理。
-
Secure Group 1物理中断预期在Secure EL1或EL2处理。
-
Non-secure Group 1物理中断在使用虚拟化的系统中预期在Non-secure EL2处理,或在不使用虚拟化的系统中在Non-secure EL1处理。
这些中断组可以映射到Armv8 FIQ和IRQ信号上,如_中断分组_中所述,使用来自Armv8架构和GICv3架构内的配置位。
在GICv3中,中断分组支持:
-
将每个中断配置为Group 0、Secure Group 1或Non-secure Group 1。
-
使用FIQ异常请求向目标PE发送Group 0物理中断信号。
-
以允许它们在自己的安全状态下使用IRQ处理程序进行处理的方式向目标PE发送Group 1物理中断信号。Group 1中断的确切处理取决于当前的异常级别和安全状态,如第4章_物理中断处理和优先级_中所述。
-
Group 0和Group 1中断优先级处理的统一方案。
Interrupt Translation Service (ITS)
Interrupt Translation Service,ITS,提供了允许软件控制如何将转发到ITS的中断转换为:
-
物理中断,在GICv3和GICv4中。
-
虚拟中断,仅在GICv4中。
ITS还允许软件确定转换后中断的目标Redistributor。软件可以通过命令接口和内存中相关的基于表的结构控制ITS。Interrupt Translation Service (ITS)的输出总是LPI,这是一种基于消息的中断形式。请参阅_Interrupt Translation Service_。
Locality-specific Peripheral Interrupts (LPI)
LPI是一类新的中断,显著扩展了GIC可以处理的中断ID空间。LPI是可选的,如果实现,可以由Interrupt Translation Service,ITS生成和支持。请参阅_LPI_。
Software Generated Interrupts (SGI)
由于GICv3支持大规模系统的能力,SGI的上下文已修改,不再包含源PE的身份。请参阅_Software Generated Interrupts_。
注意
原始的SGI格式仅在支持传统操作的GIC实现中可用。
Shared Peripheral Interrupts (SPI)
Distributor中添加了一组新寄存器,以支持基于消息的SPI的设置和清除。请参阅_Shared Peripheral Interrupts_。
System register接口
该接口在Armv8-A或Armv8-R PE中使用System register指令,为CPU interface寄存器提供紧密耦合的接口。该接口用于与中断处理和优先级掩码直接相关的寄存器,以最小化访问延迟。对于虚拟化,以这种方式访问的寄存器包括VM中断处理程序访问的寄存器,以及将虚拟中断从管理程序转发到VM的寄存器。所有其他寄存器都是内存映射的。
对于AArch64状态,System register接口的访问由以下设置启用:
-
ICC_SRE_EL1.SRE == 1。
-
• ICC_SRE_EL2.SRE == 1。 • ICC_SRE_EL3.SRE == 1。
对于AArch32状态,System register接口的访问由以下设置启用:• ICC_SRE.SRE == 1。 • ICC_HSRE.SRE == 1。 • ICC_MSRE.SRE == 1。
与GICv2向后兼容的其他行为在第14章_传统操作和不对称配置_中描述。
注意
在支持传统操作的GIC中,所有架构化的GIC寄存器都可以进行内存映射访问。
除非另有说明,本手册描述了在启用亲和性路由、System register访问和两种安全状态的系统中的GICv3架构。这意味着:
-
GICD_CTLR.ARE_NS == 1。
-
• GICD_CTLR.ARE_S == 1。 • GICD_CTLR.DS == 0。
对于在AArch64状态下的操作:
-
ICC_SRE_EL1.SRE == 1,对于该寄存器的安全和非安全副本。
-
ICC_SRE_EL2.SRE == 1。
-
ICC_SRE_EL3.SRE == 1。
对于在AArch32状态下的操作:
-
ICC_SRE.SRE == 1。
-
ICC_HSRE.SRE == 1。
-
ICC_MSRE.SRE == 1。
从GICv3开始,ARE和SRE控制位设置为0的传统操作已被弃用,如果PE实现Secure EL2则被移除。有关传统操作的更多信息,请参阅第14章_传统操作和不对称配置_。
GICv3.1特定的变更
GICv3.1增加了对Memory Partitioning and Monitoring、扩展SPI范围、扩展PPI范围以及对Secure EL2支持的支持。
GICv3.2特定的变更
GICv3.2增加了对Armv8-R AArch64的支持。
GICv4特定的变更
GICv4增加了对直接向VM注入虚拟中断的支持,无需涉及管理程序。直接注入仅由实现至少一个将中断转换为LPI的ITS的系统支持。
GICv4.1特定的变更
GICv4.1扩展了直接注入支持,也可以处理虚拟SGI。GICv4.1改变了某些GICv4数据结构的处理方式。
1.2 术语
本手册中的架构描述使用与Armv8架构相同的术语。有关此术语的更多信息,请参阅_Arm[®] Architecture Reference Manual, Armv8, for Armv8-A architecture profile_的A部分介绍。
此外,在适当的地方使用AArch64 System register名称,优先于列出AArch32和AArch64 System register名称。AArch64寄存器名称上的EL _x_后缀表示可以访问该寄存器的最低异常级别。各个AArch64 System register描述包含对提供相同功能的AArch32 System register的引用。
以下部分定义了本手册中使用的架构术语:
-
中断类型 .
-
中断状态 .
-
处理中断的模型 .
-
其他术语 .
1.2.1 中断类型
实现GIC架构的设备可以控制_外设中断_。外设中断通常通过到GIC的物理信号断言。GIC架构定义了以下类型的外设中断:
Locality-specific Peripheral Interrupt (LPI)
LPI是一个有针对性的外设中断,被路由到亲和性层次结构中的特定PE:
-
在启用两种安全状态的系统中,LPI总是Non-secure Group 1中断。
-
LPI具有边缘触发行为。
-
LPI可以使用ITS路由。
-
LPI没有活动状态,因此不需要显式去激活。
-
LPI总是基于消息的中断。
有关更多信息,请参阅_LPI_。
Private Peripheral Interrupt (PPI)
这是一个针对单个特定PE的外设中断,不同的PE可以使用相同的中断号来指示不同的事件:
-
PPI可以是Group 0中断、Secure Group 1中断或Non-secure Group 1中断。
-
PPI可以支持边缘触发或电平敏感行为。
-
PPI永远不会使用ITS路由。
-
PPI具有活动状态,因此需要显式去激活。
注意
通常,期望PPI被每个PE上相同中断源的不同实例使用,从而允许PE特定事件使用通用中断号,如来自私有定时器的中断。
Shared Peripheral Interrupt (SPI)
这是一个外设中断,Distributor可以将其路由到可以处理该中断的指定PE,或者路由到系统中已配置为接受此类中断的一组PE中的某个PE:
-
SPI可以是Group 0中断、Secure Group 1中断或Non-secure Group 1中断。
-
SPI可以支持边缘触发或电平敏感行为。
-
SPI永远不会使用ITS路由。
-
SPI具有活动状态,因此需要显式去激活。
有关更多信息,请参阅_Shared Peripheral Interrupts_。有关Distributor的更多信息,请参阅第3章_GIC分区_。
Software Generated Interrupt (SGI)
SGI通常用于处理器间通信,并通过向GIC中的SGI寄存器写入来生成:
-
SGI可以是Group 0中断、Secure Group 1中断或Non-secure Group 1中断。
-
SGI具有边缘触发行为。
-
SGI永远不会使用ITS路由。
-
SGI具有活动状态,因此需要显式去激活。
有关更多信息,请参阅_Software Generated Interrupts_。
边缘触发的中断具有以下属性:
- 在检测到中断信号的上升沿时断言,然后无论信号状态如何,保持断言直到软件确认中断。
有关边缘触发的基于消息的中断的信息,请参阅基于消息的中断。
电平敏感的中断具有以下属性:
-
当中断信号电平为活动状态时断言,当电平不为活动状态时取消断言。
-
由软件显式取消断言。
1.2.2 中断状态
以下状态适用于GIC和连接的PE之间的每个接口:
非活动 不活动或不挂起的中断。 挂起 在硬件中被识别为断言或由软件生成,并等待目标PE处理的中断。
活动 已被PE确认并正在处理的中断,因此在初始中断不再活动之前,同一中断的另一个断言不会作为中断呈现给PE。
LPI没有活动状态,在被PE确认时转换为非活动状态。
活动和挂起 从中断的一次断言活动,并从后续断言挂起的中断。
LPI没有活动和挂起状态,在被PE确认时转换为非活动状态。
GIC维护每个支持的中断的状态。状态机定义了中断状态之间可能的转换,并且对于每种中断类型,定义了导致转换的条件。有关更多信息,请参阅_中断处理状态机_。
1.2.3 处理中断的模型
在多处理器实现中,存在以下处理中断的模型:
有针对性的分发模型
此模型适用于所有PPI和所有LPI。它也适用于:
-
在非传统操作期间的SPI,如果GICD_IROUTER
.Interrupt_Routing_Mode == 0。 -
在传统操作期间,当GICD_CTLR.ARE_* == 0时,如果在适当的GICD_ITARGETSR
字段中只有一位== 1。
由软件指定的目标PE接收中断。
有针对性的列表模型
此模型仅适用于SGI。多个PE独立接收中断。当PE确认中断时,只为该PE清除中断挂起状态。中断对每个PE保持挂起,直到被PE确认。
N选1模型
此模型仅适用于SPI。中断针对指定的一组PE,并且只在该组中的一个PE上执行。选择哪个PE执行中断是以IMPLEMENTATION DEFINED的方式决定的。架构对可以选择哪些PE应用限制,请参阅_启用中断分发_。
注意
-
Arm GIC架构保证N选1中断仅呈现给目标PE集合中列出的一个PE。
-
N选1中断可能呈现给一个PE,其中该中断不是最高优先级中断,或者中断被ICC_PMR_EL1或在PE内屏蔽。请参阅_中断生命周期_。
对于传统操作期间的SPI,当在目标寄存器中指定了多个目标PE时,此模型适用。
如果有多个PE可以处理中断,硬件实现一种机制来确定哪个PE激活中断。
1.2.4 其他术语
以下其他术语在本手册中使用:
空闲优先级
在GICv3中,空闲优先级0xFF是当该接口上没有中断活动时从ICC_RPR_EL1读取的运行优先级。在传统操作期间,从GICC_RPR读取的空闲优先级是IMPLEMENTATION DEFINED的,如在GICv2中一样。
Interrupt Identifier (INTID)
唯一标识具有相关事件及其源的中断的数字空间。然后将中断路由到一个或多个PE进行处理。PPI和SGI中断号对每个PE是本地的。SPI和LPI对物理域有全局中断号。有关更多信息,请参阅_INTID_。
Interrupt Routing Infrastructure (IRI)
Distributor、Redistributor以及可选的一个或多个ITS。有关更多信息,请参阅_GIC逻辑组件_。
基于消息的中断
基于消息的中断是由于对指定地址的内存写访问而断言的中断。物理中断可以转换为基于消息的中断。基于消息的中断可以支持电平敏感或边缘触发行为,尽管LPI总是边缘触发的。
GICv3支持两种基于消息的中断机制:
- 用于传送SPI的机制,其中指定的地址保存在Distributor中。在这种情况下,基于消息的中断可以是电平敏感或边缘触发的。
• 用于传送LPI的机制,其中指定的地址保存在ITS(如果实现了ITS)或Redistributor中。
Arm建议在支持PCIe的系统中使用LPI来提供MSI和MSI-X功能的支持。有关更多信息,请参阅第5章_局部特定外设中断和ITS_。GICv3还包括对使用基于消息的中断信号SPI的架构化支持,请参阅_Shared Peripheral Interrupts_。
物理中断
针对物理PE的中断是物理中断。它通过PE连接的物理CPU interface向PE发出信号。
运行优先级
在任何给定时间,CPU interface的运行优先级要么是:
-
活动中断的组优先级,该接口上没有进行优先级下降。
-
如果接口上没有没有进行优先级下降的活动中断,运行优先级是空闲优先级0xFF。
足够优先级
GIC CPU interface将启用的挂起中断的优先级与以下所有内容进行比较,以确定中断是否具有足够的优先级:
-
优先级掩码寄存器ICC_PMR_EL1。
-
接口的抢占设置,如ICC_BPR0_EL1和ICC_BPR1_EL1所示。
-
当前运行优先级,如CPU interface的ICC_RPR_EL1所示。
-
如果中断具有足够的优先级,则向连接的PE发出信号。
虚拟中断
针对VM的中断是虚拟中断。它由关联的虚拟CPU interface发出信号。有关更多信息,请参阅第6章_虚拟中断处理和优先级_。
维护中断
一个物理中断,它向管理程序发出与VM上中断处理相关的关键事件信号,以允许管理程序跟踪这些事件。这些事件由管理程序处理,包括启用和禁用特定组的中断。有关更多信息,请参阅_维护中断_。
1.3 支持的配置和兼容性
在Armv8-A中,EL2和EL3是可选的,PE可以支持这些异常级别中的一个、两个或都不支持。但是:
-
PE需要EL3来支持安全和非安全状态。
-
PE需要EL2来支持虚拟化。
-
如果没有实现EL3,则只有一个安全状态。该安全状态要么是安全状态,要么是非安全状态。
GICv3根据_Arm[®] Architecture Reference Manual, Armv8, for Armv8-A architecture profile_中描述的_相互处理_规则,支持所有这些配置的中断处理,以及在AArch32状态和AArch64状态下的执行。
1.3.1 亲和性路由配置
GICv3架构支持亲和性路由。它提供对以下情况的可选支持:
-
不对称配置,其中为非安全状态启用亲和性路由,为安全状态禁用亲和性路由。这为安全传统环境提供了支持。
-
仅传统环境,其中为安全状态和非安全状态都禁用亲和性路由。
1.3.2 System register配置
当为两种安全状态的执行都启用亲和性路由时,必须配置GIC使用System register访问来处理物理中断。架构不支持为安全状态启用亲和性路由,而不为该安全状态配置System register访问。以这种方式配置GIC会导致UNPREDICTABLE行为。当为非安全状态的执行启用亲和性路由时,GIC架构可选地支持虚拟中断的传统操作,即在EL2执行的管理程序控制下的非安全EL1的传统中断处理。
1.3.3 GIC控制和配置
许多GIC寄存器以不同形式提供,以允许有效的中断处理:
-
用于两种安全状态。
-
用于不同的中断组。
-
对GICv3使用System register访问或对传统操作使用内存映射访问。
当启用System register访问时,GIC架构的控制和配置由架构化的System register和定义GIC程序员模型的相关访问处理。有关更多信息,请参阅第12章_程序员模型_。
一些寄存器总是内存映射的,而其他寄存器在GICv3中使用System register访问,在传统操作中使用内存映射访问。
表1-1显示了总是内存映射的寄存器。
表1-1 内存映射寄存器
| 短寄存器名中的前缀 | 寄存器 |
|---|---|
| GICD | Distributor寄存器 |
| GICR | Redistributor寄存器a |
| GITS | ITS寄存器b |
-
a. 每个PE都有一份Redistributor寄存器的副本。
-
b. 一个实现中可以有多个ITS。每个ITS都有自己的GITS寄存器副本。
表1-2显示了传统操作中内存映射的寄存器,但在启用System register访问时在GICv3中被System register访问替代。
表1-2 传统操作的内存映射寄存器
| 短寄存器名中的前缀 | 寄存器 |
|---|---|
| GICC | 物理CPU interface寄存器 |
| GICV | 虚拟CPU interface寄存器 |
| GICH | 虚拟接口控制寄存器 |
注意
-
在非安全EL1执行的操作系统使用GICC_*或GICV_*寄存器来控制中断,并且不知道差异。
-
GICR_*和GITS_*寄存器是在GICv3中引入的。
表1-3显示了当启用System register访问时GICv3支持的寄存器。
表1-3 System register
| 短寄存器名中的前缀 | 访问的System register |
|---|---|
| ICC | 物理CPU interface寄存器 |
| ICV | 虚拟CPU interface寄存器 |
| ICH | 虚拟接口控制寄存器 |
对虚拟化的Armv8支持和PE操作的异常级别决定是访问物理CPU interface寄存器还是虚拟CPU interface寄存器。
有关寄存器名称和影响使用哪个寄存器的因素的更多信息,请参阅_GIC System register访问_。
1.3.4 对Armv8架构状态的引用
表1-4显示了与GIC操作一起使用或影响GIC操作的Armv8架构状态。
表1-4 影响GIC操作的Armv8架构状态
| AArch64 状态 | AArch32 字段 状态 | 目的 字段 |
|---|---|---|
| PSTATEa | A PSTATEa I F | A SError中断掩码位(AArch64状态)异步中止掩码位(AArch32状态)I IRQ掩码位 F FIQ掩码位 |
| - | - DFSR - | STATUS/FS 故障状态 ExT 外部中止类型 |
| ESR_ELx | EC HSR IL ISS | EC 异常类别 IL 同步异常的指令长度 ISS 指令特定综合征 |
| HCR_EL2 | AMO HCR IMO FMO RW VSE VI VF TGE | AMO SError中断路由(AArch64状态)异步外部中止中断路由(AArch32状态)IMO 物理IRQ路由 FMO 物理FIQ路由 RES0 较低异常级别的执行状态控制(AArch64状态)VA 虚拟SError中止异常(AArch64状态)虚拟异步中止异常(AArch32状态)VI 虚拟IRQ中断 VF 虚拟FIQ中断 TGE 陷阱通用异常 |
| HSTR_EL2 | T | T |
| ID_AA64PFR0_EL1 | GIC - | - System register GIC接口支持 |
| ID_PFR1_EL1 | GIC ID_PFR1 | GIC System register GIC CPU interface支持 |
| ISR_EL1 | A ISR | A SError挂起(AArch64状态)外部中止挂起(AArch32状态) |
表1-4 影响GIC操作的Armv8架构状态(续)
| AArch64 状态 | AArch32 字段 状态 | 目的 字段 |
|---|---|---|
| MPIDR_EL1 | Aff3 MPIDR Aff2 Aff1 Aff0 | - 亲和性级别3 Aff2 亲和性级别2 Aff1 亲和性级别1 Aff0 亲和性级别0 |
| SCR_EL3 | RW SCR EA FIQ IRQ NS EEL2 | RES0 较低异常级别的执行状态控制(仅AArch64状态)EA SError中断路由(AArch64状态)外部中止中断路由(AArch32状态)FIQ 物理FIQ路由 IRQ 物理IRQ路由 NS 非安全位 - 安全EL2启用 |
- a. 进程状态PSTATE是进程状态信息的抽象。有关更多信息,请参阅_Arm[®] Architecture Reference Manual, Armv8, for Armv8-A architecture profile_。
有关这些寄存器和字段的更多信息,请参阅_Arm[®] Architecture Reference Manual, Armv8, for Armv8-A architecture profile_。
1.3.5 不支持传统操作的GICv3
在不支持传统操作的实现中,亲和性路由和System register访问是永久启用的。这意味着相关的控制位是RAO/WI。表1-5显示了受此影响的寄存器字段。
表1-5 亲和性路由和System register访问的控制位
| AArch64寄存器 | AArch32寄存器 | 内存映射寄存器 |
|---|---|---|
| ICC_SRE_EL1.SREa | ICC_SRE.SREa | - |
| ICC_SRE_EL2.SRE | ICC_HSRE.SRE | - |
| ICC_SRE_EL3.SRE | ICC_MSRE.SRE | - |
| - | - | GICD_CTLR.ARE_S |
| - | - | GICD_CTLR.ARE_NS |
a. 该寄存器有安全副本和非安全副本。
如果支持安全虚拟化,这是唯一允许的配置。
1.3.6 支持传统操作的GICv3
传统操作_是与GICv2的有限向后兼容形式,提供给使用GICv3的系统运行使用GICv2的代码,前提是此代码满足本节描述的限制。传统操作在GICv3中是可选的。请参阅_中断的传统支持和不对称配置。
在支持传统操作的GICv3实现中,最多八个PE,其对内存映射寄存器接口的个别支持是IMPLEMENTATION DEFINED,可作为给定VM内的物理或虚拟中断目标。这是IMPLEMENTATION DEFINED:
-
传统操作是否适用于两种安全状态的执行,还是仅适用于安全状态的执行。
-
在非安全EL1执行时,传统操作是否仅在虚拟CPU interface中可用。
在GICv3中,以下限制适用于传统操作:
- GICv2功能GICC_CTLR.AckCtl在GICv2中已被弃用,在GICv3中不受支持。相应地,即使在传统模式下,行为就像GICv2中描述的GICC_CTLR.AckCtl位是RAZ/WI一样。
注意
在支持传统操作的GICv3实现中,当GICV_CTLR.AckCtl设置为1时,允许VM控制非安全中断。但是,Arm弃用了GICV_CTLR.AckCtl的使用。
-
不支持GICv2配置锁定功能和相关的CFGSDISABLE输入信号。
-
在EL2执行的管理程序只能控制它执行的PE上的虚拟中断,不能控制其他PE上的虚拟中断。
对于传统操作,支持不对称配置,其中:
-
在非安全状态和EL3启用亲和性路由和System register访问。
-
在安全EL1禁用亲和性路由和System register访问。
这允许在安全EL1运行的安全操作系统使用传统功能,前提是它不配置非安全中断。
在GICv2中,在安全状态执行的软件可以使用GICC_AIAR、GICC_AEOIR、GICC_AHPPIR和GICC_ABPR来控制非安全状态的中断。在不对称配置中没有等价功能。