mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
drivers/virt: pkvm: Add initial support for running as a protected guest
Implement a pKVM protected guest driver to probe the presence of pKVM and determine the memory protection granule using the HYP_MEMINFO hypercall. Acked-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/20240830130150.8568-3-will@kernel.org Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
@@ -44,3 +44,25 @@ Provides a discovery mechanism for other KVM/arm64 hypercalls.
|
|||||||
----------------------------------------
|
----------------------------------------
|
||||||
|
|
||||||
See ptp_kvm.rst
|
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 |
|
||||||
|
+---------------------+----------+----+---------------------------------------------+
|
||||||
|
|||||||
@@ -7,8 +7,15 @@
|
|||||||
void kvm_init_hyp_services(void);
|
void kvm_init_hyp_services(void);
|
||||||
bool kvm_arm_hyp_service_available(u32 func_id);
|
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)
|
static inline void kvm_arch_init_hyp_services(void)
|
||||||
{
|
{
|
||||||
|
pkvm_init_hyp_services();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ config TSM_REPORTS
|
|||||||
|
|
||||||
source "drivers/virt/coco/efi_secret/Kconfig"
|
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/sev-guest/Kconfig"
|
||||||
|
|
||||||
source "drivers/virt/coco/tdx-guest/Kconfig"
|
source "drivers/virt/coco/tdx-guest/Kconfig"
|
||||||
|
|||||||
@@ -4,5 +4,6 @@
|
|||||||
#
|
#
|
||||||
obj-$(CONFIG_TSM_REPORTS) += tsm.o
|
obj-$(CONFIG_TSM_REPORTS) += tsm.o
|
||||||
obj-$(CONFIG_EFI_SECRET) += efi_secret/
|
obj-$(CONFIG_EFI_SECRET) += efi_secret/
|
||||||
|
obj-$(CONFIG_ARM_PKVM_GUEST) += pkvm-guest/
|
||||||
obj-$(CONFIG_SEV_GUEST) += sev-guest/
|
obj-$(CONFIG_SEV_GUEST) += sev-guest/
|
||||||
obj-$(CONFIG_INTEL_TDX_GUEST) += tdx-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
|
||||||
37
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c
Normal file
37
drivers/virt/coco/pkvm-guest/arm-pkvm-guest.c
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// 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/mm.h>
|
||||||
|
|
||||||
|
#include <asm/hypervisor.h>
|
||||||
|
|
||||||
|
static size_t pkvm_granule;
|
||||||
|
|
||||||
|
void pkvm_init_hyp_services(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct arm_smccc_res res;
|
||||||
|
const u32 funcs[] = {
|
||||||
|
ARM_SMCCC_KVM_FUNC_HYP_MEMINFO,
|
||||||
|
};
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
@@ -115,6 +115,7 @@
|
|||||||
/* KVM "vendor specific" services */
|
/* KVM "vendor specific" services */
|
||||||
#define ARM_SMCCC_KVM_FUNC_FEATURES 0
|
#define ARM_SMCCC_KVM_FUNC_FEATURES 0
|
||||||
#define ARM_SMCCC_KVM_FUNC_PTP 1
|
#define ARM_SMCCC_KVM_FUNC_PTP 1
|
||||||
|
#define ARM_SMCCC_KVM_FUNC_HYP_MEMINFO 2
|
||||||
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
|
#define ARM_SMCCC_KVM_FUNC_FEATURES_2 127
|
||||||
#define ARM_SMCCC_KVM_NUM_FUNCS 128
|
#define ARM_SMCCC_KVM_NUM_FUNCS 128
|
||||||
|
|
||||||
@@ -137,6 +138,12 @@
|
|||||||
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
ARM_SMCCC_OWNER_VENDOR_HYP, \
|
||||||
ARM_SMCCC_KVM_FUNC_PTP)
|
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)
|
||||||
|
|
||||||
/* ptp_kvm counter type ID */
|
/* ptp_kvm counter type ID */
|
||||||
#define KVM_PTP_VIRT_COUNTER 0
|
#define KVM_PTP_VIRT_COUNTER 0
|
||||||
#define KVM_PTP_PHYS_COUNTER 1
|
#define KVM_PTP_PHYS_COUNTER 1
|
||||||
|
|||||||
Reference in New Issue
Block a user