Chapter 7: GICv4.0 虚拟 LPI 支持
本章描述了 GICv4.0 虚拟 LPI 支持的基本方面:
-
关于 GICv4.0 虚拟 Locality-specific Peripheral Interrupt 支持 。
-
虚拟中断的直接注入 。
7.1 关于 GICv4.0 虚拟 Locality-specific Peripheral Interrupt 支持
在 GICv3 中,hypervisor 使用系统寄存器向虚拟化系统呈现 LPI。当 hypervisor 将对应 LPI 范围的 vINTID 写入列表寄存器时,生成 虚拟 LPI(vLPI),在这种情况下,vINTID 的值大于 8191。由于 LPI 没有活动状态,因此无法将虚拟 LPI 与物理中断关联。
GICv4 提供对 LPI INTID 范围内 vLPI 直接注入的支持。通过 vLPI 的直接注入,GICR_* 寄存器为每个 vPE 使用内存中的结构来保存 vLPI 的 LPI 配置和待处理信息,其方式与它们使用内存中的结构来保存物理 LPI 的 LPI 配置和待处理信息相同。
但是,虚拟结构与物理结构不同,当前在 PE 上调度的 vPE 的 vLPI 表由与该 PE 关联的 Redistributor 中的 GICR_VPENDBASER 和 GICR_VPROPBASER 提供。有关物理 LPI 表的更多信息,请参见 LPI 配置表 和 LPI 待处理表 。
调度 vPE 时,在以下情况下可以将 GICR_VPENDBASER.IDAI 清除为 0:
-
当 vPE 上次在同一个 GIC 上的 Redistributor 上调度时。
-
当 vPE 在初始分配后首次调度时,并且整个虚拟 LPI 待处理表在初始分配时仅包含零。
-
在 IMPLEMENTATION DEFINED 情况下。
在任何其他时候将 GICR_VPENDBASER.IDAI 清除为 0 会导致 UNPREDICTABLE 行为。
与调度 vPE 的 PE 关联的 Redistributor 确定最高优先级的待处理 vLPI,并将其转发到 vPE 的虚拟 CPU interface。然后将此 vLPI 和列表寄存器中的中断一起优先排序,以确定 vPE 的最高优先级待处理虚拟中断。
有关虚拟 LPI 和虚拟 CPU 表的信息,请参见 vPE 表 。
7.2 虚拟中断的直接注入
ITS 将 EventID 和 DeviceID 映射到与 PE 关联的 INTID,有关更多信息,请参见 中断转换服务 。GICv4 引入了在不涉及 hypervisor 的情况下生成虚拟 LPI 的能力。在这种情况下,ITS 使用以下机制映射中断转换的 EventID:
-
vLPI 的 ITS 中断转换表条目配置为:
- 指示 EventID 与虚拟 LPI 关联的控制标志。
-
用于索引 ITS vPE 表的 vPEID。有关 vPEID 和 vPE 表的更多信息,请参见 vPE 表 。vPE 表以 GITS_TYPER.PTA 定义的格式提供 GICR_* 寄存器的基地址以及与目标 VM 关联的虚拟 LPI 待处理表的基地址。
- 指示哪个 vLPI 变为待处理的虚拟 INTID(vINTID)。
-
如果 vPE 未在 PE 上调度,可以用作向 hypervisor 发送门铃中断的物理 INTID(pINTID)。不需要门铃中断时使用值 1023,否则必须提供物理 LPI 范围内的 INTID。
当存在 EL3 时:
-
通过直接注入接收的虚拟中断仅在确定 Non-secure 状态下最高优先级待处理虚拟中断时考虑。
-
直接注入的虚拟中断在 Secure 状态下不作为异常信号发送,也不通过 ICV 寄存器报告。
注意 当实现使用 GIC Stream 协议时,PE 处于 Secure 状态时,对发送 VSET 命令的 IRI 没有限制。但是,PE 在 Secure 状态下不会将这些中断作为异常信号发送,即使在 SCR_EL3.EEL2==1 时也是如此。
当不存在 EL3 时:
- 通过直接注入接收的虚拟 LPI 可以在 PE 支持的任何安全状态下发出信号。
有关以下内容的更多信息:
-
物理 LPI,请参见 LPI 。
-
ITS 和中断转换表(ITT)的格式,请参见 中断转换服务 。
-
用于控制与 ITS 关联的虚拟 LPI 处理的命令,请参见表 5-6 和以下命令:
- VINVALL 。
-
VMAPI 。
- VMAPP GICv4.0 。
-
VMAPTI 。
-
VMOVI 。
-
VMOVP GICv4.0 。
-
VSYNC 。
GIC 硬件在以下情况下确定 vPE 是否在 PE 上调度:
-
GICR_VPENDBASER.Valid == 1。
-
GICR_VPENDBASER.Physical_Address 保存与作为 vLPI 目标的 vPE 的 VMAPP GICv4.0 命令中 VPT_addr 字段中定义的相同值。
如果在 vPE 从 PE 取消调度时,PE 有一个或多个 vLPI 待处理,则 GICR_VPENDBASER.PendingLast 设置为 1。hypervisor 可以使用此信息来做出调度决策。
7.2.1 门铃中断
当针对 vPE 的中断待处理时,它可能针对当前未在 PE 上调度的 vPE。当这些中断作为物理中断呈现时,hypervisor 可以因这些中断而调度 vPE。在这种情况下,hypervisor 可以基于 vPE 的完整待处理虚拟中断集为 vPE 做出调度决策。
在 vLPI 直接注入的情况下,通过提供门铃 LPI 提供等效功能。
对于 vLPI,当 vLPI 变为待处理且 vPE 未在该 PE 上调度时,ITS 可以配置发送到 PE 的物理 LPI。此物理 LPI 是门铃 LPI。