通用虚拟机接口¶
虚拟机“设备”也接受 ioctl KVM_SET_DEVICE_ATTR、KVM_GET_DEVICE_ATTR 和 KVM_HAS_DEVICE_ATTR。该接口使用与其他设备相同的结构 kvm_device_attr,但目标是虚拟机范围内的设置和控制。
每个虚拟机的组和属性(如果有)是特定于架构的。
1. 组:KVM_S390_VM_MEM_CTRL¶
- 架构:
s390
1.1. 属性:KVM_S390_VM_MEM_ENABLE_CMMA¶
- 参数:
无
- 返回值:
如果已定义 vcpu,则返回 -EBUSY,否则返回 0
为虚拟机启用协作内存管理辅助 (CMMA)。
1.2. 属性:KVM_S390_VM_MEM_CLR_CMMA¶
- 参数:
无
- 返回值:
如果未启用 CMMA,则返回 -EINVAL;否则返回 0
清除所有访客页面的 CMMA 状态,因此任何访客标记为未使用的页面都将再次使用,并且可能不会被主机回收。
1.3. 属性 KVM_S390_VM_MEM_LIMIT_SIZE¶
- 参数:
在 attr->addr 中,表示访客内存新限制的地址
- 返回值:
如果给定的地址不可访问,则返回 -EFAULT;如果虚拟机类型为 UCONTROL,则返回 -EINVAL;如果给定的访客内存对于该机器来说太大,则返回 -E2BIG;如果已定义 vcpu,则返回 -EBUSY;如果没有足够的内存可用于新的影子访客映射,则返回 -ENOMEM;否则返回 0。
允许用户空间查询实际限制,并为最大访客内存大小设置新限制。该限制将分别向上舍入为 2048 MB、4096 GB、8192 TB,因为此限制受页表级别的数量控制。如果没有任何限制,我们将把限制设置为 KVM_S390_NO_MEM_LIMIT (U64_MAX)。
2. 组:KVM_S390_VM_CPU_MODEL¶
- 架构:
s390
2.1. 属性:KVM_S390_VM_CPU_MACHINE (只读)¶
允许用户空间检索机器和 kvm 特定的 cpu 相关信息
struct kvm_s390_vm_cpu_machine {
__u64 cpuid; # CPUID of host
__u32 ibc; # IBC level range offered by host
__u8 pad[4];
__u64 fac_mask[256]; # set of cpu facilities enabled by KVM
__u64 fac_list[256]; # set of cpu facilities offered by host
}
- 参数:
用于存储类型为 struct kvm_s390_vm_cpu_machine* 的机器相关 cpu 数据的缓冲区地址
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果没有足够的内存可用于处理 ioctl,则返回 -ENOMEM;成功时返回 0。
2.2. 属性:KVM_S390_VM_CPU_PROCESSOR (读/写)¶
允许用户空间检索或请求更改 vcpu 的 cpu 相关信息
struct kvm_s390_vm_cpu_processor {
__u64 cpuid; # CPUID currently (to be) used by this vcpu
__u16 ibc; # IBC level currently (to be) used by this vcpu
__u8 pad[6];
__u64 fac_list[256]; # set of cpu facilities currently (to be) used
# by this vcpu
}
KVM 不以任何形式强制或限制 cpu 模型数据。将通过 KVM_S390_VM_CPU_MACHINE 检索的信息作为合理配置设置的提示。由 KVM 未处理的其他设置的功能位触发的指令拦截需要在 VM 驱动程序代码中实现。
- 参数:
用于存储/设置类型为 struct kvm_s390_vm_cpu_processor* 的处理器相关 cpu 数据的缓冲区地址。
- 返回值:
如果 1 个或多个 vcpu 已激活,则返回 -EBUSY(仅在写入情况下);如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果没有足够的内存可用于处理 ioctl,则返回 -ENOMEM;成功时返回 0。
2.3. 属性:KVM_S390_VM_CPU_MACHINE_FEAT (只读)¶
允许用户空间检索可用的 cpu 功能。如果硬件提供并且 kvm 支持,则该功能可用。理论上,cpu 功能甚至可以完全由 kvm 模拟。
struct kvm_s390_vm_cpu_feat {
__u64 feat[16]; # Bitmap (1 = feature available), MSB 0 bit numbering
};
- 参数:
用于加载功能列表的缓冲区地址。
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;成功时返回 0。
2.4. 属性:KVM_S390_VM_CPU_PROCESSOR_FEAT (读/写)¶
允许用户空间检索或更改 VM 的所有 VCPU 的已启用 cpu 功能。无法启用不可用的功能。
有关参数结构的描述,请参阅2.3. 属性:KVM_S390_VM_CPU_MACHINE_FEAT (只读)。
- 参数:
用于存储/加载功能列表的缓冲区地址。
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果要启用不可用的 cpu 功能,则返回 -EINVAL;如果至少已定义一个 VCPU,则返回 -EBUSY;成功时返回 0。
2.5. 属性:KVM_S390_VM_CPU_MACHINE_SUBFUNC (只读)¶
允许用户空间检索可用的 cpu 子功能,而无需任何 IBC 设置的过滤。这些子功能通过查询或“测试位”子功能指示给访客 VCPU,并由例如 cpacf 函数、plo 和 ptff 使用。
仅当 KVM_S390_VM_CPU_MACHINE 包含引入受影响指令的 STFL(E) 位时,子功能块才有效。如果受影响的指令通过“查询子功能”指示子功能,则响应块包含在返回的结构中。如果受影响的指令通过“测试位”机制指示子功能,则子功能代码包含在返回的结构中,MSB 0 位编号。
struct kvm_s390_vm_cpu_subfunc {
u8 plo[32]; # always valid (ESA/390 feature)
u8 ptff[16]; # valid with TOD-clock steering
u8 kmac[16]; # valid with Message-Security-Assist
u8 kmc[16]; # valid with Message-Security-Assist
u8 km[16]; # valid with Message-Security-Assist
u8 kimd[16]; # valid with Message-Security-Assist
u8 klmd[16]; # valid with Message-Security-Assist
u8 pckmo[16]; # valid with Message-Security-Assist-Extension 3
u8 kmctr[16]; # valid with Message-Security-Assist-Extension 4
u8 kmf[16]; # valid with Message-Security-Assist-Extension 4
u8 kmo[16]; # valid with Message-Security-Assist-Extension 4
u8 pcc[16]; # valid with Message-Security-Assist-Extension 4
u8 ppno[16]; # valid with Message-Security-Assist-Extension 5
u8 kma[16]; # valid with Message-Security-Assist-Extension 8
u8 kdsa[16]; # valid with Message-Security-Assist-Extension 9
u8 reserved[1792]; # reserved for future instructions
};
- 参数:
用于从其中加载子功能块的缓冲区地址。
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;成功时返回 0。
2.6. 属性:KVM_S390_VM_CPU_PROCESSOR_SUBFUNC (读/写)¶
允许用户空间检索或更改要为 VM 的所有 VCPU 指示的 cpu 子功能。只有当内核和硬件支持到位时,此属性才可用。
内核使用配置的子功能块向访客指示。仅当关联的 STFL(E) 位未被用户空间禁用时,才会使用子功能块(因此,要查询的指令实际上可用于访客)。
只要没有写入任何数据,读取就会失败。在这种情况下,将使用 IBC 来确定可用的子功能,这将保证向后兼容性。
有关参数结构的描述,请参阅2.5. 属性:KVM_S390_VM_CPU_MACHINE_SUBFUNC (只读)。
- 参数:
用于存储/加载子功能块的缓冲区地址。
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果读取时尚未写入,则返回 -EINVAL;如果至少已定义一个 VCPU,则返回 -EBUSY;成功时返回 0。
3. 组:KVM_S390_VM_TOD¶
- 架构:
s390
3.1. 属性:KVM_S390_VM_TOD_HIGH¶
允许用户空间设置/获取 TOD 时钟扩展 (u8)(已被 KVM_S390_VM_TOD_EXT 取代)。
- 参数:
用户空间中用于存储数据 (u8) 的缓冲区地址
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果不支持将 TOD 时钟扩展设置为 != 0,则返回 -EINVAL;对于 PV 访客(TOD 由超管理器管理),则返回 -EOPNOTSUPP
3.2. 属性:KVM_S390_VM_TOD_LOW¶
允许用户空间设置/获取在 POP (u64) 中定义的 TOD 时钟寄存器的位 0-63。
- 参数:
用户空间中用于存储数据 (u64) 的缓冲区地址
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;对于 PV 访客(TOD 由超管理器管理),则返回 -EOPNOTSUPP
3.3. 属性:KVM_S390_VM_TOD_EXT¶
允许用户空间设置/获取在 POP (u64) 中定义的 TOD 时钟寄存器的位 0-63。如果访客 CPU 模型支持 TOD 时钟扩展 (u8),它还允许用户空间获取/设置它。如果访客 CPU 模型不支持它,它将存储为 0,并且不允许将其设置为 != 0 的值。
- 参数:
用户空间中用于存储数据 (kvm_s390_vm_tod_clock) 的缓冲区地址
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;如果不支持将 TOD 时钟扩展设置为 != 0,则返回 -EINVAL;对于 PV 访客(TOD 由超管理器管理),则返回 -EOPNOTSUPP
4. 组:KVM_S390_VM_CRYPTO¶
- 架构:
s390
4.1. 属性:KVM_S390_VM_CRYPTO_ENABLE_AES_KW (写入/无)¶
允许用户空间启用 aes 密钥包装,包括生成新的包装密钥。
- 参数:
无
- 返回值:
0
4.2. 属性:KVM_S390_VM_CRYPTO_ENABLE_DEA_KW (写入/无)¶
允许用户空间启用 dea 密钥包装,包括生成新的包装密钥。
- 参数:
无
- 返回值:
0
4.3. 属性:KVM_S390_VM_CRYPTO_DISABLE_AES_KW (写入/无)¶
允许用户空间禁用 aes 密钥包装,清除包装密钥。
- 参数:
无
- 返回值:
0
4.4. 属性:KVM_S390_VM_CRYPTO_DISABLE_DEA_KW (写入/无)¶
允许用户空间禁用 dea 密钥包装,清除包装密钥。
- 参数:
无
- 返回值:
0
5. 组:KVM_S390_VM_MIGRATION¶
- 架构:
s390
5.1. 属性:KVM_S390_VM_MIGRATION_STOP (写入/无)¶
允许用户空间停止迁移模式,PGSTE 迁移需要此模式。当迁移模式未激活时设置此属性将不会产生任何影响。
- 参数:
无
- 返回值:
0
5.2. 属性:KVM_S390_VM_MIGRATION_START (写入/无)¶
允许用户空间启动迁移模式,PGSTE 迁移需要此模式。当迁移模式已激活时设置此属性将不会产生任何影响。
必须在所有内存插槽上启用脏跟踪,否则将返回 -EINVAL。当在任何内存插槽上禁用脏跟踪时,迁移模式会自动停止。
- 参数:
无
- 返回值:
如果没有足够的可用内存来启动迁移模式,则返回 -ENOMEM;如果虚拟机状态无效(例如,未定义内存),则返回 -EINVAL;成功时返回 0。
5.3. 属性:KVM_S390_VM_MIGRATION_STATUS (只读)¶
允许用户空间查询迁移模式的状态。
- 参数:
用于存储数据的用户空间缓冲区地址(u64);数据本身如果迁移模式被禁用则为 0,如果启用则为 1
- 返回值:
如果给定的地址无法从内核空间访问,则返回 -EFAULT;成功时返回 0。
6. 组:KVM_ARM_VM_SMCCC_CTRL¶
- 架构:
arm64
6.1. 属性:KVM_ARM_VM_SMCCC_FILTER (只写)¶
- 参数:
指向
struct kvm_smccc_filter
的指针- 返回值:
EEXIST
范围与先前插入或保留的范围相交
EBUSY
虚拟机中的 vCPU 已经运行
EINVAL
无效的过滤器配置
ENOMEM
未能为 SMCCC 过滤器的内核表示分配内存
请求安装如下描述的 SMCCC 调用过滤器
enum kvm_smccc_filter_action {
KVM_SMCCC_FILTER_HANDLE = 0,
KVM_SMCCC_FILTER_DENY,
KVM_SMCCC_FILTER_FWD_TO_USER,
};
struct kvm_smccc_filter {
__u32 base;
__u32 nr_functions;
__u8 action;
__u8 pad[15];
};
过滤器定义为一组不重叠的范围。每个范围定义了应用于该范围内 SMCCC 调用的操作。用户空间可以通过连续调用此属性来将多个范围插入到过滤器中。
KVM 的默认配置允许所有已实现的 SMCCC 调用。因此,用户空间可以稀疏地定义 SMCCC 过滤器,仅描述修改默认行为的范围。
由 struct kvm_smccc_filter
表示的范围是 [base
, base + nr_functions
)。范围不允许回绕,即用户空间不能依赖于 base + nr_functions
溢出。
SMCCC 过滤器适用于访客发起的 SMC 和 HVC 调用。SMCCC 过滤器控制 SMCCC 调用的内核仿真,因此在与其他与 SMCCC 调用交互的接口(例如,hypercall 位图寄存器)之前生效。
操作
KVM_SMCCC_FILTER_HANDLE
: 允许在内核中处理访客 SMCCC 调用。强烈建议用户空间不要显式描述允许的 SMCCC 调用范围。
KVM_SMCCC_FILTER_DENY
: 在内核中拒绝访客 SMCCC 调用并返回给访客。
KVM_SMCCC_FILTER_FWD_TO_USER
: 访客 SMCCC 调用将转发到用户空间,退出原因是KVM_EXIT_HYPERCALL
。
pad
字段保留供将来使用,必须为零。如果该字段非零,KVM 可能会返回 -EINVAL
。
KVM 保留“Arm Architecture Calls”的函数 ID 范围,并将拒绝尝试为这些范围的任何部分定义过滤器
开始
结束 (包含)
0x8000_0000
0x8000_FFFF
0xC000_0000
0xC000_FFFF