Virtual Interrupt Handling and Prioritization

About GIC support for virtualization

在EL2处执行的hypervisor的控制下在EL1处执行的操作系统有时被称为虚拟机(VM)。虚拟机可以支持多处理,这意味着由hypervisor调度的多个**虚拟PE(vPE)**正在一个或多个物理PE上执行。当vPE在PE上执行时,虚拟机的vPE被称为在物理PE上调度。

在Armv8和Armv9中,当EL2被实现和启用时,CPU interface提供了将中断路由到VM的hypervisor开销最小化的机制。
在GICv4中,对于直接注入的虚拟LPI,调度的vPE由GICR_VPENDBASE确定。

当GIC提供对虚拟化的支持时,虚拟机将在具有以下功能的环境中运行:

  • vPE可以被配置为接收虚拟Group 0中断。
  • vPE可以被配置为接收虚拟Group 1中断。
  • 使用虚拟FIQ信号向EL1发送虚拟Group 0中断的信号。
  • 使用虚拟IRQ信号向EL1发送虚拟Group 1中断的信号。
  • 虚拟中断可以由vPE处理,就好像它们是物理中断一样。

EL2控制虚拟机的虚拟中断的生成。这允许在EL2上执行的软件:

  • 为vPE生成虚拟Group 0和Group 1中断。
  • 保存并恢复vPE的中断状态。
  • 控制虚拟中断的优先级。
  • 更改scheduled的vPE。

GICv4引入了将虚拟LPI从ITS直接呈现给vPE的能力,而无需hypervisor干预。
在传统操作中处理虚拟中断需要一个ICV_*内存映射接口。

Operation overview

GICv3支持Armv8-A和Armv9-A虚拟化功能。在EL2执行的hypervisor使用ICH_系统寄存器接口来配置和控制在EL1执行的虚拟PE(vPE)。vPE使用ICC__EL1系统寄存器接口与GIC通信。**HCR_EL2.{IMO,FMO}**的配置决定是访问虚拟接口寄存器还是访问物理接口寄存器。
在EL3或EL2执行的软件将PE配置为将物理中断路由到EL2。中断可以是:

针对vPE的中断。hypervisor在目标vPE上,将相应的虚拟INTID设置为挂起状态,且包含关于相关联的物理INTID的信息。当vPE在没有PE上调度,hypervisor可能会选择重新调度vPE。否则,中断在vPE上pending,等待后续hypervisor 进行调度。
针对hypervisor的中断。此中断可能:

  • 已由系统生成。
  • 作为与虚拟机调度相关联可维护的中断。
  • 在GICv4中,作为来自ITS的doorbell中断。在GICv4中,虚拟中断可以呈现给vPE 而无需hypervisor参与。当当vPE的虚拟中断pending,但该vPE未在PE上调度时,必须生成doorbell中断。

虚拟化之前,hypervisor 会根据"Physical Interrupt Handling and Prioritization"中描述的规则处理物理中断。

GIC虚拟化支持包括存储在硬件列表寄存器中的vPE的虚拟中断列表。列表中的每个条目对应于一个pending或active的中断,该条目描述了虚拟中断编号(virtual interrupt number)、中断组中断状态中断的虚拟优先级(virtual priority of the interrupt)。列表条目中描述的虚拟中断可以被配置为与物理SPI或PPI相关联。

GIC实现从列表寄存器(List registers)中保存的中断列表中选择优先级最高的pending虚拟中断,如果与active虚拟中断和虚拟优先级掩码(virtual priority mask)相比,它具有足够的虚拟优先级,则根据中断组将其呈现为虚拟FIQ虚拟IRQ虚拟CPU接口 (virtual CPU interface)控制应用于虚拟中断的方式与物理中断控制应用于物理中断的方式相同。因此,使用虚拟CPU接口控件,在vPE上执行的软件可以:

  • 设置虚拟优先级掩码。
  • 控制如何在组优先级和次优先级之间分配虚拟优先级。
  • Acknowledge虚拟中断。
  • 对虚拟中断执行优先级下降。
  • 停用虚拟中断。

虚拟CPU接口支持两种EOI模式,因此虚拟EOI可以单独执行优先级降低,也可以组合执行优先级降低和去激活。
当acknowledge虚拟中断时,虚拟中断的状态在相应的列表寄存器条目中从pending变为active。
当虚拟中断被停用时,则在相应的列表寄存器条目中,虚拟中断的状态从active变为inactive,,或从active and pending起变为pending,。如果虚拟中断与物理中断相关联,则相关联的物理中断被停用。

以与在具有单个安全状态的系统中处理的物理中断类似的方式来处理带到EL1的虚拟中断,即GICD_CTLR.DS设置为1:

  • 使用虚拟FIQ信号发出Group0中断信号。
  • 使用虚拟IRQ信号发出Group 1中断信号。
  • Group 0和Group1中断共享中断优先级和抢占方案。支持最低32个和最高256个优先级。

