ARM GICv3模块

1. GICv3模块

GICv3初始化流程

hvisor中的GICv3初始化流程涉及了GIC分布控制器(GICD)和GIC重新分布控制器(GICR)的初始化,以及中断处理和虚拟中断注入的机制。这一过程的关键步骤:

  • SDEI版本检查:通过smc_arg1!(0xc4000020)获取Secure Debug Extensions Interface (SDEI)的版本信息。
  • ICCs配置:设置icc_ctlr_el1以仅提供优先级下降功能,设置icc_pmr_el1以定义中断优先级掩码,使能Group 1 IRQs。
  • 清除待处理中断:调用gicv3_clear_pending_irqs函数,清除所有待处理的中断,确保系统处于干净状态。
  • VMCR和HCR配置:设置ich_vmcr_el2和ich_hcr_el2寄存器,使能虚拟化CPU接口,准备虚拟中断处理。

待处理中断处理

  • pending_irq函数读取icc_iar1_el1寄存器,返回当前正在处理的中断ID,若值大于等于0x3fe则视为无效中断。
  • deactivate_irq函数通过写入icc_eoir1_el1icc_dir_el1寄存器来清除中断标志,使能中断。

虚拟中断注入

  • inject_irq函数检查是否有可用的List Register (LR),并将虚拟中断信息写入其中。此函数区分硬件中断和软件生成中断,适当设置LR中的字段。

GIC数据结构初始化

  • GIC是一个全局的Once容器,用于延迟初始化Gic结构体,其中包含了GICD和GICR的基地址及其大小。
  • primary_init_early和primary_init_late函数分别在早期和后期初始化阶段配置GIC,使能中断。

区域(Zone)级别的初始化

在Zone结构体中,arch_irqchip_reset方法负责重置分配给特定zone的所有中断,通过直接写入GICD的ICENABLER和ICACTIVER寄存器来实现。

2. vGICv3模块

hvisor的VGICv3(Virtual Generic Interrupt Controller version 3)模块提供了对ARMv8-A架构中GICv3的虚拟化支持。它通过MMIO(Memory Mapped I/O)访问和中断比特图管理来控制和协调不同zone(虚拟机实例)间的中断请求。

MMIO区域注册

在初始化阶段,Zone结构体的vgicv3_mmio_init方法注册了GIC分布控制器(GICD)和每个CPU的GIC重新分布控制器(GICR)的MMIO区域。MMIO区域注册是通过mmio_region_register函数完成的,该函数关联了特定的处理器或中断控制器地址,以及相应的处理函数vgicv3_dist_handlervgicv3_redist_handler

中断比特图初始化

Zone结构体的irq_bitmap_init方法用于初始化中断比特图,这是为了跟踪哪些中断属于当前zone。通过遍历提供的中断列表,每个中断都会被插入到比特图中。insert_irq_to_bitmap函数负责将特定的中断号映射到比特图中的相应位置。 MMIO访问限制

restrict_bitmask_access函数用于限制对GICD寄存器的MMIO访问,确保只有属于当前zone的中断才能被修改。该函数检查访问是否针对当前zone的中断,如果是,则更新访问掩码,以允许或限制特定的读写操作。

VGICv3 MMIO处理

vgicv3_redist_handlervgicv3_dist_handler函数分别处理GICR和GICD的MMIO访问。vgicv3_redist_handler函数处理GICR的读写操作,检查是否访问的是当前zone的GICR,如果是,则允许访问;否则,忽略该访问。vgicv3_dist_handler函数根据不同的GICD寄存器类型,调用vgicv3_handle_irq_opsrestrict_bitmask_access函数,以适当地处理中断路由和配置寄存器的访问。

通过上述机制,hvisor能够有效地管理跨zone的中断,确保每个zone只能够访问和控制分配给它的中断资源,同时提供必要的隔离性。这使得在多zone环境中,VGICv3能够高效、安全地工作,支持复杂的虚拟化场景。