通用虚拟机接口

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