KVM/arm64 暴露给客户机的特定超级调用

本文档记录了 KVM/arm64 可能暴露给客户机操作系统的 KVM/arm64 特定的超级调用。这些超级调用是根据 Arm SMC 调用约定(DEN0028/C)1.1 版使用 HVC 指令发出的。

https://developer.arm.com/docs/den0028/c

所有 KVM/arm64 特定的超级调用都分配在“供应商特定 Hypervisor 服务调用”范围内,其 UID 为 28b46fb6-2ec5-11e9-a9ca-4b564d003a74。客户机应使用标准“调用 UID”函数查询服务范围,以确定 KVM/arm64 特定的超级调用是否可用。

ARM_SMCCC_VENDOR_HYP_KVM_FEATURES_FUNC_ID

为其他 KVM/arm64 超级调用提供发现机制。

存在性

KVM/arm64 UID 强制要求

调用约定

HVC32

函数 ID

(uint32)

0x86000000

参数

返回值

(uint32)

R0

可用函数编号 0-31 的位图

(uint32)

R1

可用函数编号 32-63 的位图

(uint32)

R2

可用函数编号 64-95 的位图

(uint32)

R3

可用函数编号 96-127 的位图

ARM_SMCCC_VENDOR_HYP_KVM_PTP_FUNC_ID

参见 arm/arm64 的 PTP_KVM 支持

ARM_SMCCC_KVM_FUNC_HYP_MEMINFO

查询 pKVM 受保护虚拟机 的内存保护参数。

存在性

可选;仅限 pKVM 受保护客户机。

调用约定

HVC64

函数 ID

(uint32)

0xC6000002

参数

(uint64)

R1

保留 / 必须为零

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

错误时为 INVALID_PARAMETER (-3),否则为字节表示的内存保护粒度

ARM_SMCCC_KVM_FUNC_MEM_SHARE

与 KVM 主机共享内存区域,授予其读、写和执行权限。区域大小等于 ARM_SMCCC_KVM_FUNC_HYP_MEMINFO 所公布的内存保护粒度。

存在性

可选;仅限 pKVM 受保护客户机。

调用约定

HVC64

函数 ID

(uint32)

0xC6000003

参数

(uint64)

R1

要共享的内存区域的基准 IPA

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

成功 (0)

无效参数 (-3)

ARM_SMCCC_KVM_FUNC_MEM_UNSHARE

撤销 KVM 主机对先前通过 ARM_SMCCC_KVM_FUNC_MEM_SHARE 共享的内存区域的访问权限。区域大小等于 ARM_SMCCC_KVM_FUNC_HYP_MEMINFO 所公布的内存保护粒度。

存在性

可选;仅限 pKVM 受保护客户机。

调用约定

HVC64

函数 ID

(uint32)

0xC6000004

参数

(uint64)

R1

要取消共享的内存区域的基准 IPA

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

成功 (0)

无效参数 (-3)

ARM_SMCCC_KVM_FUNC_MMIO_GUARD

请求 hypervisor 将给定内存区域作为 MMIO 处理,从而允许 KVM 主机模拟对此区域的访问。区域大小等于 ARM_SMCCC_KVM_FUNC_HYP_MEMINFO 所公布的内存保护粒度。

存在性

可选;仅限 pKVM 受保护客户机。

调用约定

HVC64

函数 ID

(uint32)

0xC6000007

参数

(uint64)

R1

MMIO 内存区域的基准 IPA

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

成功 (0)

无效参数 (-3)

ARM_SMCCC_VENDOR_HYP_KVM_DISCOVER_IMPL_VER_FUNC_ID

请求客户机 VM 的目标 CPU 实现版本信息和目标实现数量。

存在性

可选;仅限 KVM/ARM64 客户机

调用约定

HVC64

函数 ID

(uint32)

0xC6000040

参数

返回值

(int64)

R0

成功 (0)

不支持 (-1)

(uint64)

R1

位 [63:32] 保留/必须为零

位 [31:16] 主版本

位 [15:0] 次版本

(uint64)

R2

目标实现数量

(uint64)

R3

保留 / 必须为零

ARM_SMCCC_VENDOR_HYP_KVM_DISCOVER_IMPL_CPUS_FUNC_ID

请求客户机 VM 的目标 CPU 实现信息。客户机内核将使用此信息来启用相关的勘误表。

存在性

可选;仅限 KVM/ARM64 客户机

调用约定

HVC64

函数 ID

(uint32)

0xC6000041

参数

(uint64)

R1

选定的实现索引

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

成功 (0)

无效参数 (-3)

(uint64)

R1

选定实现的 MIDR_EL1

(uint64)

R2

选定实现的 REVIDR_EL1

(uint64)

R3

选定实现的 AIDR_EL1