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 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。