From: Dan Williams <dan.j.willi...@intel.com> TDX depends on a platform firmware module that is invoked via instructions similar to vmenter (i.e. enter into a new privileged "root-mode" context to manage private memory and private device mechanisms). It is a software construct that depends on the CPU vmxon state to enable invocation of TDX-module ABIs. Unlike other Trusted Execution Environment (TEE) platform implementations that employ a firmware module running on a PCI device with an MMIO mailbox for communication, TDX has no hardware device to point to as the "TSM".
The "/sys/devices/virtual" hierarchy is intended for "software constructs which need sysfs interface", which aligns with what TDX needs. The new tdx_subsys will export global attributes populated by the TDX-module "sysinfo". A tdx_tsm device is published on this bus to enable a typical driver model for the low level "TEE Security Manager" (TSM) flows that talk TDISP to capable PCIe devices. For now, this is only the base tdx_subsys and tdx_tsm device registration with attribute definition and TSM driver to follow later. Recall that TDX guest would also use TSM to authenticate assigned devices and it surely needs a virtual software construct to enable guest side TSM flow. A tdx_guest_tsm device would be published on tdx_subsys to indicate the guest is capable of communicate to firmware for TIO via TDVMCALLs. Create some common helpers for TDX host/guest to create software devices on tdx_subsys. Signed-off-by: Dan Williams <dan.j.willi...@intel.com> Signed-off-by: Wu Hao <hao...@intel.com> Signed-off-by: Xu Yilun <yilun...@linux.intel.com> --- arch/x86/Kconfig | 1 + drivers/virt/coco/host/Kconfig | 3 ++ drivers/virt/coco/host/Makefile | 2 + drivers/virt/coco/host/tdx_tsm_bus.c | 70 ++++++++++++++++++++++++++++ include/linux/tdx_tsm_bus.h | 17 +++++++ 5 files changed, 93 insertions(+) create mode 100644 drivers/virt/coco/host/tdx_tsm_bus.c create mode 100644 include/linux/tdx_tsm_bus.h diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 4b9f378e05f6..fb6cc23b02e3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1925,6 +1925,7 @@ config INTEL_TDX_HOST depends on CONTIG_ALLOC depends on !KEXEC_CORE depends on X86_MCE + select TDX_TSM_BUS help Intel Trust Domain Extensions (TDX) protects guest VMs from malicious host and certain physical attacks. This option enables necessary TDX diff --git a/drivers/virt/coco/host/Kconfig b/drivers/virt/coco/host/Kconfig index 4fbc6ef34f12..c04b0446cd5f 100644 --- a/drivers/virt/coco/host/Kconfig +++ b/drivers/virt/coco/host/Kconfig @@ -4,3 +4,6 @@ # config TSM tristate + +config TDX_TSM_BUS + bool diff --git a/drivers/virt/coco/host/Makefile b/drivers/virt/coco/host/Makefile index be0aba6007cd..ce1ab15ac8d3 100644 --- a/drivers/virt/coco/host/Makefile +++ b/drivers/virt/coco/host/Makefile @@ -4,3 +4,5 @@ obj-$(CONFIG_TSM) += tsm.o tsm-y := tsm-core.o + +obj-$(CONFIG_TDX_TSM_BUS) += tdx_tsm_bus.o diff --git a/drivers/virt/coco/host/tdx_tsm_bus.c b/drivers/virt/coco/host/tdx_tsm_bus.c new file mode 100644 index 000000000000..9f4875ebf032 --- /dev/null +++ b/drivers/virt/coco/host/tdx_tsm_bus.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* Copyright(c) 2024 Intel Corporation. All rights reserved. */ + +#include <linux/device.h> +#include <linux/tdx_tsm_bus.h> + +static struct tdx_tsm_dev *alloc_tdx_tsm_dev(void) +{ + struct tdx_tsm_dev *tsm = kzalloc(sizeof(*tsm), GFP_KERNEL); + struct device *dev; + + if (!tsm) + return ERR_PTR(-ENOMEM); + + dev = &tsm->dev; + dev->bus = &tdx_subsys; + device_initialize(dev); + + return tsm; +} + +DEFINE_FREE(tdx_tsm_dev_put, struct tdx_tsm_dev *, + if (!IS_ERR_OR_NULL(_T)) put_device(&_T->dev)) +struct tdx_tsm_dev *init_tdx_tsm_dev(const char *name) +{ + struct device *dev; + int ret; + + struct tdx_tsm_dev *tsm __free(tdx_tsm_dev_put) = alloc_tdx_tsm_dev(); + if (IS_ERR(tsm)) + return tsm; + + dev = &tsm->dev; + ret = dev_set_name(dev, name); + if (ret) + return ERR_PTR(ret); + + ret = device_add(dev); + if (ret) + return ERR_PTR(ret); + + return no_free_ptr(tsm); +} +EXPORT_SYMBOL_GPL(init_tdx_tsm_dev); + +static int tdx_match(struct device *dev, const struct device_driver *drv) +{ + if (!strcmp(dev_name(dev), drv->name)) + return 1; + + return 0; +} + +static int tdx_uevent(const struct device *dev, struct kobj_uevent_env *env) +{ + return add_uevent_var(env, "MODALIAS=%s", dev_name(dev)); +} + +const struct bus_type tdx_subsys = { + .name = "tdx", + .match = tdx_match, + .uevent = tdx_uevent, +}; +EXPORT_SYMBOL_GPL(tdx_subsys); + +static int tdx_tsm_dev_init(void) +{ + return subsys_virtual_register(&tdx_subsys, NULL); +} +arch_initcall(tdx_tsm_dev_init); diff --git a/include/linux/tdx_tsm_bus.h b/include/linux/tdx_tsm_bus.h new file mode 100644 index 000000000000..ef7af97ba230 --- /dev/null +++ b/include/linux/tdx_tsm_bus.h @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright(c) 2024 Intel Corporation. */ + +#ifndef __TDX_TSM_BUS_H +#define __TDX_TSM_BUS_H + +#include <linux/device.h> + +struct tdx_tsm_dev { + struct device dev; +}; + +extern const struct bus_type tdx_subsys; + +struct tdx_tsm_dev *init_tdx_tsm_dev(const char *name); + +#endif -- 2.25.1