第14章:Legacy操作和非对称配置
本章描述GIC对legacy操作和非对称配置的支持。如果实现了Secure EL2,则不支持legacy模式。
-
包含以下章节:
-
中断和非对称配置的Legacy支持。
-
非对称配置。
-
VM的legacy操作支持。
14.1 中断和非对称配置的Legacy支持
GICv3实现是否包含支持物理中断legacy操作的机制是IMPLEMENTATION DEFINED的。在支持的地方,此机制与GICv2中的相同,但有以下例外:
-
GICC_CTLR.AckCtl是RAZ/WI,必须用单独的寄存器处理Group 0和Group 1物理中断。
-
不支持GICv2配置锁定功能和相关的CFGSDISABLE信号。GICD_TYPER.LSPI是RES0。
-
对于非对称操作,路由修饰符位用作处理最高优先级待处理中断的安全上下文切换控制机制的一部分。有关更多信息,请参阅_非对称配置_。
此外,在配置为非对称操作的系统中,在Secure状态下执行的软件不允许管理Non-secure中断:
-
当ICC_CTLR_EL3.RM == 1时,要求GICC_CTLR.FIQen == 1,否则Secure EL1的行为是UNPREDICTABLE的。
-
在EL2执行的hypervisor只能控制其执行所在PE的虚拟中断,不能控制其他PE上的虚拟中断。
-
SGI的各个使能,GICD_ISENABLER
(其中n=0),总是复位为零。 -
属于在GICD_CTLR中禁用的组的中断不能阻塞属于已启用组的中断。这意味着如果最高优先级待处理中断在禁用的组中,这不会阻止GIC将已启用组中的中断转发到CPU interface。
注意
在legacy操作期间,Secure Group 1中断被视为Group 0中断。
如果实现了可选的扩展PPI或扩展SPI范围,则不支持legacy操作。
在GICv3中,当Non-secure状态使用亲和路由而Secure状态不使用亲和路由时,适用以下限制:
- 对于当前安全状态启用亲和路由的任何SPI,GICD_ITARGETSR
是RES0。
注意:Legacy Secure软件不能重新路由Non-secure中断,因为GICD_IROUTER
对Secure访问不可访问,并且可能无法正确解释。
-
Legacy Secure软件可以更改中断的组。
-
位位置和亲和之间的映射是IMPLEMENTATION DEFINED的,由GICR_TYPER.Processor_Number报告。
-
如果在Non-secure状态下生成SGI且GICD_CTLR.DS = 0,则无论GICD_NSACR
的值如何,Group 0 SGI都不能设置为待处理。 -
如果在Secure状态下生成SGI并使用Targeted list模型路由,即GICD_SGIR.TargetListFilter = 0b00,则SGI必须传递到GICD_SGIR.CPUTargetList中相应位指示的PE。特定PE的编号在GICR_TYPER.Processor_Number中指示。
- 当GICD_SGIR.TargetListFilter == 0b01时,SGI必须传递到除请求中断的PE外的所有PE。这包括GICR_TYPER.Processor_Number >7的PE。
注意 在不使用亲和路由的Secure状态下执行的软件不能使用GICD_SGIR的Non-secure别名来生成Non-secure SGI,因为这会导致对GICD_SGIR的Non-secure写入,而当Non-secure状态启用亲和路由时,GICD_SGIR是RAZ/WI。
当访问的安全状态禁用亲和路由时,GICD_SGIR的行为如GICv2中定义的,但有以下例外:
-
从GICR_TYPER.Processor_Number > 7的PE写入GICD_SGIR会导致以下CONSTRAINED UNPREDICTABLE行为之一:
- 写入被忽略。 - 发起PE ID被视为具有UNKNOWN有效值。 -
当TargetListFilter字段为11时写入GICD_SGIR会导致以下CONSTRAINED UNPREDICTABLE行为之一:
-
写入被忽略。
-
TargetListFilter字段被视为具有UNKNOWN有效值。
在GICv2中,待处理的SGI由发起PE和目标PE进行银行。在GICv3中,这被简化,因此当为安全状态启用亲和路由时,待处理的SGI仅由目标PE进行银行:
-
读取ICC_IAR0_EL1或ICC_IAR1_EL1时不再提供发起PE ID。
-
写入ICC_EOIR0_EL1或ICC_EOIR1_EL1时不再需要发起PE ID。
-
每个Redistributor只需要16个SGI待处理位。
当GICD_CTLR中的ARE位为安全状态设置为1时,一些为每个PE银行的Distributor寄存器会更改:
-
GICD_SPENDSGIR
是RES0。在GICv3中,SGI不按发起PE待处理,等效功能由GICR_ISPENDR0[0:15]提供。 -
GICD_CPENDSGIR
是RES0。在GICv3中,SGI不按发起PE待处理,等效功能由GICR_ICPENDR0提供。
当为安全状态启用亲和路由时,GICD_SGIR被禁用。
只有当两种安全状态都启用亲和路由时,对ICC_SGI0R_EL1、ICC_SGI1R_EL1和ICC_ASGI1R_EL1的写入才会为其他安全状态生成SGI:
-
当Distributor支持两种安全状态,即当GICD_CTLR.DS == 0,且在Distributor中Secure状态禁用亲和路由时,对ICC_SGI0R_EL1和ICC_ASGI1R_EL1的Non-secure写入不会设置任何SGI为待处理。
-
当Distributor仅支持单一安全状态,即当GICD_CTLR.DS == 1时,对ICC_SGI0R_EL1和ICC_ASGI1R_EL1的Non-secure写入会导致生成Group 0 SGI。
有关GICv2架构的更多信息,请参阅_Arm[®] Generic Interrupt Controller, Architecture version 2.0, Architecture Specification_ 。
14.1.1 特殊INTID 1022的使用
INTID 1022仅用于legacy操作,当满足以下所有条件时返回:
-
确认的中断是以下之一:
- 对GICC_IAR或GICC_HPPIR的Secure读取。- 对GICV_IAR或GICV_HPPIR的Non-secure读取。
-
最高优先级待处理中断是Group 1中断。
-
对于GICV_IAR的读取,GICV_CTLR.AckCtl == 0。
-
中断优先级足以向PE发信号。 14.1 中断和非对称配置的Legacy支持
INTID 1022表示存在足够优先级向PE发信号的Group 1中断,并且必须通过读取GICC_AIAR或GICV_AIAR来确认该中断,或通过读取GICC_AHPPIR或GICV_AHPPIR来观察该中断(视情况而定)。
14.1.2 Legacy配置
对于物理中断,有三种可能的配置可以支持legacy操作:
-
GICD_CTLR.DS == 1,当相关的ICC_SRE_EL3.SRE、ICC_SRE_EL2.SRE和ICC_SRE_EL1.SRE清零为0时。在这种情况下,GIC支持单一地址空间,行为与没有安全扩展的GICv2相同。
-
GICD_CTLR.DS == 0,且所有ICC_SRE_EL3.SRE、ICC_SRE_EL2.SRE(如果实现)和ICC_SRE_EL1.SRE都清零为0。在这种情况下,GIC支持Secure和Non-secure地址空间,行为与带有安全扩展的GICv2相同。
-
GICD_CTLR.DS == 0,且系统对Non-secure物理中断使用亲和路由。在这种情况下,ICC_SRE_EL1.SRE的Secure副本清零为0。此配置支持legacy Secure操作系统环境以及支持亲和路由的Non-secure环境。此配置称为_非对称配置_。
Legacy操作是一个已弃用的功能。在不支持legacy操作的实现中,以下位(如果实现)是RAO/WI:
-
ICC_SRE_EL1.SRE。
-
ICC_SRE_EL2.SRE。
-
ICC_SRE_EL3.SRE。
-
ICC_SRE.SRE。
-
ICC_HSRE.SRE。
-
ICC_MSRE.SRE。
-
GICD_CTLR.ARE_NS。
-
GICD_CTLR.ARE_S。
14.1.3 Legacy操作和旁路支持
Legacy操作期间的中断旁路支持使用GICC_CTLR控制。
当ICC_SRE_EL1.SRE == 1且GICD_CTLR.DS == 1时,GICC_CTLR.{EnableGrp0, EnableGrp1}必须具有值0,否则GICv3行为是UNPREDICTABLE的。
以下伪代码定义了FIQ中断异常的旁路行为。
if GICC_CTLR.FIQEn == 0 then
if (GICC_CTLR.FIQBypDisGrp0 && GICC_CTLR.FIQBypDisGrp1) == 0 then use BypassFIQsource
else FIQ deasserted
else if GICC_CTLR.EnableGrp0 == 0 then
if GICC_CTLR.FIQBypDisGrp0 == 0 then use BypassFIQsource
else FIQ deasserted
else use GICv3 FIQ output
以下伪代码定义了IRQ中断异常的旁路行为。
if FIQEn == 0 then
if (GICC_CTLR.EnableGrp1 || GICC_CTLR.EnableGrp0) == 0 then
if (GICC_CTLR.IRQBypDisGrp0 && GICC_CTLR.IRQBypDisGrp1) == 0 then use BypassIRQsource
else IRQ deasserted
else use GICv3 IRQ Output
else if GICC_CTLR.EnableGrp1 == 0 then
if GICC_CTLR.IRQBypDisGrp1 == 0 then use BypassIRQsource
else IRQ Deasserted
else Use GICv3 IRQ Output
14.2 非对称配置
在实现EL3且EL3使用AArch64状态的系统中,GIC架构支持非对称配置。当满足以下条件时,GICv3系统配置为非对称操作:
-
GICD_CTLR.ARE_NS == 1。
-
GICD_CTLR.ARE_S == 0。
-
ICC_SRE_EL3.SRE == 1:
- Secure monitor使用系统寄存器访问。
-
如果Secure EL1使用AArch64状态,ICC_SRE_EL1(S).SRE == 0。如果Secure EL1使用AArch32状态,ICC_SRE(S).SRE == 0。
- Secure OS使用legacy GIC支持。
对于Non-secure AArch64状态的执行:
-
如果实现了EL2,ICC_SRE_EL2.SRE == 1。
-
如果没有实现EL2,ICC_SRE_EL1(NS).SRE == 1。
对于Non-secure AArch32状态的执行:
-
如果实现了EL2,当EL2在AArch32状态下执行时ICC_HSRE.SRE == 1。否则,ICC_SRE_EL2 == 1。
-
如果没有实现EL2,ICC_SRE (NS).SRE== 1。
注意
如果实现了EL2且使用系统寄存器接口,vPE可以访问内存映射接口。
当EL3使用AArch64状态时
在EL3的AArch64状态下执行的Secure Monitor软件使用系统寄存器接口。
在Secure EL1的AArch32状态或AArch64状态下执行的Secure OS使用legacy内存映射接口。
在Non-secure EL2或EL1的AArch32状态或AArch64状态下执行的处理物理中断的Non-secure hypervisor或OS使用系统寄存器接口。
当EL3使用AArch32状态时
非对称操作是UNPREDICTABLE的。
在这种情况下,Arm期望Group 0中断由Secure OS处理,Non-secure Group 1中断由Non-secure hypervisor或OS处理。
注意
这种情况与使用Secure Group 1中断不兼容,因为这个概念在GICv3中是新的,因此legacy Secure OS代码不理解。
在非对称配置中,当GICC_CTLR.FIQEn == 0时,表4-3中描述为作为FIQ发信号的中断作为IRQ发信号。
14.2.1 非对称操作和ICC_CTLR_EL3.RM的使用
ICC_CTLR_EL3.RM控制在EL3执行的软件是否可以确认或观察Secure Group 0和Non-secure Group 1中断作为最高优先级待处理中断。
当ICC_CTLR_EL3.RM == 1时:
-
Secure Group 0中断返回特殊INTID值1020。这影响对ICC_IAR0_EL1、ICC_HPPIR0_EL1、ICC_IAR1_EL1和ICC_HPPIR1_EL1的访问。
-
Non-secure Group 1中断返回特殊INTID值1021。这影响对ICC_IAR0_EL1、ICC_HPPIR0_EL1、ICC_IAR1_EL1和ICC_HPPIR1_EL1的访问。
有关特殊INTID的更多信息,请参阅_特殊INTID_。
14.3 VM的legacy操作支持
为了支持虚拟中断的legacy操作,GIC必须支持GICV_内存映射寄存器接口。是否提供此支持是IMPLEMENTATION DEFINED的。VM对GICD_ Distributor寄存器的所有访问都必须陷阱到hypervisor,hypervisor负责运行与legacy VM关联的虚拟Distributor。
以下约束适用于作为legacy操作一部分处理的虚拟中断:
-
不支持GICv2配置锁定功能。这意味着hypervisor必须将GICD_TYPER.LSPI虚拟化为对调度的legacy VM的RAZ/WI位。
-
多处理VM最多可以支持八个vPE,这是GICv2中支持的PE的最大数量。这些vPE独立地与同一个Redistributor或不同的Redistributor关联。
注意 虚拟中断的legacy操作支持GICV_CTLR.AckCtl。物理中断的legacy操作不支持GICC_CTLR.AckCtl。
在legacy操作期间,GICV_CTLR控制CPU interface向PE发出中断信号,如下所示:
-
GICV_CTLR.EnableGrp0位控制Group 0中断的信号。
-
GICV_CTLR.EnableGrp1位控制Group 1中断的信号。
有关Group 0和Group 1 PPI、SGI和SPI中断的控制和配置以及它们在legacy操作期间的虚拟化的详细信息,请参阅_Arm[®] Generic Interrupt Controller, Architecture version 2.0, Architecture Specification_ 。
14.3.1 使用内存映射寄存器接口访问GIC virtual CPU interface寄存器
virtual CPU interface在Non-secure内存映射中。hypervisor使用Non-secure阶段2地址转换来确保vPE不能访问其他内存映射的GIC寄存器。
图14-1显示了在AArch64状态下执行的GICv3配置,其中:
-
为Non-secure访问启用了亲和路由和系统寄存器访问,即GICD_CTLR.ARE_NS == 1且ICC_SRE_EL2.SRE == 1。
-
支持虚拟化,即ICH_HCR_EL2.En == 1。
-
EL1配置为支持legacy操作,即ICC_SRE_EL1(NS).SRE == 0。
-
PE配置为使用HCR_EL2.{IMO, FMO}处理虚拟中断。

