通用虚拟机接口

虚拟机“设备”也接受 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