arm64 上的半虚拟化时间支持¶
Arm 规范 DEN0057/A 定义了 AArch64 访客(guest)的半虚拟化时间支持标准
https://developer.arm.com/docs/den0057/a
KVM/arm64 通过提供一些管理程序服务调用,实现了该规范中关于“被窃时间”的部分,以支持半虚拟化访客获取其执行中被窃取的时间量视图。
定义了两个新的 SMCCC 兼容的 hypercall
PV_TIME_FEATURES: 0xC5000020
PV_TIME_ST: 0xC5000021
这些仅在 SMC64/HVC64 调用约定中可用,因为 32 位 Arm 访客无法使用半虚拟化时间。在调用 PV_TIME_FEATURES hypercall 之前,应使用 SMCCC 1.1 ARCH_FEATURES 机制探测其是否存在。
PV_TIME_FEATURES
函数 ID
(uint32)
0xC5000020
PV_call_id
(uint32)
查询支持的函数。目前仅支持 PV_TIME_ST。
返回值
(int64)
如果管理程序支持相关的 PV-time 特性,则返回 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 hypercall 指向的结构如下
字段 |
字节长度 |
字节偏移 |
描述 |
---|---|---|---|
修订版本 |
4 |
0 |
版本 1.0 必须为 0 |
属性 |
4 |
4 |
必须为 0 |
被窃时间 |
8 |
8 |
被窃时间,以无符号纳秒表示,指示此 VCPU 线程在物理 CPU 上非自愿未运行的时间量。 |
结构中的所有值都以小端序存储。
该结构将在调度 VCPU 之前由管理程序更新。它将存在于分配给访客的普通内存的保留区域内。访客不应尝试写入此内存。访客的每个 VCPU 都有一个对应的结构。
建议将一个或多个 64k 页面专门用于这些结构,不作他用,这样访客可以使用 64k 页面映射该区域,并避免与其他内存发生属性冲突。
有关用户空间接口,请参见 Documentation/virt/kvm/devices/vcpu.rst。