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” 功能查询此 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)

INVALID_PARAMETER (-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)

INVALID_PARAMETER (-3)

ARM_SMCCC_KVM_FUNC_MMIO_GUARD

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

存在性

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

调用约定

HVC64

函数 ID

(uint32)

0xC6000007

参数

(uint64)

R1

MMIO 内存区域的基本 IPA

(uint64)

R2

保留 / 必须为零

(uint64)

R3

保留 / 必须为零

返回值

(int64)

R0

成功 (0)

INVALID_PARAMETER (-3)