arm64 的半虚拟化时间支持

Arm 规范 DEN0057/A 定义了 AArch64 访客的半虚拟化时间支持标准

https://developer.arm.com/docs/den0057/a

KVM/arm64 通过提供一些管理程序服务调用来实现此规范的被盗时间部分,以支持半虚拟化访客获取从其执行中被盗的时间量视图。

定义了两个新的与 SMCCC 兼容的超级调用

  • PV_TIME_FEATURES:0xC5000020

  • PV_TIME_ST:0xC5000021

这些仅在 SMC64/HVC64 调用约定中可用,因为半虚拟化时间不适用于 32 位 Arm 访客。在调用 PV_TIME_FEATURES 超级调用之前,应使用 SMCCC 1.1 ARCH_FEATURES 机制探测其是否存在。

PV_TIME_FEATURES

函数 ID

(uint32)

0xC5000020

PV_call_id

(uint32)

用于查询支持的函数。当前仅支持 PV_TIME_ST。

返回值

(int64)

如果管理程序支持相关的 PV 时间特性,则为 NOT_SUPPORTED (-1) 或 SUCCESS (0)。

PV_TIME_ST

函数 ID

(uint32)

0xC5000021

返回值

(int64)

此 VCPU 的被盗时间数据结构的 IPA。失败时:NOT_SUPPORTED (-1)

访客应将 PV_TIME_ST 返回的 IPA 映射为具有内部和外部回写缓存属性的普通内存,在内部共享域中。保证从返回的 IPA 中总共 16 个字节由管理程序有意义地填充(请参阅下面的结构)。

PV_TIME_ST 返回调用 VCPU 的结构。

被盗时间

PV_TIME_ST 超级调用指向的结构如下

字段

字节长度

字节偏移

描述

修订版

4

0

对于版本 1.0,必须为 0

属性

4

4

必须为 0

被盗时间

8

8

以无符号纳秒为单位的被盗时间,指示此 VCPU 线程在物理 CPU 上非自愿未运行多长时间。

结构中的所有值都以小端字节序存储。

该结构将在调度 VCPU 之前由管理程序更新。它将存在于分配给访客的普通内存的保留区域内。访客不应尝试写入此内存。访客的每个 VCPU 都有一个结构。

建议为此目的留出一个或多个 64k 页面,不要用于其他目的,这使访客可以使用 64k 页面映射该区域,并避免与其他内存发生冲突的属性。

有关用户空间接口,请参见 Documentation/virt/kvm/devices/vcpu.rst