Ch2 中断分配与路由
2.1 The Distributor and Redistributors
Distributor 为 SPI 提供路由配置,并保存所有关联的路由和优先级信息。
Redistributor 提供 PPI 和 SGI 的配置设置。
Redistributor总是在有限的时间内向 CPU 接口呈现具有最高优先级的待处理中断。
有关中断优先级的详细信息,请参阅第 4-65 页的中断优先级。
最高优先级的挂起中断可能会发生变化,因为:
• 先前的最高优先级中断已被ACK。
• 先前的最高优先级中断已被抢占。
• 先前的最高优先级中断被删除并且不再有效。
• 组中断启用已修改。
• PE 不再是 participating PE。 请参阅第 2-36 页的参与节点。
2.2 中断 ID 号
中断使用 ID 号 (INTID) 来标识。 GICv3 支持的 INTID 范围取决于具体设计,并根据以下规则定义的:
• 对于Distributor和Redistributor中支持的 INTID 位的数量:
— 如果不支持 LPI,则Distributor中的 ID 空间限制为 10 位。 这与早期版本的 GIC 架构相同。
— 如果支持 LPI,则 INTID 字段是在 14-24 位范围内实现定义的,如 GICD_TYPER 的寄存器描述中所述。
注
可以通过 GICR_PROPBASER 将Redistributor配置为使用比 GICD_TYPER 指定的更少的位。
• 对于ITS 中支持的INTID 位的数量:
— 如果支持 LPI,则 INTID 字段由实现定义,范围为 14-24 位。
— INTID 字段的大小由 GITS_TYPER.IDbits 定义。
必须对 ITS 进行编程,以便转发到Redistributor的中断位于该Redistributor支持的中断范围内,否则行为将无法预测。
• 对于CPU 接口中支持的INTID 位的数量:
— GICv3 CPU 接口支持 16 位或 24 位 INTID 字段,选择由实现定义。 支持的物理中断标识符位数由 ICC_CTLR_EL1.IDbits 和 ICC_CTLR_EL3.IDbits 指示。
有效的 INTID 空间由 CPU 接口和Distributor中实现的大小控制。 将大于支持大小的 INTID 转发到 CPU 接口是一个编程错误。
未使用的 INTID 位是 RAZ。 这意味着任何受影响的位字段都是零扩展的。
表 2-1 显示了 INTID 空间如何按中断类型进行分区。
Arm 推荐的 PPI INTID 分配由服务器基本系统架构提供,请参阅 Arm® 服务器基本系统架构 (SBSA)。
GICv4 架构通过除了 INTID 空间之外还支持 vPEID,为每个 VM 提供了唯一的 INTID 空间。 有关虚拟化的详细信息,请参阅第 6-154 页的关于虚拟化的 GIC 支持,有关 vPEID 的详细信息,请参阅第 5-85 页的中断转换服务。
Arm 强烈建议对已实现的中断进行分组,以使用最低的 INTID 编号和尽可能小的 INTID 范围。 这减少了内存中必须实现且发现例程必须检查的关联表的大小。
Arm 强烈建议软件保留:
• INTID0 - INTID7 用于非安全中断。
• INTID8 - INTID15 用于安全中断。
2.2.1 特殊 INTID
GIC架构为特殊目的保留的INTID列表如下:
1020
GIC 返回此值以响应 EL3 处的 ICC_IAR0_EL1 或 ICC_HPPIR0_EL1 读取,以指示正在确认的中断是预计在安全 EL1 处处理的中断。 仅当 PE 使用 AArch64 状态在 EL3 执行时,或者当 PE 在 Monitor 模式下以 AArch32 状态执行时,才会返回此 INTID。
当 ICC_CTLR_EL3.RM == 1 时,也可以通过在 EL3 处读取 ICC_IAR1_EL1 或 ICC_HPPIR1_EL1 返回该值,请参阅第 13-818 页上的非对称操作和 ICC_CTLR_EL3.RM 的使用。
1021
GIC 返回此值以响应 EL3 处的 ICC_IAR0_EL1 或 ICC_HPPIR0_EL1 读取,以指示正在确认的中断是预期在非安全 EL1 或 EL2 处处理的中断。 仅当 PE 使用 AArch64 状态在 EL3 执行时,或者当 PE 在 Monitor 模式下以 AArch32 状态执行时,才会返回此 INTID。
当 ICC_CTLR_EL3.RM == 1 时,也可以通过在 EL3 处读取 ICC_IAR1_EL1 或 ICC_HPPIR1_EL1 返回该值,请参阅第 13-818 页上的非对称操作和 ICC_CTLR_EL3.RM 的使用
1022
该值仅适用于旧版操作。 有关详细信息,请参阅第 13-815 页上的特殊 INTID 1022 的使用。
1023
如果没有具有足够优先级的挂起中断可以向 PE 发出信号,或者如果最高优先级挂起中断不适合以下情况,则返回该值以响应中断确认:
• 当前安全状态。
• 与系统寄存器关联的中断组。
这些 INTID 不需要中断结束或停用。
有关使用特殊 INTID 的更多信息,请参阅以下寄存器的说明:
• ICC_IAR0_EL1。
• ICC_IAR1_EL1。
• ICC_HPPIR0_EL1。
• ICC_HPPIR1_EL1。
2.2.2 混合 INTD 大小的实现
实现可能会选择为 GIC 的不同部分实现不同的 INTID 大小,但须遵守以下规则:
• PE 可以实现16 位或24 位的INTID。
注
系统可能包含支持 16 位 INTID 的 PE 和支持 24 位 INTID 的 PE 的混合。
• Distributor 和 Redistributors必须全部实现相同数量的INTID 位。
• 在支持LPI 的系统中,分发器和所有再分发器必须实现至少14 位的INTID。
Distributor 和 Redistributors中实现的位数不得超过系统中任何 PE 上实现的最小位数。
注
由于中断可能针对任何 PE,因此每个 PE 必须能够接收再分发器可以发送的最大 INTID。 这意味着再分发器支持的 INTID 大小不能超过系统中每个 PE 支持的最小 INTID 大小。
• 在不支持LPI 的系统中,Distributor 和 Redistributors必须实现至少5 位的INTID,并且不能实现超过10 位的INTID。 对于 GIC 版本 3.1,可以实现不超过 13 位的 INTID。
• 在包含一个或多个 ITS 的系统中,ITS 可以实现任何值,最高可达并包括Distributor 和 Redistributors支持的位数,最低可达 14 位,这是支持 LPI 所需要的最少位数。