在以下情况下,EL1对 Group 0寄存器的访问是虚拟的:

  • 当前安全状态为非安全且HCR_EL2.FMO==1。
  • 当前安全状态为安全,HCR_EL2.FMO1,SCR_EL3.EEL21。

对以下Group 0的ICC_*寄存器的虚拟访问,等效访问ICV_*寄存器:

  • 访问ICC_AP0R_EL1等效访问ICV_AP0R_EL1。
  • 访问ICC_BPR0_EL1等效访问ICV_BPR0_EL1。
  • 访问ICC_EOIR0_EL1等效访问ICV_EOIR0_EL1。
  • 访问ICC_HPPIR0_EL1等效访问ICV_HPPIR0_EL1。
  • 访问ICC_IAR0_EL1等效访问ICV_IAR0_EL1。
  • 访问ICC_IGRPEN0_EL1等效访问ICV_IGRPEN0_EL1。

在以下情况下,EL1对Group 1 寄存器的访问是虚拟的:

  • 当前安全状态为非安全且HCR_EL2.IMO==1。
  • 当前安全状态为安全,HCR_EL2.IMO1,SCR_EL3.EEL21。

对以下Group 1 ICC_*寄存器的虚拟访问,等效访问ICV_*等效寄存器:

  • 访问ICC_AP1R_EL1等效访问ICV_AP1R_EL1。
  • 访问ICC_BPR1_EL1等效访问ICV_BPR1_EL1。
  • 访问ICC_EOIR1_EL1等效访问ICV_EOIR1_EL1。
  • 访问ICC_HPPIR1_EL1等效访问ICV_HPPIR1_EL1。
  • 访问ICC_IAR1_EL1等效访问ICV_IAR1_EL1。
  • 访问ICC_IGRPEN1_EL1等效访问ICV_IGRPEN1_EL1。

在以下情况下,EL1对公共寄存器的访问是虚拟的:
•当前安全状态为非安全且(HCR_EL2.FMO1 | | HCR_EL2.IMO1)。
•当前安全状态为安全,(HCR_EL2.FMO1 | | HCR_EL2.IMO1)和SCR_EL3.EEL2==1。

对以下通用ICC_*寄存器的虚拟访问,等效访问ICV_*等效寄存器:

  • 访问ICC_RPR_EL1等效访问ICV_RPR_EL1。
  • 访问ICC_CTLR_EL1等效访问ICV_CTLR_EL1。
  • 访问ICC_DIR_EL1等效访问ICV_DIR_EL1。
  • 访问ICC_PMR_EL1等效访问ICV_PMR_EL1。

对ICC_SGI0R_EL1、ICC_SGI1R_EL1或ICC_ASGI1R_EL1的虚拟写入陷阱到EL2。
在EL2执行的软件可以使用ICH_VMCR_EL2和ICH_VTR_EL2访问一些ICV_*寄存器状态,如下所示:
ICV_PMR_EL1.优先级别名ICH_VMCR_EL2.VPMR。
ICV_BPR0_EL1.BinaryPoint别名ICH_VMCR_EL2.VBPR0。
ICV_BPR1_EL1.BinaryPoint别名ICH_VMCR_EL2.VBPR1。
ICV_CTLR_EL1.EOImode别名ICH_VMCR_EL2.VEOIM。
ICV_CTLR_EL1.CBPR别名ICH_VMCR_EL2.VCBPR。
ICV_IGRPEN0_EL1与ICH_VMCR_EL2.VENG0一致。
ICV_IGRPEN1_EL1。别名ICH_VMCR_EL2.VENG1。
ICV_CTRR_EL1.PRIbits别名ICH_VTR_EL2.PRIbits。
ICV_CTLR_EL1.ID位别名ICH_VTR_EL2.ID位。
ICV_CTLR_EL1.SEIS别名ICH_VTR_EL2.SEIS。
ICV_CTLR_EL1.A3V别名ICH_VTR_EL2.A3V。

Usage model for the List registers

中断控制器的基本功能是为每个PE按优先级顺序开发pending中断的列表,然后在中断具有足够优先级的情况下向PE呈现最高优先级的中断。对于物理中断,此任务完全由GIC在硬件中执行。然而,为了降低硬件成本,GIC使用硬件和软件来处理虚拟中断。

对于接收到的每个以vPE为目标的物理中断,hypervisor将该中断添加到呈现给vPE的pending虚拟中断的优先级列表中。GIC硬件还提供一组列表寄存器,ICH_LRn_EL2,它保存当前运行的vPE的优先级列表中的顶部条目的数量。通常,该vPE最多只有几个挂起的虚拟中断。然后,列表寄存器中的中断由vPE的硬件处理,为VM提供与处理物理中断的非虚拟化操作系统相同的行为。

