LoongArch 半虚拟化接口¶
KVM 超调用使用代码为 0x100 的 HVCL 指令,并将超调用编号放入 a0。最多可以将五个参数放入寄存器 a1 - a5 中。返回值放在 v0 (a0 的别名) 中。
此接口的源代码可以在 arch/loongarch/kvm* 中找到。
查询是否存在¶
为了确定主机是否在 KVM 上运行,我们可以利用索引为 CPUCFG_KVM_BASE (0x40000000) 的 cpucfg() 函数。
CPUCFG_KVM_BASE 范围从 0x40000000 到 0x400000FF。 0x40000000 - 0x400000FF 之间的 CPUCFG_KVM_BASE 范围被标记为保留。 因此,所有当前和未来的处理器都不会在此范围内实现任何功能。
在 KVM 虚拟化的 Linux 系统上,对索引为 CPUCFG_KVM_BASE (0x40000000) 的 cpucfg() 执行读取操作会返回魔术字符串 ‘KVM0’。
一旦您确定您的主机在支持半虚拟化的 KVM 上运行,您现在可以使用如下所述的超调用。
KVM 超调用 ABI¶
KVM 超调用 ABI 很简单,只有一个暂存寄存器 a0 (v0) 和最多五个通用寄存器 (a1 - a5) 用作输入参数。 FP(浮点)和向量寄存器不作为输入寄存器使用,并且必须在超调用期间保持未修改状态。
超调用函数可以内联,因为它只使用一个暂存寄存器。
参数如下
寄存器
输入
输出
a0
函数编号
返回码
a1
第一个参数
a2
第二个参数
a3
第三个参数
a4
第四个参数
a5
第五个参数
返回码可能是以下之一
代码
含义
0
成功
-1
超调用未实现
-2
错误的超调用参数
KVM 超调用文档¶
每个超调用的模板如下
超调用名称
目的
1. KVM_HCALL_FUNC_IPI¶
- 目的:
向多个 vCPU 发送 IPI。
a0: KVM_HCALL_FUNC_IPI
a1: 目标物理 CPUID 的位图的低位部分
a2: 目标物理 CPUID 的位图的高位部分
a3: 位图中最低的物理 CPUID
该超调用允许访客每个超调用最多发送 128 个目的地的多个 IPI(进程间中断)。 目的地以包含在头两个输入寄存器(a1 和 a2)中的位图表示。
a1 的位 0 对应于第三个输入寄存器(a3)中的物理 CPUID,位 1 对应于 a3+1 中的物理 CPUID,依此类推。
LoongArch 上的 PV IPI 包括 PV IPI 多播发送和 PV IPI 接收,并且 SWI 用于 PV IPI 注入,因为没有 VM-exits 访问 SWI 寄存器。