From 55d5ad26bfd2c81f8dc9e232ee7f77021cd1814c Mon Sep 17 00:00:00 2001 From: Mostafa Saleh Date: Thu, 28 Dec 2023 17:39:06 +0000 Subject: [PATCH] ANDROID: misc: pkvm_smc: Add pKVM SMC filter driver Add a driver that filters SMCs during running KVM in protected mode. This patch has the skeleton for the driver and its config, and the logic is added in next patches. Bug: 278009271 Bug: 357781595 Change-Id: I76b7f0c1fab49f38700d22a161c7cc92730f81a1 Signed-off-by: Mostafa Saleh Signed-off-by: Vincent Donnefort --- drivers/misc/Kconfig | 9 ++++++++ drivers/misc/Makefile | 1 + drivers/misc/pkvm-smc/Makefile | 15 ++++++++++++ drivers/misc/pkvm-smc/pkvm-smc.c | 33 +++++++++++++++++++++++++++ drivers/misc/pkvm-smc/pkvm/Makefile | 2 ++ drivers/misc/pkvm-smc/pkvm/pkvm-smc.c | 13 +++++++++++ 6 files changed, 73 insertions(+) create mode 100644 drivers/misc/pkvm-smc/Makefile create mode 100644 drivers/misc/pkvm-smc/pkvm-smc.c create mode 100644 drivers/misc/pkvm-smc/pkvm/Makefile create mode 100644 drivers/misc/pkvm-smc/pkvm/pkvm-smc.c diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 5c506a17b803..5018db96c802 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -618,6 +618,15 @@ config MARVELL_CN10K_DPI To compile this driver as a module, choose M here: the module will be called mrvl_cn10k_dpi. +config PKVM_SMC_FILTER + tristate "pKVM SMC Filter" + depends on KVM && ARM64 && m + help + Support SMC filtering from hypervisor, through a hardcoded configuration in the + driver, this is intended to be a template and not shipped as is. + + Say N here unless you know what you are doing. + source "drivers/misc/c2port/Kconfig" source "drivers/misc/eeprom/Kconfig" source "drivers/misc/cb710/Kconfig" diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index abdfb61fc010..a43fcbe55e42 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -73,3 +73,4 @@ obj-$(CONFIG_NSM) += nsm.o obj-$(CONFIG_MARVELL_CN10K_DPI) += mrvl_cn10k_dpi.o obj-y += keba/ obj-$(CONFIG_UID_SYS_STATS) += uid_sys_stats.o +obj-$(CONFIG_PKVM_SMC_FILTER) += pkvm-smc/ diff --git a/drivers/misc/pkvm-smc/Makefile b/drivers/misc/pkvm-smc/Makefile new file mode 100644 index 000000000000..b33293b16439 --- /dev/null +++ b/drivers/misc/pkvm-smc/Makefile @@ -0,0 +1,15 @@ +ifneq ($(KERNELRELEASE),) +clean-files := pkvm/hyp.lds pkvm/hyp-reloc.S +obj-m := pkvm_smc.o + +pkvm_smc-y := pkvm-smc.o pkvm/kvm_nvhe.o + +$(obj)/pkvm/kvm_nvhe.o: FORCE + $(Q)$(MAKE) $(build)=$(obj)/pkvm $(obj)/pkvm/kvm_nvhe.o +else +all: + make -C $(KDIR) M=$(PWD) modules +clean: + make -C $(KDIR) M=$(PWD) clean +endif + diff --git a/drivers/misc/pkvm-smc/pkvm-smc.c b/drivers/misc/pkvm-smc/pkvm-smc.c new file mode 100644 index 000000000000..ad1081bbbd86 --- /dev/null +++ b/drivers/misc/pkvm-smc/pkvm-smc.c @@ -0,0 +1,33 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023 - Google Inc + * Author: Mostafa Saleh + * Simple module for pKVM SMC filtering. + */ +#include +#include +#include +#include + +static unsigned long pkvm_module_token; +int kvm_nvhe_sym(pkvm_smc_filter_hyp_init)(const struct pkvm_module_ops *ops); + +static int __init smc_filter_init(void) +{ + int ret; + + ret = pkvm_load_el2_module(kvm_nvhe_sym(pkvm_smc_filter_hyp_init), + &pkvm_module_token); + if (ret) + pr_err("Failed to register pKVM SMC filter: %d\n", ret); + else + pr_info("pKVM SMC filter registered successfully\n"); + + return ret; +} + +module_init(smc_filter_init); + +MODULE_AUTHOR("Mostafa Saleh "); +MODULE_DESCRIPTION("pKVM SMC filter"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/misc/pkvm-smc/pkvm/Makefile b/drivers/misc/pkvm-smc/pkvm/Makefile new file mode 100644 index 000000000000..86109e328db9 --- /dev/null +++ b/drivers/misc/pkvm-smc/pkvm/Makefile @@ -0,0 +1,2 @@ +hyp-obj-y := pkvm-smc.o +include $(srctree)/arch/arm64/kvm/hyp/nvhe/Makefile.module diff --git a/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c b/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c new file mode 100644 index 000000000000..8575eb0cd37d --- /dev/null +++ b/drivers/misc/pkvm-smc/pkvm/pkvm-smc.c @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2023 - Google Inc + * Author: Mostafa Saleh + * Simple module for pKVM SMC filtering. + */ + +#include + +int pkvm_smc_filter_hyp_init(const struct pkvm_module_ops *ops) +{ + return 0; +}