但是,pending, active and pending 或active,的中断总数可能超过可用的列表寄存器数。在这种情况下,系统管理程序可以将一个或多个条目保存到内存中,然后根据它们的优先级将它们恢复到列表寄存器中。通过这种方式,列表寄存器充当vPE的pending、active或active and pending中断列表的缓存,这些中断由软件控制。
列表寄存器提供以下中断维护信号:

  • 发出信号的目的是:当List寄存器中没有挂起的中断时,允许hypervisor将更多挂起的中断加载到List寄存器。
  • 发出信号的目的是:当列表寄存器为空或几乎为空时,允许hypervisor用内存中列表中的条目重新填充列表寄存器。
  • 发出信号的目的是:当接收到不在列表寄存器中的条目的EOI时,,如果内存中存在活动中断,则可能发生这种情况。
  • 启用和禁用虚拟中断组,这可能导致需要更改列表寄存器的内容。

尽管List寄存器可能只包括active中断,但由于hypervisor在内存中维护任何pending的中断,在hypervisor将挂起中断添加到List寄存器之前,无法向vPE发出信号。因此,为了最大限度地减少中断延迟并确保vPE的有效运行,如果列表寄存器可用于此中断,Arm强烈建议列表寄存器至少包含一个pending的中断。

列表寄存器是vPE上下文的一部分。当从PE上运行的一个vPE切换到另一个vE时,hypervisor会相应地切换List寄存器。
列表寄存器的数量可以通过读取ICH_VTR_EL2来发现。
具有列表寄存器条目,当ICH_LR<n>_EL2.HW=1时,即与物理中断相关,处于active 状态或pending 状态,如果Distributor没有处于active 状态或active and pending状态的相应物理中断,则列出寄存器。

List register usage resulting in UNPREDICTABLE behavior

以下情况被视为软件编程错误,并导致不可预测的行为:

  • 对于单个virtual CPU interface,在列表寄存器中具有两个或多个具有相同pINTID的中断。
  • 如果Distributor没有处于active状态或active and pending状态的相应物理中断,具有ICH_LR_EL2.HW=1的列表寄存器条目,该条目与列表寄存器中处于active状态的或pending态下的物理中断相关联。
  • 如果ICV_CTLR_EL1.EOImode==0,则:
    –在列表寄存器中有一个活动中断,其优先级未在相应的活动优先级寄存器中设置。
    –使列表寄存器中的两个中断处于活动状态,且具有相同的抢占优先级。
  • 当支持GICv4时,为使用相同vINTID的一个vPE提供有效的List寄存器和ITS映射。
  • 当支持GICv4.1时,将vINTID设置为SGI的有效列表寄存器,并通过ITS为vPE生成相同的SGI。

Configuration and control of VMs

虚拟GIC的工作原理是为每个PE保存一个pending虚拟中断的优先级列表。在GICv3中,这个列表是在软件中编译的,一些顶级条目保存在硬件的列表寄存器中。对于LPI,可以使用每个vPE的表来编译此列表。这些表由ICR_*寄存器控制。

hypervisor使用可在EL2访问的系统寄存器接口来切换上下文并控制多个虚拟机。ICH_*系统寄存器中保存的上下文是计划的vPE的上下文。在以下情况下调度vPE:

  • ICH_HCR_EL2.En==1。
  • 当虚拟化Group0中断时,HCR_EL2.FMO==1。
  • 当虚拟化Group1中断时,HCR_EL2.IMO==1。
  • PE在EL1执行,并且:
    -SCR_EL3.NS=1。
    -SCR_EL3.EEL2=1。
    当vPE被调度时,ICH_EL2寄存器会影响在EL1执行的软件。
    ICH
    _EL2寄存器控制并维护vPE,如下所示:
  • ICH_HCR_EL2用于虚拟中断的顶层配置和控制。
  • 从ICH_VTR_EL2读取关于实现的信息,例如所支持的虚拟INTID的大小和优先级级别的数量。
  • hypervisor可以使用ICH_VMCR_EL2来监控ICV_CTLR_EL1并为其提供上下文。
  • hypervisor使用一组列表寄存器ICH_LRn_EL2将pending的中断队列转发到PE,ICH_LRn_EL2中的空闲位置的状态保持在ICH_ELRSR_EL2中。
  • 列表寄存器的中断结束状态保存在ICH_EISR_EL2中。
  • 虚拟机维护中断状态保存在ICH_MISR_EL2中。
  • active优先级状态保持在:
    -ICH_AP0Rn_EL2,其中n=0-3。
    -ICH_AP1Rn_EL2,其中n=0-3。

Association of virtual interrupts with physical interrupts

