通用虚拟机接口¶
虚拟机“设备”也接受 ioctl KVM_SET_DEVICE_ATTR、KVM_GET_DEVICE_ATTR 和 KVM_HAS_DEVICE_ATTR。该接口使用与其他设备相同的 struct 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 未处理的特性位触发的指令拦截需要在虚拟机驱动代码中实现。
- 参数:
用于存储/设置 struct kvm_s390_vm_cpu_processor* 类型的处理器相关 CPU 数据的缓冲区地址。
- 返回值:
如果一个或多个 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 (读/写)¶
允许用户空间检索或更改虚拟机所有 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 (读/写)¶
允许用户空间检索或更改要为虚拟机所有 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 由 ultravisor 管理),则返回 -EOPNOTSUPP
3.2. 属性:KVM_S390_VM_TOD_LOW¶
允许用户空间设置/获取 POP (u64) 中定义的 TOD 时钟寄存器的 0-63 位。
- 参数:
用户空间中用于存储数据 (u64) 的缓冲区地址
- 返回值:
如果给定地址无法从内核空间访问,则返回 -EFAULT;对于 PV 客户机(TOD 由 ultravisor 管理),则返回 -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 由 ultravisor 管理),则返回 -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 架构调用”的功能 ID 范围,并将拒绝为这些范围的任何部分定义过滤器的尝试
起始
结束(包含)
0x8000_0000
0x8000_FFFF
0xC000_0000
0xC000_FFFF