Image text
GITS_
GICD_
GICR_* GICR_
ICC_ ICC_
PE PE
vPE [a] Hypervisor vPE [a] Hypervisor
GICV_ ICH_* GICV_* ICH_*
a. A vPE is a virtual PE.
Redistributor CPU interface vCPU interface ITS
Distributor Virtual interface control
本附录描述了可选GIC Stream Protocol接口使用的AXI4-Stream协议标准基于消息的接口。它包含以下章节:
-
概述A-866 。
-
信号和GIC Stream ProtocolA-867 。
-
GIC Stream ProtocolA-870 。
-
命令和响应数据包格式的字母顺序列表A-875 。 A-865
附录A GIC Stream Protocol接口 A.1 概述
A.1 概述
GIC Stream Protocol接口描述了IRI和PE之间的可选接口,更具体地说是Redistributor和关联的CPU interface之间的接口。该接口支持IRI和PE的独立开发,包括CPU interface的系统寄存器支持。Arm建议GIC实现使用此流协议接口。
每个方向都需要一个基于AMBA 4 AXI-4 Stream Protocol的数据包接口通信通道:
-
从Redistributor到CPU interface。
-
从CPU interface到Redistributor。
有关更多信息,请参阅_信号和GIC Stream ProtocolA-867_。
A.1.1 术语
命令通信的方向称为下游或上游,其中:
-
下游是与由Redistributor发起并发送到其关联的CPU interface的命令相关的方向。
-
上游是与由CPU interface发起并发送到其关联的Redistributor的命令相关的方向。
翻译完成:第14章Legacy操作和非对称配置已完成翻译。这一章相对较短,主要描述了GICv3对legacy操作模式的支持以及非对称配置的使用场景。