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:无效参数。