mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +00:00
Merge branch 'for-next/pkvm-guest' into for-next/core
* for-next/pkvm-guest: arm64: smccc: Reserve block of KVM "vendor" services for pKVM hypercalls drivers/virt: pkvm: Intercept ioremap using pKVM MMIO_GUARD hypercall arm64: mm: Add confidential computing hook to ioremap_prot() drivers/virt: pkvm: Hook up mem_encrypt API using pKVM hypercalls arm64: mm: Add top-level dispatcher for internal mem_encrypt API drivers/virt: pkvm: Add initial support for running as a protected guest firmware/smccc: Call arch-specific hook on discovering KVM services
This commit is contained in:
commit
3175e051c3
@ -44,3 +44,101 @@ Provides a discovery mechanism for other KVM/arm64 hypercalls.
|
||||
----------------------------------------
|
||||
|
||||
See ptp_kvm.rst
|
||||
|
||||
``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO``
|
||||
----------------------------------
|
||||
|
||||
Query the memory protection parameters for a pKVM protected virtual machine.
|
||||
|
||||
+---------------------+-------------------------------------------------------------+
|
||||
| Presence: | Optional; pKVM 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; pKVM 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; pKVM 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_MMIO_GUARD``
|
||||
----------------------------------
|
||||
|
||||
Request that a given memory region is handled as MMIO by the hypervisor,
|
||||
allowing accesses to this region to be emulated by the KVM host. The size of the
|
||||
region is equal to the memory protection granule advertised by
|
||||
``ARM_SMCCC_KVM_FUNC_HYP_MEMINFO``.
|
||||
|
||||
+---------------------+-------------------------------------------------------------+
|
||||
| Presence: | Optional; pKVM protected guests only. |
|
||||
+---------------------+-------------------------------------------------------------+
|
||||
| Calling convention: | HVC64 |
|
||||
+---------------------+----------+--------------------------------------------------+
|
||||
| Function ID: | (uint32) | 0xC6000007 |
|
||||
+---------------------+----------+----+---------------------------------------------+
|
||||
| Arguments: | (uint64) | R1 | Base IPA of MMIO memory region |
|
||||
| +----------+----+---------------------------------------------+
|
||||
| | (uint64) | R2 | Reserved / Must be zero |
|
||||
| +----------+----+---------------------------------------------+
|
||||
| | (uint64) | R3 | Reserved / Must be zero |
|
||||
+---------------------+----------+----+---------------------------------------------+
|
||||
| Return Values: | (int64) | R0 | ``SUCCESS (0)`` |
|
||||
| | | +---------------------------------------------+
|
||||
| | | | ``INVALID_PARAMETER (-3)`` |
|
||||
+---------------------+----------+----+---------------------------------------------+
|
||||
|
@ -7,4 +7,6 @@
|
||||
void kvm_init_hyp_services(void);
|
||||
bool kvm_arm_hyp_service_available(u32 func_id);
|
||||
|
||||
static inline void kvm_arch_init_hyp_services(void) { };
|
||||
|
||||
#endif
|
||||
|
@ -34,6 +34,7 @@ config ARM64
|
||||
select ARCH_HAS_KERNEL_FPU_SUPPORT if KERNEL_MODE_NEON
|
||||
select ARCH_HAS_KEEPINITRD
|
||||
select ARCH_HAS_MEMBARRIER_SYNC_CORE
|
||||
select ARCH_HAS_MEM_ENCRYPT
|
||||
select ARCH_HAS_NMI_SAFE_THIS_CPU_OPS
|
||||
select ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE
|
||||
select ARCH_HAS_PTE_DEVMAP
|
||||
|
@ -7,4 +7,15 @@
|
||||
void kvm_init_hyp_services(void);
|
||||
bool kvm_arm_hyp_service_available(u32 func_id);
|
||||
|
||||
#ifdef CONFIG_ARM_PKVM_GUEST
|
||||
void pkvm_init_hyp_services(void);
|
||||
#else
|
||||
static inline void pkvm_init_hyp_services(void) { };
|
||||
#endif
|
||||
|
||||
static inline void kvm_arch_init_hyp_services(void)
|
||||
{
|
||||
pkvm_init_hyp_services();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -271,6 +271,10 @@ __iowrite64_copy(void __iomem *to, const void *from, size_t count)
|
||||
* I/O memory mapping functions.
|
||||
*/
|
||||
|
||||
typedef int (*ioremap_prot_hook_t)(phys_addr_t phys_addr, size_t size,
|
||||
pgprot_t *prot);
|
||||
int arm64_ioremap_prot_hook_register(const ioremap_prot_hook_t hook);
|
||||
|
||||
#define ioremap_prot ioremap_prot
|
||||
|
||||
#define _PAGE_IOREMAP PROT_DEVICE_nGnRE
|
||||
|
15
arch/arm64/include/asm/mem_encrypt.h
Normal file
15
arch/arm64/include/asm/mem_encrypt.h
Normal file
@ -0,0 +1,15 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
#ifndef __ASM_MEM_ENCRYPT_H
|
||||
#define __ASM_MEM_ENCRYPT_H
|
||||
|
||||
struct arm64_mem_crypt_ops {
|
||||
int (*encrypt)(unsigned long addr, int numpages);
|
||||
int (*decrypt)(unsigned long addr, int numpages);
|
||||
};
|
||||
|
||||
int arm64_mem_crypt_ops_register(const struct arm64_mem_crypt_ops *ops);
|
||||
|
||||
int set_memory_encrypted(unsigned long addr, int numpages);
|
||||
int set_memory_decrypted(unsigned long addr, int numpages);
|
||||
|
||||
#endif /* __ASM_MEM_ENCRYPT_H */
|
@ -3,6 +3,7 @@
|
||||
#ifndef _ASM_ARM64_SET_MEMORY_H
|
||||
#define _ASM_ARM64_SET_MEMORY_H
|
||||
|
||||
#include <asm/mem_encrypt.h>
|
||||
#include <asm-generic/set_memory.h>
|
||||
|
||||
bool can_set_direct_map(void);
|
||||
|
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
obj-y := dma-mapping.o extable.o fault.o init.o \
|
||||
cache.o copypage.o flush.o \
|
||||
ioremap.o mmap.o pgd.o mmu.o \
|
||||
ioremap.o mmap.o pgd.o mem_encrypt.o mmu.o \
|
||||
context.o proc.o pageattr.o fixmap.o
|
||||
obj-$(CONFIG_ARM64_CONTPTE) += contpte.o
|
||||
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
||||
|
@ -3,10 +3,22 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
static ioremap_prot_hook_t ioremap_prot_hook;
|
||||
|
||||
int arm64_ioremap_prot_hook_register(ioremap_prot_hook_t hook)
|
||||
{
|
||||
if (WARN_ON(ioremap_prot_hook))
|
||||
return -EBUSY;
|
||||
|
||||
ioremap_prot_hook = hook;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
|
||||
unsigned long prot)
|
||||
{
|
||||
unsigned long last_addr = phys_addr + size - 1;
|
||||
pgprot_t pgprot = __pgprot(prot);
|
||||
|
||||
/* Don't allow outside PHYS_MASK */
|
||||
if (last_addr & ~PHYS_MASK)
|
||||
@ -16,7 +28,16 @@ void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
|
||||
if (WARN_ON(pfn_is_map_memory(__phys_to_pfn(phys_addr))))
|
||||
return NULL;
|
||||
|
||||
return generic_ioremap_prot(phys_addr, size, __pgprot(prot));
|
||||
/*
|
||||
* If a hook is registered (e.g. for confidential computing
|
||||
* purposes), call that now and barf if it fails.
|
||||
*/
|
||||
if (unlikely(ioremap_prot_hook) &&
|
||||
WARN_ON(ioremap_prot_hook(phys_addr, size, &pgprot))) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return generic_ioremap_prot(phys_addr, size, pgprot);
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_prot);
|
||||
|
||||
|
50
arch/arm64/mm/mem_encrypt.c
Normal file
50
arch/arm64/mm/mem_encrypt.c
Normal file
@ -0,0 +1,50 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Implementation of the memory encryption/decryption API.
|
||||
*
|
||||
* Since the low-level details of the operation depend on the
|
||||
* Confidential Computing environment (e.g. pKVM, CCA, ...), this just
|
||||
* acts as a top-level dispatcher to whatever hooks may have been
|
||||
* registered.
|
||||
*
|
||||
* Author: Will Deacon <will@kernel.org>
|
||||
* Copyright (C) 2024 Google LLC
|
||||
*
|
||||
* "Hello, boils and ghouls!"
|
||||
*/
|
||||
|
||||
#include <linux/bug.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
#include <asm/mem_encrypt.h>
|
||||
|
||||
static const struct arm64_mem_crypt_ops *crypt_ops;
|
||||
|
||||
int arm64_mem_crypt_ops_register(const struct arm64_mem_crypt_ops *ops)
|
||||
{
|
||||
if (WARN_ON(crypt_ops))
|
||||
return -EBUSY;
|
||||
|
||||
crypt_ops = ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int set_memory_encrypted(unsigned long addr, int numpages)
|
||||
{
|
||||
if (likely(!crypt_ops) || WARN_ON(!PAGE_ALIGNED(addr)))
|
||||
return 0;
|
||||
|
||||
return crypt_ops->encrypt(addr, numpages);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_memory_encrypted);
|
||||
|
||||
int set_memory_decrypted(unsigned long addr, int numpages)
|
||||
{
|
||||
if (likely(!crypt_ops) || WARN_ON(!PAGE_ALIGNED(addr)))
|
||||
return 0;
|
||||
|
||||
return crypt_ops->decrypt(addr, numpages);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(set_memory_decrypted);
|
@ -39,6 +39,8 @@ void __init kvm_init_hyp_services(void)
|
||||
|
||||
pr_info("hypervisor services detected (0x%08lx 0x%08lx 0x%08lx 0x%08lx)\n",
|
||||
res.a3, res.a2, res.a1, res.a0);
|
||||
|
||||
kvm_arch_init_hyp_services();
|
||||
}
|
||||
|
||||
bool kvm_arm_hyp_service_available(u32 func_id)
|
||||
|
@ -9,6 +9,8 @@ config TSM_REPORTS
|
||||
|
||||
source "drivers/virt/coco/efi_secret/Kconfig"
|
||||
|
||||
source "drivers/virt/coco/pkvm-guest/Kconfig"
|
||||
|
||||
source "drivers/virt/coco/sev-guest/Kconfig"
|
||||
|
||||
source "drivers/virt/coco/tdx-guest/Kconfig"
|
||||
|
@ -4,5 +4,6 @@
|
||||
#
|
||||
obj-$(CONFIG_TSM_REPORTS) += tsm.o
|
||||
obj-$(CONFIG_EFI_SECRET) += efi_secret/
|
||||
obj-$(CONFIG_ARM_PKVM_GUEST) += pkvm-guest/
|
||||
obj-$(CONFIG_SEV_GUEST) += sev-guest/
|
||||
obj-$(CONFIG_INTEL_TDX_GUEST) += tdx-guest/
|
||||
|
10
drivers/virt/coco/pkvm-guest/Kconfig
Normal file
10
drivers/virt/coco/pkvm-guest/Kconfig
Normal file
@ -0,0 +1,10 @@
|
||||
config ARM_PKVM_GUEST
|
||||
bool "Arm pKVM protected guest driver"
|
||||
depends on ARM64
|
||||
help
|
||||
Protected guests running under the pKVM hypervisor on arm64
|
||||
are isolated from the host and must issue hypercalls to enable
|
||||
interaction with virtual devices. This driver implements
|
||||
support for probing and issuing these hypercalls.
|
||||
|
||||
If unsure, say 'N'.
|
2
drivers/virt/coco/pkvm-guest/Makefile
Normal file
2
drivers/virt/coco/pkvm-guest/Makefile
Normal file
@ -0,0 +1,2 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
obj-$(CONFIG_ARM_PKVM_GUEST) += arm-pkvm-guest.o
|
127
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c
Normal file
127
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c
Normal file
@ -0,0 +1,127 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Support for the hypercall interface exposed to protected guests by
|
||||
* pKVM.
|
||||
*
|
||||
* Author: Will Deacon <will@kernel.org>
|
||||
* Copyright (C) 2024 Google LLC
|
||||
*/
|
||||
|
||||
#include <linux/arm-smccc.h>
|
||||
#include <linux/array_size.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/mem_encrypt.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/pgtable.h>
|
||||
|
||||
#include <asm/hypervisor.h>
|
||||
|
||||
static size_t pkvm_granule;
|
||||
|
||||
static int arm_smccc_do_one_page(u32 func_id, phys_addr_t phys)
|
||||
{
|
||||
phys_addr_t end = phys + PAGE_SIZE;
|
||||
|
||||
while (phys < end) {
|
||||
struct arm_smccc_res res;
|
||||
|
||||
arm_smccc_1_1_invoke(func_id, phys, 0, 0, &res);
|
||||
if (res.a0 != SMCCC_RET_SUCCESS)
|
||||
return -EPERM;
|
||||
|
||||
phys += pkvm_granule;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __set_memory_range(u32 func_id, unsigned long start, int numpages)
|
||||
{
|
||||
void *addr = (void *)start, *end = addr + numpages * PAGE_SIZE;
|
||||
|
||||
while (addr < end) {
|
||||
int err;
|
||||
|
||||
err = arm_smccc_do_one_page(func_id, virt_to_phys(addr));
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
addr += PAGE_SIZE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pkvm_set_memory_encrypted(unsigned long addr, int numpages)
|
||||
{
|
||||
return __set_memory_range(ARM_SMCCC_VENDOR_HYP_KVM_MEM_UNSHARE_FUNC_ID,
|
||||
addr, numpages);
|
||||
}
|
||||
|
||||
static int pkvm_set_memory_decrypted(unsigned long addr, int numpages)
|
||||
{
|
||||
return __set_memory_range(ARM_SMCCC_VENDOR_HYP_KVM_MEM_SHARE_FUNC_ID,
|
||||
addr, numpages);
|
||||
}
|
||||
|
||||
static const struct arm64_mem_crypt_ops pkvm_crypt_ops = {
|
||||
.encrypt = pkvm_set_memory_encrypted,
|
||||
.decrypt = pkvm_set_memory_decrypted,
|
||||
};
|
||||
|
||||
static int mmio_guard_ioremap_hook(phys_addr_t phys, size_t size,
|
||||
pgprot_t *prot)
|
||||
{
|
||||
phys_addr_t end;
|
||||
pteval_t protval = pgprot_val(*prot);
|
||||
|
||||
/*
|
||||
* We only expect MMIO emulation for regions mapped with device
|
||||
* attributes.
|
||||
*/
|
||||
if (protval != PROT_DEVICE_nGnRE && protval != PROT_DEVICE_nGnRnE)
|
||||
return 0;
|
||||
|
||||
phys = PAGE_ALIGN_DOWN(phys);
|
||||
end = phys + PAGE_ALIGN(size);
|
||||
|
||||
while (phys < end) {
|
||||
const int func_id = ARM_SMCCC_VENDOR_HYP_KVM_MMIO_GUARD_FUNC_ID;
|
||||
int err;
|
||||
|
||||
err = arm_smccc_do_one_page(func_id, phys);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
phys += PAGE_SIZE;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pkvm_init_hyp_services(void)
|
||||
{
|
||||
int i;
|
||||
struct arm_smccc_res res;
|
||||
const u32 funcs[] = {
|
||||
ARM_SMCCC_KVM_FUNC_HYP_MEMINFO,
|
||||
ARM_SMCCC_KVM_FUNC_MEM_SHARE,
|
||||
ARM_SMCCC_KVM_FUNC_MEM_UNSHARE,
|
||||
};
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(funcs); ++i) {
|
||||
if (!kvm_arm_hyp_service_available(funcs[i]))
|
||||
return;
|
||||
}
|
||||
|
||||
arm_smccc_1_1_invoke(ARM_SMCCC_VENDOR_HYP_KVM_HYP_MEMINFO_FUNC_ID,
|
||||
0, 0, 0, &res);
|
||||
if (res.a0 > PAGE_SIZE) /* Includes error codes */
|
||||
return;
|
||||
|
||||
pkvm_granule = res.a0;
|
||||
arm64_mem_crypt_ops_register(&pkvm_crypt_ops);
|
||||
|
||||
if (kvm_arm_hyp_service_available(ARM_SMCCC_KVM_FUNC_MMIO_GUARD))
|
||||
arm64_ioremap_prot_hook_register(&mmio_guard_ioremap_hook);
|
||||
}
|
@ -115,6 +115,70 @@
|
||||
/* KVM "vendor specific" services */
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES 0
|
||||
#define ARM_SMCCC_KVM_FUNC_PTP 1
|
||||
/* Start of pKVM hypercall range */
|
||||
#define ARM_SMCCC_KVM_FUNC_HYP_MEMINFO 2
|
||||
#define ARM_SMCCC_KVM_FUNC_MEM_SHARE 3
|
||||
#define ARM_SMCCC_KVM_FUNC_MEM_UNSHARE 4
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_5 5
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_6 6
|
||||
#define ARM_SMCCC_KVM_FUNC_MMIO_GUARD 7
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_8 8
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_9 9
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_10 10
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_11 11
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_12 12
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_13 13
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_14 14
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_15 15
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_16 16
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_17 17
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_18 18
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_19 19
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_20 20
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_21 21
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_22 22
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_23 23
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_24 24
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_25 25
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_26 26
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_27 27
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_28 28
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_29 29
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_30 30
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_31 31
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_32 32
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_33 33
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_34 34
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_35 35
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_36 36
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_37 37
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_38 38
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_39 39
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_40 40
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_41 41
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_42 42
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_43 43
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_44 44
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_45 45
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_46 46
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_47 47
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_48 48
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_49 49
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_50 50
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_51 51
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_52 52
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_53 53
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_54 54
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_55 55
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_56 56
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_57 57
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_58 58
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_59 59
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_60 60
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_61 61
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_62 62
|
||||
#define ARM_SMCCC_KVM_FUNC_PKVM_RESV_63 63
|
||||
/* End of pKVM hypercall range */
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
|
||||
#define ARM_SMCCC_KVM_NUM_FUNCS 128
|
||||
|
||||
@ -137,6 +201,30 @@
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_PTP)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_HYP_MEMINFO_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_HYP_MEMINFO)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_MEM_SHARE_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_MEM_SHARE)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_MEM_UNSHARE_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_MEM_UNSHARE)
|
||||
|
||||
#define ARM_SMCCC_VENDOR_HYP_KVM_MMIO_GUARD_FUNC_ID \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, \
|
||||
ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||
ARM_SMCCC_KVM_FUNC_MMIO_GUARD)
|
||||
|
||||
/* ptp_kvm counter type ID */
|
||||
#define KVM_PTP_VIRT_COUNTER 0
|
||||
#define KVM_PTP_PHYS_COUNTER 1
|
||||
|
Loading…
Reference in New Issue
Block a user