git: e09778575817 - main - bhyve: add basic TPM emulation struct
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 16 Jun 2023 06:23:02 UTC
The branch main has been updated by corvink:
URL: https://cgit.FreeBSD.org/src/commit/?id=e09778575817badd574389382317b46b4213ecf4
commit e09778575817badd574389382317b46b4213ecf4
Author: Corvin Köhne <corvink@FreeBSD.org>
AuthorDate: 2023-05-15 11:49:42 +0000
Commit: Corvin Köhne <corvink@FreeBSD.org>
CommitDate: 2023-06-16 06:18:39 +0000
bhyve: add basic TPM emulation struct
This struct will be used to implement various TPM emulations like a TPM
passthrough or a virtual TPM.
Reviewed by: markj
MFC after: 1 week
Sponsored by: Beckhoff Automation GmbH & Co. KG
Differential Revision: https://reviews.freebsd.org/D40454
---
usr.sbin/bhyve/tpm_device.c | 29 +++++++++++++++++++++++++++++
usr.sbin/bhyve/tpm_emul.h | 22 ++++++++++++++++++++++
2 files changed, 51 insertions(+)
diff --git a/usr.sbin/bhyve/tpm_device.c b/usr.sbin/bhyve/tpm_device.c
index e48f9df14701..3a847cc53a9b 100644
--- a/usr.sbin/bhyve/tpm_device.c
+++ b/usr.sbin/bhyve/tpm_device.c
@@ -17,13 +17,18 @@
#include "acpi_device.h"
#include "config.h"
#include "tpm_device.h"
+#include "tpm_emul.h"
#define TPM_ACPI_DEVICE_NAME "TPM"
#define TPM_ACPI_HARDWARE_ID "MSFT0101"
+SET_DECLARE(tpm_emul_set, struct tpm_emul);
+
struct tpm_device {
struct vmctx *vm_ctx;
struct acpi_device *acpi_dev;
+ struct tpm_emul *emul;
+ void *emul_sc;
};
static const struct acpi_device_emul tpm_acpi_device_emul = {
@@ -37,6 +42,9 @@ tpm_device_destroy(struct tpm_device *const dev)
if (dev == NULL)
return;
+ if (dev->emul != NULL && dev->emul->deinit != NULL)
+ dev->emul->deinit(dev->emul_sc);
+
acpi_device_destroy(dev->acpi_dev);
free(dev);
}
@@ -46,6 +54,7 @@ tpm_device_create(struct tpm_device **const new_dev, struct vmctx *const vm_ctx,
nvlist_t *const nvl)
{
struct tpm_device *dev = NULL;
+ struct tpm_emul **ppemul;
const char *value;
int error;
@@ -75,6 +84,26 @@ tpm_device_create(struct tpm_device **const new_dev, struct vmctx *const vm_ctx,
if (error)
goto err_out;
+ value = get_config_value_node(nvl, "type");
+ assert(value != NULL);
+ SET_FOREACH(ppemul, tpm_emul_set) {
+ if (strcmp(value, (*ppemul)->name))
+ continue;
+ dev->emul = *ppemul;
+ break;
+ }
+ if (dev->emul == NULL) {
+ warnx("TPM emulation \"%s\" not found", value);
+ error = EINVAL;
+ goto err_out;
+ }
+
+ if (dev->emul->init) {
+ error = dev->emul->init(&dev->emul_sc, nvl);
+ if (error)
+ goto err_out;
+ }
+
*new_dev = dev;
return (0);
diff --git a/usr.sbin/bhyve/tpm_emul.h b/usr.sbin/bhyve/tpm_emul.h
new file mode 100644
index 000000000000..f75c0318d37e
--- /dev/null
+++ b/usr.sbin/bhyve/tpm_emul.h
@@ -0,0 +1,22 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2023 Beckhoff Automation GmbH & Co. KG
+ * Author: Corvin Köhne <corvink@FreeBSD.org>
+ */
+
+#pragma once
+
+#include <sys/linker_set.h>
+
+#include "config.h"
+
+struct tpm_device;
+
+struct tpm_emul {
+ const char *name;
+
+ int (*init)(void **sc, nvlist_t *nvl);
+ void (*deinit)(void *sc);
+};
+#define TPM_EMUL_SET(x) DATA_SET(tpm_emul_set, x)