mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-01 10:42:11 +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:
parent
0ba5b4ba61
commit
a06c3fad49
@ -44,3 +44,25 @@ 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 |
|
||||
+---------------------+----------+----+---------------------------------------------+
|
||||
|
@ -7,8 +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
|
||||
|
@ -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
|
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 */
|
||||
#define ARM_SMCCC_KVM_FUNC_FEATURES 0
|
||||
#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_NUM_FUNCS 128
|
||||
|
||||
@ -137,6 +138,12 @@
|
||||
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)
|
||||
|
||||
/* 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