diff --git a/usr.sbin/bhyve/Makefile b/usr.sbin/bhyve/Makefile --- a/usr.sbin/bhyve/Makefile +++ b/usr.sbin/bhyve/Makefile @@ -76,6 +76,7 @@ spinup_ap.c \ task_switch.c \ tpm_device.c \ + tpm_emul_passthru.c \ uart_emul.c \ usb_emul.c \ usb_mouse.c \ diff --git a/usr.sbin/bhyve/tpm_emul_passthru.c b/usr.sbin/bhyve/tpm_emul_passthru.c new file mode 100644 --- /dev/null +++ b/usr.sbin/bhyve/tpm_emul_passthru.c @@ -0,0 +1,69 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause + * + * Copyright (c) 2023 Beckhoff Automation GmbH & Co. KG + * Author: Corvin Köhne + */ + +#include + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "tpm_device.h" +#include "tpm_emul.h" + +struct tpm_passthru { + int fd; +}; + +static int +tpm_passthru_init(void **sc, nvlist_t *nvl) +{ + struct tpm_passthru *tpm; + const char *path; + + tpm = calloc(1, sizeof(struct tpm_passthru)); + if (tpm == NULL) { + warnx("%s: failed to allocate tpm passthru", __func__); + return (ENOMEM); + } + + path = get_config_value_node(nvl, "path"); + tpm->fd = open(path, O_RDWR); + if (tpm->fd < 0) { + warnx("%s: unable to open tpm device \"%s\"", __func__, path); + return (ENOENT); + } + + *sc = tpm; + + return (0); +} + +static void +tpm_passthru_deinit(void *sc) +{ + struct tpm_passthru *tpm; + + tpm = sc; + if (tpm == NULL) + return; + + if (tpm->fd >= 0) + close(tpm->fd); + + free(tpm); +} + +static const struct tpm_emul tpm_emul_passthru = { + .name = "passthru", + .init = tpm_passthru_init, + .deinit = tpm_passthru_deinit, +}; +TPM_EMUL_SET(tpm_emul_passthru);