ARM 虚拟通用中断控制器 v2 (VGIC)

支持的设备类型

  • KVM_DEV_TYPE_ARM_VGIC_V2 ARM 通用中断控制器 v2.0

只能通过此 API 或传统的 KVM_CREATE_IRQCHIP API 实例化一个 VGIC 实例。创建的 VGIC 将充当 VM 中断控制器,要求模拟的用户空间设备将中断注入 VGIC,而不是直接注入 CPU。

支持硬件兼容性的 GICv3 实现允许通过此接口创建客户 GICv2。有关创建客户 GICv3 设备和客户 ITS 设备的信息,请参阅 ARM 虚拟通用中断控制器 v3 及更高版本 (VGICv3)。不能在同一 VM 上同时创建 GICv3 和 GICv2 设备。

KVM_DEV_ARM_VGIC_GRP_ADDR

属性

KVM_VGIC_V2_ADDR_TYPE_DIST (读写, 64 位)

GIC 分发器寄存器映射在客户物理地址空间中的基地址。仅适用于 KVM_DEV_TYPE_ARM_VGIC_V2。此地址需要 4K 对齐,并且区域覆盖 4 KByte。

KVM_VGIC_V2_ADDR_TYPE_CPU (读写, 64 位)

GIC 虚拟 CPU 接口寄存器映射在客户物理地址空间中的基地址。仅适用于 KVM_DEV_TYPE_ARM_VGIC_V2。此地址需要 4K 对齐,并且区域覆盖 8 KByte。

错误

-E2BIG

地址超出可寻址 IPA 范围

-EINVAL

地址未正确对齐

-EEXIST

地址已配置

-ENXIO

该组或属性对于此设备是未知/不受支持的,或者缺少硬件支持。

-EFAULT

attr->addr 的用户指针无效。

KVM_DEV_ARM_VGIC_GRP_DIST_REGS

属性

kvm_device_attr 的 attr 字段编码两个值

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

所有分发器寄存器都是 (读写, 32 位)

偏移量是相对于 GICv2 规范中定义的“分发器基地址”的。获取或设置此类寄存器与从 vcpu_index 字段指定的 CPU 在实际硬件上读取或写入该寄存器具有相同的效果。请注意,大多数分发器字段不是分区的,但无论用于访问寄存器的 vcpu_index 是什么,都返回相同的值。

当模拟 GICv2 的 KVM 实现以客户或用户空间可以直接观察到的方式更改时,GICD_IIDR.Revision 会更新。用户空间应从 KVM 读取 GICD_IIDR 并将读取的值写回,以确认其预期行为与 KVM 实现保持一致。用户空间应在设置任何其他寄存器(包括 KVM_DEV_ARM_VGIC_GRP_DIST_REGS 和 KVM_DEV_ARM_VGIC_GRP_CPU_REGS)之前设置 GICD_IIDR,以确保预期行为。除非已从用户空间设置 GICD_IIDR,否则对中断组寄存器 (GICD_IGROUPR) 的写入将被忽略。

错误

-ENXIO

获取或设置此寄存器尚不支持

-EBUSY

一个或多个 VCPU 正在运行

-EINVAL

提供了无效的 vcpu_index

KVM_DEV_ARM_VGIC_GRP_CPU_REGS

属性

kvm_device_attr 的 attr 字段编码两个值

bits:     | 63   ....  40 | 39 ..  32  |  31   ....    0 |
values:   |    reserved   | vcpu_index |      offset     |

所有 CPU 接口寄存器都是 (读写, 32 位)

偏移量指定了相对于 GICv2 规范中定义的“CPU 接口基地址”的偏移量。获取或设置此类寄存器与在实际硬件上读取或写入该寄存器具有相同的效果。

活动优先级寄存器 APRn 是实现定义的,因此我们为我们的实现设置了一个固定格式,以符合我们向客户呈现的“没有安全扩展的 GICv2 实现”模型。此接口始终公开四个寄存器 APR[0-3],描述最大可能的 128 个抢占级别。寄存器的语义通过设置相应的位来指示给定抢占级别中是否有任何中断处于活动状态。

因此,当且仅当满足以下条件时,抢占级别 X 具有一个或多个活动中断:

APRn[X mod 32] == 0b1, 其中 n = X / 32

未定义抢占级别的位是 RAZ/WI。

请注意,这与 CPU 在硬件上对 APR 的看法不同,在硬件上,没有安全扩展的 GIC 会在单独的寄存器组中公开组 0 和组 1 的活动优先级,而我们则显示类似于 GICv2 的 GICH_APR 的组合视图。

出于历史原因并为了提供与用户空间的 ABI 兼容性,我们以 GICH_VMCR.VMPriMask 字段的格式导出 GICC_PMR 寄存器,该字段位于一个字的低 5 位中,这意味着用户空间必须始终使用低 5 位与 KVM 设备通信,并且必须将值左移 3 位以获得实际的优先级掩码级别。

错误

-ENXIO

获取或设置此寄存器尚不支持

-EBUSY

一个或多个 VCPU 正在运行

-EINVAL

提供了无效的 vcpu_index

KVM_DEV_ARM_VGIC_GRP_NR_IRQS

属性

一个描述此 GIC 实例中断(SGI、PPI 和 SPI)数量的值,范围从 64 到 1024,以 32 为增量。

错误

-EINVAL

设置的值超出预期范围

-EBUSY

值已设置,或 GIC 已用默认值初始化。

KVM_DEV_ARM_VGIC_GRP_CTRL

属性

KVM_DEV_ARM_VGIC_CTRL_INIT

请求初始化 VGIC 或 ITS,kvm_device_attr.addr 中无额外参数。

错误

-ENXIO

VGIC 在调用此属性之前未按要求正确配置

-ENODEV

没有在线 VCPU

-ENOMEM

分配 vgic 内部数据时内存不足