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

支持的设备类型

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

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

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

KVM_DEV_ARM_VGIC_GRP_ADDR

属性

KVM_VGIC_V2_ADDR_TYPE_DIST (rw, 64 位)

GIC 分配器寄存器映射在 guest 物理地址空间中的基地址。仅对 KVM_DEV_TYPE_ARM_VGIC_V2 有效。此地址需要 4K 对齐,并且区域覆盖 4 KByte。

KVM_VGIC_V2_ADDR_TYPE_CPU (rw, 64 位)

GIC 虚拟 CPU 接口寄存器映射在 guest 物理地址空间中的基地址。仅对 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     |

所有分配器寄存器均为 (rw, 32 位)

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

当 KVM 对模拟 GICv2 的实现方式发生改变时,GICD_IIDR.Revision 会被更新,这种改变可以直接被 guest 或用户空间观察到。用户空间应从 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 接口寄存器均为 (rw, 32 位)

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

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

因此,当且仅当

APRn[X mod 32] == 0b1 时,抢占级别 X 具有一个或多个活动中断,其中 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 内部数据时内存不足