虚拟中断可以响应物理中断而变为pending,例如,在物理中断由特定VM所拥有的外围设备使用的情况下,或者在没有相应物理中断的情况下由于其他原因可以由hypervisor生成。例如,当hypervisor模拟虚拟外围设备时,可以使用第二种情况。

为了支持这两种模型,对于SPI和PPI,GIC列表寄存器提供了一种机制来配置与物理中断相关联的虚拟中断。物理中断和虚拟中断不一定具有相同的INTID。

Usage model for associating a virtual interrupt with a physical interrupt
虚拟中断可以与物理中断相关联,如下所示:

  • hypervisor在此模型中配置ICC_CTLR_EL1.EOImode==1。
  • 在获取以vPE为目标的物理PPI或物理SPI时,中断被路由到hypervisor,并由hypervisor acknowledged,从而使物理中断处于active状态。
  • hypervisor将虚拟中断插入到目标vPE的pending中断列表中。当hypervisor想要对该中断进行优先级降低时,它会执行EOI。hypervisor不会停用中断。
  • 当该虚拟中断在该vPE的pending中断列表中具有足够高的优先级,并且该vPE在PE上被调度时,hypervisor将该挂起的虚拟中断写入列表寄存器,并且ICH_LRn_EL2.HW被设置为1,以指示该虚拟中断与物理中断相关联。相关物理中断的INTID保存在同一个列表寄存器中。
  • 当vPE运行时,它将接受pending的虚拟中断,并使用虚拟CPU interface.以与确认物理中断相同的方式对其进行确认。当vPE上运行的中断处理程序已完成其任务,并且虚拟中断将被停用时,硬件将停用虚拟中断和相关的物理中断。如果ICH_VMCR_EL2.VEOIM0,则虚拟中断可能由于中断结束而被停用,或者如果ICH_VMSCR_EL2_VEOIM1,则作为单独停用的结果而被停用。

The Active Priorities registers

使用ICH_AP0Rn_EL2和ICH_AP1Rn_EL2,分别为虚拟Group 0和Group 1中断保留active优先级,其中n=0-3。活动优先级寄存器由实现为每个优先级group提供一个位。在GICv3中,虚拟化最多支持8位优先级。然而,作为中断优先级分组的结果,比特[0]不能用于抢占。这意味着需要最多128个活动优先级比特来维持上下文。实现的寄存器数量取决于支持的组优先级位的数量,如表下图所示。
在这里插入图片描述
如果ICH_AP0Rn_EL2寄存器中的一个寄存器中的位设置为1,则在非安全EL1或非安全EL0中执行时,ICH_AP1Rn_EL2寄存器的等效位必须为零,否则GIC的行为是不可预测的。
如果ICH_AP1Rn_EL2寄存器中的一个寄存器中的位设置为1,则在非安全EL1或非安全EL0中执行时,ICH_AP0Rn_EL2寄存器的等效位必须为零,否则GIC的行为是不可预测的。

CH_AP0Rn_EL2提供最多128个比特的列表,其中每个实现的可抢占优先级都有一个比特。
如果一个比特是1,这表明在该优先级组中有一个Group 0中断,该中断已被确认,但优先级没有下降。如果一个位为0,这表示在该优先级下没有激活的Group0中断,或者该优先级组内的所有活动的Group 0中断都经历了优先级下降。
写入链路寄存器不会对活动优先级寄存器产生影响。
ICH_AP1Rn_EL2提供了一个最多128位的列表,其中每个实现的可抢占优先级都有一位。
如果一个比特是1,这表明在该优先级组中有一个Group 1中断,该中断已被确认,但没有优先级下降。如果一个位为0,这表明在该优先级下没有激活的Group 1中断,或者该优先级组内的所有激活的Group 1中断都经历了优先级下降。
将寄存器上一次读取值或0x00000000以外的任何值写入这些寄存器可能会导致:

  • 虚拟中断,否则会抢占执行而不是抢占执行。
  • 否则不会抢占执行的虚拟中断将抢占EL1或EL0的执行。

以以下顺序以外的任何顺序写入活动优先级寄存器会导致不可预测的行为:
1.ICH_AP0R_EL2。
2.ICH_AP1R_EL2

Maintenance interrupts

维护中断可以在实现虚拟化的GIC的操作中发出关键事件的信号。这些事件由 hypervisor处理。
维护中断是级别敏感的中断。ICH_HCR_EL2中的配置位可以设置为1以启用当出现以下情况时,维护中断的产生:

  • 启用了Group 0虚拟中断。
  • 启用Group1虚拟中断。
  • Group 0虚拟中断被禁用。
  • Group 1虚拟中断被禁用。
  • 列表寄存器中没有挂起的中断。
  • 至少有一个EOI请求发生,但没有相应中断的有效列表寄存器条目。
  • 列表寄存器中没有有效条目,或者只有一个有效条目。这是下溢情况。
  • 至少有一个列表寄存器条目收到了EOI请求。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值