sPAPR 虚拟机管理器调用

qemu-system-ppc64 使用 pseries 机器时,实现 Linux on Power Architecture Reference ([LoPAR])定义的一组虚拟机管理器调用,即 hcall。 LoPAR 是 IBM 内部 PAPR+ 规范的子集,后者也是 IBM 专有管理器 PowerVM 遵循的规范。

LoPAR 子集根据 Linux 客户机需求选取。

除此之外,QEMU 增加了私有调用,主要作为客户机固件与 QEMU 的私有接口。

这些调用从 0xf000 开始,对应 PAPR 的实现专用范围。

H_RTAS (0xf000)

RTAS 即运行时抽象服务,通常由客户机固件提供给操作系统。 它早于虚拟机管理器,最初是 Open Firmware 扩展。 PAPR 和 LoPAR 仍用它提供不敏感于性能的服务。

当前 RTAS 服务实现在 QEMU 中。客户机 RTAS 固件只是少量指令的桩, 通过私有 H_RTAS 将调用转交 QEMU。

参数:

r3:H_RTAS (0xf000)

r4:RTAS 参数块的客户机物理地址。

返回:

H_SUCCESS:成功调用 RTAS,结果已存入参数块。

H_PARAMETER:未知 token。

H_LOGICAL_MEMOP (0xf001)

客户机处于实模式时,在 PowerPC 中意味着 MMU 禁用、有效地址等于物理地址, 只能访问部分内存,无法访问 I/O。

PAPR 和 LoPAR 提供可缓存和不可缓存的客户机物理地址访问调用, 让客户机在实模式访问 I/O,通常由客户机固件使用。

但访问帧缓冲时,每次访问都进行 hcall 效率极低,KVM 下更明显, 会使滚屏等操作慢到无法使用。

此调用允许客户机请求内存操作。目前支持复制内存区间(允许源和目标重叠), 以及 SLOF 固件用于反转屏幕的 XOR。

参数:

r3:H_LOGICAL_MEMOP (0xf001)

r4:目标客户机物理地址。

r5:源客户机物理地址。

r6:单个元素大小,以大小的二进制对数表示。支持:

0 = 1 字节

1 = 2 字节

2 = 4 字节

3 = 8 字节

r7:元素数量。

r8:操作,支持:

0:复制。

1:异或。

返回:

H_SUCCESS:成功。

H_PARAMETER:无效参数。