GICV3 virtualization
ARMV8-A架构中包含了对虚拟化的支持。为了与架构保持匹配,GICV3也对虚拟化做了支持。新增了以下特性:
- 对CPU interface的硬件虚拟化
- 虚拟中断
- maintenance 中断
GIC架构不提供对gicd、gicr和ITS部件的虚拟化。对于这些接口的虚拟化必须通过软件来进行处理。
CPU Interfaces
CPU interfaces被分为了三个部分:
- 物理的CPU接口寄存器
- 虚拟化控制寄存器
- 虚拟的CPU接口寄存器
-
physical CPU interface
执行在EL2的管理程序可以通过ICC_*_ELn寄存器对物理中断进行处理
-
virtualization control
管理程序可以访问额外的寄存器,用于控制架构提供的虚拟化特性,包括:
- 使能/关闭virtual CPU interface
- 访问虚拟寄存器状态用于进行上下文的切换
- 配置maintenance中断
- 控制虚拟中断
这些寄存器控制的是它们能够访问的物理PE的虚拟化特性,不能访问其他PE的状态(执行在PE X上的软件不能访问PE Y的状态)
-
virtual CPU interface
执行在虚拟环境中的软件通过ICV_EL1寄存器对中断进行处理。这些寄存器与ICC_EL1寄存器有着相同的形式与功能。
ICV寄存器和ICC寄存器的instruction encoding都是相同的。在EL2、EL3和安全EL1状态下,往往使用的是ICC寄存器。在非安全EL1状态下,使用ICC寄存器还是ICV寄存器是由HCR_EL2寄存器(FMO、IMO字段)来决定的。
管理虚拟中断
执行在EL2的管理程序可以通过ICH_LR
- virtual INTID
- state(pending、active、active&pending、inactive)
- group(group0、group1s、group1ns)
- pINTID(虚拟中断可以选择与物理中断绑定起来,两者的状态机会同步更新)
当一个物理中断被转发给vPE时会发生以下步骤:
- gicr将一个物理的非安全group1中断转发到物理的CPU interface上
- CPU interface检查该中断是否能被转发至PE上
- 该中断被在EL2进行处理。管理程序读IAR寄存器,并决定是否将其转发到vPE上。然后写EOIR寄存器。当ICC_CTLR_EL1.EOImode == 1时,写EOIR寄存器这个操作,只会执行优先级下降,而不会deactive这个物理中断。详细内容查看物理中断的生命周期。
- 管理程序写上述提到的LIST 寄存器来产生一个虚拟中断。该虚拟中断与物理中断绑定在了一起。然后管理程序进行异常返回。
- 虚拟CPU interface检查该虚拟中断是否能被转发到vPE上。除了使用ICV寄存器之外,这些检查与物理中断的检查是相同的。
- 这个虚拟中断会被带到非安全的EL1状态。当软件读取IAR寄存器时,该虚拟中断进入active态。
- 执行在非安全EL1的软件对该中断进行处理。当其处理完成后,写EOIR寄存器。因为该虚拟中断与物理中断绑定在了一起,所以虚拟中断会和物理中断一起进入deactive状态,结束整个中断处理。
Maintenance Interrupt
可以配置CPU interface,在当虚拟的CPU interface满足一定条件时产生一个物理的中断。这个中断会被上报为中断号为25的PPI中断。这个中断一般会被配置为非安全group1类型的中断,并且由执行在EL2的管理程序进行处理。
维护中断的生成是由ICH_HCR_EL2进行控制的,并且该类型的中断触发会在ICH_MISR_EL2寄存器报告。
例如:当vPE把虚拟CPU interface上的group0中断的使能位给清零了,就会产生一个维护中断。看到这个中断之后,管理程序可以清除list register上所有处于pending状态的group0中断。