.. SPDX-License-Identifier: GPL-2.0 =============================================== KVM/arm64-specific hypercalls exposed to guests =============================================== This file documents the KVM/arm64-specific hypercalls which may be exposed by KVM/arm64 to guest operating systems. These hypercalls are issued using the HVC instruction according to version 1.1 of the Arm SMC Calling Convention (DEN0028/C): https://developer.arm.com/docs/den0028/c All KVM/arm64-specific hypercalls are allocated within the "Vendor Specific Hypervisor Service Call" range with a UID of ``28b46fb6-2ec5-11e9-a9ca-4b564d003a74``. This UID should be queried by the guest using the standard "Call UID" function for the service range in order to determine that the KVM/arm64-specific hypercalls are available. ``ARM_SMCCC_KVM_FUNC_FEATURES`` --------------------------------------------- Provides a discovery mechanism for other KVM/arm64 hypercalls. +---------------------+-------------------------------------------------------------+ | Presence: | Mandatory for the KVM/arm64 UID | +---------------------+-------------------------------------------------------------+ | Calling convention: | HVC32 | +---------------------+----------+--------------------------------------------------+ | Function ID: | (uint32) | 0x86000000 | +---------------------+----------+--------------------------------------------------+ | Arguments: | None | +---------------------+----------+----+---------------------------------------------+ | Return Values: | (uint32) | R0 | Bitmap of available function numbers 0-31 | | +----------+----+---------------------------------------------+ | | (uint32) | R1 | Bitmap of available function numbers 32-63 | | +----------+----+---------------------------------------------+ | | (uint32) | R2 | Bitmap of available function numbers 64-95 | | +----------+----+---------------------------------------------+ | | (uint32) | R3 | Bitmap of available function numbers 96-127 | +---------------------+----------+----+---------------------------------------------+ ``ARM_SMCCC_KVM_FUNC_PTP`` ---------------------------------------- See ptp_kvm.rst ``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO`` ---------------------------------- Query the memory protection parameters for a protected virtual machine. +---------------------+-------------------------------------------------------------+ | Presence: | Optional; protected guests only. | +---------------------+-------------------------------------------------------------+ | Calling convention: | HVC64 | +---------------------+----------+--------------------------------------------------+ | Function ID: | (uint32) | 0xC6000002 | +---------------------+----------+----+---------------------------------------------+ | Arguments: | (uint64) | R1 | Reserved / Must be zero | | +----------+----+---------------------------------------------+ | | (uint64) | R2 | Reserved / Must be zero | | +----------+----+---------------------------------------------+ | | (uint64) | R3 | Reserved / Must be zero | +---------------------+----------+----+---------------------------------------------+ | Return Values: | (int64) | R0 | ``INVALID_PARAMETER (-3)`` on error, else | | | | | memory protection granule in bytes | +---------------------+----------+----+---------------------------------------------+ ``ARM_SMCCC_KVM_FUNC_MEM_SHARE`` -------------------------------- Share a region of memory with the KVM host, granting it read, write and execute permissions. The size of the region is equal to the memory protection granule advertised by ``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO``. +---------------------+-------------------------------------------------------------+ | Presence: | Optional; protected guests only. | +---------------------+-------------------------------------------------------------+ | Calling convention: | HVC64 | +---------------------+----------+--------------------------------------------------+ | Function ID: | (uint32) | 0xC6000003 | +---------------------+----------+----+---------------------------------------------+ | Arguments: | (uint64) | R1 | Base IPA of memory region to share | | +----------+----+---------------------------------------------+ | | (uint64) | R2 | Reserved / Must be zero | | +----------+----+---------------------------------------------+ | | (uint64) | R3 | Reserved / Must be zero | +---------------------+----------+----+---------------------------------------------+ | Return Values: | (int64) | R0 | ``SUCCESS (0)`` | | | | +---------------------------------------------+ | | | | ``INVALID_PARAMETER (-3)`` | +---------------------+----------+----+---------------------------------------------+ ``ARM_SMCCC_KVM_FUNC_MEM_UNSHARE`` ---------------------------------- Revoke access permission from the KVM host to a memory region previously shared with ``ARM_SMCCC_KVM_FUNC_MEM_SHARE``. The size of the region is equal to the memory protection granule advertised by ``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO``. +---------------------+-------------------------------------------------------------+ | Presence: | Optional; protected guests only. | +---------------------+-------------------------------------------------------------+ | Calling convention: | HVC64 | +---------------------+----------+--------------------------------------------------+ | Function ID: | (uint32) | 0xC6000004 | +---------------------+----------+----+---------------------------------------------+ | Arguments: | (uint64) | R1 | Base IPA of memory region to unshare | | +----------+----+---------------------------------------------+ | | (uint64) | R2 | Reserved / Must be zero | | +----------+----+---------------------------------------------+ | | (uint64) | R3 | Reserved / Must be zero | +---------------------+----------+----+---------------------------------------------+ | Return Values: | (int64) | R0 | ``SUCCESS (0)`` | | | | +---------------------------------------------+ | | | | ``INVALID_PARAMETER (-3)`` | +---------------------+----------+----+---------------------------------------------+ ``ARM_SMCCC_KVM_FUNC_MEM_RELINQUISH`` -------------------------------------- Cooperatively relinquish ownership of a memory region. The size of the region is equal to the memory protection granule advertised by ``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO``. If this hypercall is advertised then it is mandatory to call it before freeing memory via, for example, virtio balloon. If the caller is a protected VM, it is guaranteed that the memory region will be completely cleared before becoming visible to another VM. +---------------------+-------------------------------------------------------------+ | Presence: | Optional. | +---------------------+-------------------------------------------------------------+ | Calling convention: | HVC64 | +---------------------+----------+--------------------------------------------------+ | Function ID: | (uint32) | 0xC6000009 | +---------------------+----------+----+---------------------------------------------+ | Arguments: | (uint64) | R1 | Base IPA of memory region to relinquish | | +----------+----+---------------------------------------------+ | | (uint64) | R2 | Reserved / Must be zero | | +----------+----+---------------------------------------------+ | | (uint64) | R3 | Reserved / Must be zero | +---------------------+----------+----+---------------------------------------------+ | Return Values: | (int64) | R0 | ``SUCCESS (0)`` | | | | +---------------------------------------------+ | | | | ``INVALID_PARAMETER (-3)`` | +---------------------+----------+----+---------------------------------------------+ ``ARM_SMCCC_KVM_FUNC_MMIO_GUARD_*`` ----------------------------------- See mmio-guard.rst