Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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 内存映射寄存器

短寄存器名中的前缀寄存器
GICDDistributor寄存器
GICRRedistributor寄存器a
GITSITS寄存器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 字段 状态目的 字段
PSTATEaA PSTATEa I FA SError中断掩码位(AArch64状态)异步中止掩码位(AArch32状态)I IRQ掩码位 F FIQ掩码位
-- DFSR -STATUS/FS 故障状态 ExT 外部中止类型
ESR_ELxEC HSR IL ISSEC 异常类别 IL 同步异常的指令长度 ISS 指令特定综合征
HCR_EL2AMO HCR IMO FMO RW VSE VI VF TGEAMO SError中断路由(AArch64状态)异步外部中止中断路由(AArch32状态)IMO 物理IRQ路由 FMO 物理FIQ路由 RES0 较低异常级别的执行状态控制(AArch64状态)VA 虚拟SError中止异常(AArch64状态)虚拟异步中止异常(AArch32状态)VI 虚拟IRQ中断 VF 虚拟FIQ中断 TGE 陷阱通用异常
HSTR_EL2T HSTR I FT 管理程序系统陷阱 I IRQ挂起 F FIQ挂起
ID_AA64PFR0_EL1GIC -- System register GIC接口支持
ID_PFR1_EL1GIC ID_PFR1GIC System register GIC CPU interface支持
ISR_EL1A ISRA SError挂起(AArch64状态)外部中止挂起(AArch32状态)

表1-4 影响GIC操作的Armv8架构状态(续)

AArch64 状态AArch32 字段 状态目的 字段
MPIDR_EL1Aff3 MPIDR Aff2 Aff1 Aff0- 亲和性级别3 Aff2 亲和性级别2 Aff1 亲和性级别1 Aff0 亲和性级别0
SCR_EL3RW SCR EA FIQ IRQ NS EEL2RES0 较低异常级别的执行状态控制(仅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.SREaICC_SRE.SREa-
ICC_SRE_EL2.SREICC_HSRE.SRE-
ICC_SRE_EL3.SREICC_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来控制非安全状态的中断。在不对称配置中没有等价功能。