POWER9 XIVE 中断控制器
POWER9 处理器引入一种新的中断控制器架构,名为 XIVE,即“外部中断虚拟化引擎” (eXternal Interrupt Virtualization Engine)。
相较于以前的架构,XIVE 的主要特点是支持更多中断源,并且无需 hypervisor 协助即可 将中断直接投递给虚拟处理器,从而省去投递过程所需的上下文切换。
XIVE 架构
XIVE 中断控制器由三个子引擎组成,各自负责外部中断的一层处理:
中断虚拟化源引擎(IVSE),或源控制器(SC)。它们位于 PCI PHB、处理器服务接口 (PSI)主机桥控制器内,也位于主控制器内部,用于核心 IPI 以及芯片/处理器的 其他子芯片(NX、CAP、NPU)。这些引擎通过配置向 IVRE 提供事件。
中断虚拟化路由引擎(IVRE),或虚拟化控制器(VC)。它负责事件合并,并通过 将事件源编号与事件通知描述符(END)匹配来执行中断路由。
中断虚拟化呈现引擎(IVPE),或呈现控制器(PC)。它维护每个线程的中断上下文 状态,并负责向线程投递外部中断。
XIVE 中断控制器
+------------------------------------+ IPIs
| +---------+ +---------+ +--------+ | +-------+
| |IVRE | |公共队列 | |IVPE |----> | 核心 |
| | esb | | | | |----> | |
| | eas | | 桥 | | tctx |----> | |
| |SC end | | | | nvt | | | |
+------+ | +---------+ +----+----+ +--------+ | +-+-+-+-+
| RAM | +------------------|-----------------+ | | |
| | | | | |
| | | | | |
| | +--------------------v------------------------v-v-v--+ 其他
| <--+ Power 总线 +--> 芯片
| esb | +---------+-----------------------+------------------+
| eas | | |
| end | +--|------+ |
| nvt | +----+----+ | +----+----+
+------+ |IVSE | | |IVSE |
| | | | |
| PQ 位 | | | PQ 位 |
| 本地 |-+ | 在VC内 |
+---------+ +---------+
PCIe NX,NPU,CAPI
PQ 位 : 2 位源状态机(P:待处理,Q:已排队)
esb: 事件状态缓冲区(IVSE 中 PQ 位的数组)
eas: 事件分配结构
end: 事件通知描述符
nvt: 通知虚拟目标
tctx: 线程中断上下文寄存器
XIVE 内部表
各个子引擎使用一组表,将中断从事件源重定向到 CPU 线程。
+-------+
用户或 OS | EQ |
或 +------>|条目 |
Hypervisor | | .. |
内存 | +-------+
| ^
| |
+-------------------------------------------------+
| |
Hypervisor +------+ +---+--+ +---+--+ +------+
内存 | ESB | | EAT | | ENDT | | NVTT |
(skiboot) +----+-+ +----+-+ +----+-+ +------+
^ | ^ | ^ | ^
| | | | | | |
+-------------------------------------------------+
| | | | | | |
| | | | | | |
+----|--|--------|--|--------|--|-+ +-|-----+ +------+
| | | | | | | | | | tctx| |线程 |
IPI 或 ---+ + v + v + v |---| + .. |-----> |
硬件事件 | | | | | |
| IVRE | | IVPE | +------+
+---------------------------------+ +-------+
IVSE 为每个允许触发事件的源维护一个 2 位状态机,其中 P 表示待处理,Q 表示已排队。 这些状态保存在事件状态缓冲区(ESB)数组中,可通过 MMIO 控制。
如果事件获准通过,IVRE 就在事件分配结构(EAS)表中查找为该源配置的事件通知 描述符(END)。每个事件通知描述符定义一条通往 CPU 和内存中事件队列的通知路径; EQ 数据将加入该队列,供操作系统取出。
IVPE 扫描已调度到处理器硬件线程上的 VCPU 的线程上下文,判断通知虚拟目标(NVT) 能否处理该事件。它在 NVT 表中维护每个线程的中断上下文状态。
XIVE 线程中断上下文
XIVE 呈现器可以向其硬件线程生成四种不同的异常:
hypervisor 异常
操作系统异常
基于事件的分支(用户级)
msgsnd(门铃)
每种异常都有独立于其他异常的状态,称为线程中断管理上下文。这个上下文是一组 寄存器,供线程处理优先级管理、中断确认等操作。其中最重要的寄存器包括:
中断优先级寄存器(PIPR)
中断待处理缓冲区(IPB)
当前处理器优先级(CPPR)
通知源寄存器(NSR)
TIMA
线程中断管理寄存器可通过称为线程中断管理区域(TIMA)的专用 MMIO 区域访问。
该区域由四个对齐的页面组成,各自暴露寄存器的不同视图。第一页(页地址以 0b00
结尾)可访问完整上下文,保留给物理线程上下文的 ring 0 视图。第二页(页地址以
0b01 结尾)供 hypervisor 使用,即 ring 1 视图。第三页(页地址以 0b10
结尾)供操作系统使用,即 ring 2 视图。第四页(页地址以 0b11 结尾)供用户级
使用,即 ring 3 视图。
从操作系统角度看中断流程
事件数据加入操作系统事件队列后,IVPE 会在 IPB(中断待处理缓冲区)寄存器中置位 与待处理中断优先级对应的位,表明 8 个优先级队列之一存在待处理事件。 待处理中断优先级寄存器(PIPR)也根据 IPB 更新,表示最优先的待处理通知的优先级。
随后将 PIPR 与当前处理器优先级寄存器(CPPR)比较。如果前者优先级更高 (数值更小),则拉高中断线,并更新通知源寄存器(NSR)的 EO 位,通知操作系统 存在异常。操作系统通过在线程中断管理区域执行一次特殊的加载操作来确认中断。
操作系统处理中断,完成后对关联中断源的 ESB 管理页执行 MMIO 操作,发出 EOI。
QEMU 的 XIVE 模型概述
XiveSource 对内部和外部的 IVSE 进行通用建模,处理源 ESB 及控制它们的 MMIO 接口。
XiveNotifier 是将 XiveSource 与 XiveRouter 互连的小型辅助接口。
XiveRouter 是结合 IVRE 与 IVPE 功能的抽象模型。它使用 EAS 和 END 表将事件通知 路由到 IVPE 子引擎,后者通过 CAM 扫描找到接收异常的 CPU。存储应由继承它的类提供。
XiveEnDSource 是一种特殊的源对象。它暴露事件队列的 END ESB MMIO,用于合并事件通知 和进行升级。实际部署中不使用该功能,仅在 OPAL 中用来同步 EQ 缓存。
最后,XiveTCTX 包含线程的中断状态上下文,即四组寄存器,每种可投递给 CPU 的异常 各一组。通知触发时,IVPE 扫描这些上下文以找到匹配的 VP。它还对线程中断管理区域 (TIMA)建模,将线程上下文寄存器暴露给 CPU,供其管理中断。