From nobody Tue Jun 20 09:01:00 2023 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4QlgbK02QSz4dshy; Tue, 20 Jun 2023 09:01:01 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4QlgbJ6J08z42mK; Tue, 20 Jun 2023 09:01:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1687251660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=sdatSd3ulUuWw2NSHn/AV4/34A35sawjfb65n85RBk4=; b=RLH/z16Q/ydbj0ZmU5WWUrOSF8tDsIxuDww0w9lRz8Z1aRSNgrMbPzmyAnvRMxA6tL1lSw sdHO35CFfcsmMG29ahqhoH1+QzoBSctwED9mlLxq5Qcech89mqruRKvf7uIfDvXCNx80Qq XyRmhK5SbbS9P8Z2Rd2tUKnHXwU7Hv8iS9BgktJ6WtOIZT+M0/VzCyB3qCvOEIQqWjE9TR UNvNAjTWrfnkmHl94pFD40IMgqIDAIAiyvcpq57Bu02LS2t6Yc/JmSoRMOjlM+k0c1ilWF N3rXDpyzslxi+hdWnhY49k70b10BkYNAvL1/stlEMWZb3bGzgLd4MlygihzTZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1687251660; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=sdatSd3ulUuWw2NSHn/AV4/34A35sawjfb65n85RBk4=; b=VP9RJZd/DG/Uy31SymlH5qvhgB6UMyn0ENCmZMthEVHYGYp3yAeQEgRXmr46a8OnZyI0uJ CiHEMvK7WrjloGJkS1l99zeIvPnsPhonl0AFRtr+Y9Ev8Rf/hjrKzt9XCjXQUtki8mxpqn dJJZcY7EmRkm8cZNz3v8HVCfoQEWO6t+RlHBCArPt3i7pAuVjp4MMZY8EbMuIgn3C6OpPO YSMSNpIZq82PyPSzuhJYW/pQ+evNKS5C2ZLPRsDTnMHfr0h0Nj9vDvxIEVy3+76Oo6Tobq /kVMJd4rcyFrBly8qgE5TGS8w9f55PIUWT6+zwdPKN5SDc6YtiOXZyv2zE3rGA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1687251660; a=rsa-sha256; cv=none; b=gpeRaviiigg6C4j36I3T5CsK/l/jnjX6QjIzCKh7XIZmfEd6PL7KydVllNd9vyCc6qllLE fVHqjabJPT93XF6VAL7jeEooMdJRTPj4Ru4Ft803Ypxbxv8VYp1iSVPtQuVCbdPOyoxZSN m6hG00MhKlMpzAQ/PlLg6TythlUNyYyWtd+87Qv5Z2yi9OCIjSrwNOs1Ga5rrOiAHMhxL0 RteLS8TywYfqnLG2jar0iWUN2F5JG80LJl0/pwGA6vNd3oj+JOhCLxgxqeyW+2ZHvyFHF6 eUVM3oraGY7ZqyMEy7NrdZ34ogf7uVxOVN+2aY63WSid5S7jsiLPNoacdBtrPA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4QlgbJ5JSSzsxr; Tue, 20 Jun 2023 09:01:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 35K9102g009658; Tue, 20 Jun 2023 09:01:00 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 35K910YE009657; Tue, 20 Jun 2023 09:01:00 GMT (envelope-from git) Date: Tue, 20 Jun 2023 09:01:00 GMT Message-Id: <202306200901.35K910YE009657@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Corvin=20K=C3=B6hne?= Subject: git: 5ea98d326830 - main - bhyve/tpm: build TPM2 table by tpm interface List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5ea98d326830f25fdeb6fc6ef46a8bccb829b13c Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=5ea98d326830f25fdeb6fc6ef46a8bccb829b13c commit 5ea98d326830f25fdeb6fc6ef46a8bccb829b13c Author: Corvin Köhne AuthorDate: 2022-08-29 10:10:43 +0000 Commit: Corvin Köhne CommitDate: 2023-06-20 08:58:55 +0000 bhyve/tpm: build TPM2 table by tpm interface Each tpm has a device specific table. Which table a tpm uses depends on the tpm interface. Reviewed by: markj MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D40457 --- usr.sbin/bhyve/tpm_device.c | 13 +++++++++++ usr.sbin/bhyve/tpm_intf.h | 4 +++- usr.sbin/bhyve/tpm_intf_crb.c | 51 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/usr.sbin/bhyve/tpm_device.c b/usr.sbin/bhyve/tpm_device.c index e1db0bab1ee9..94e9f1ffdc27 100644 --- a/usr.sbin/bhyve/tpm_device.c +++ b/usr.sbin/bhyve/tpm_device.c @@ -35,9 +35,22 @@ struct tpm_device { void *intf_sc; }; +static int +tpm_build_acpi_table(const struct acpi_device *const dev) +{ + const struct tpm_device *const tpm = acpi_device_get_softc(dev); + + if (tpm->intf->build_acpi_table == NULL) { + return (0); + } + + return (tpm->intf->build_acpi_table(tpm->intf_sc, tpm->vm_ctx)); +} + static const struct acpi_device_emul tpm_acpi_device_emul = { .name = TPM_ACPI_DEVICE_NAME, .hid = TPM_ACPI_HARDWARE_ID, + .build_table = tpm_build_acpi_table, }; void diff --git a/usr.sbin/bhyve/tpm_intf.h b/usr.sbin/bhyve/tpm_intf.h index 7de7bc6d4435..3003d8fbd754 100644 --- a/usr.sbin/bhyve/tpm_intf.h +++ b/usr.sbin/bhyve/tpm_intf.h @@ -7,6 +7,8 @@ #pragma once +#include + #include "config.h" #include "tpm_device.h" @@ -30,6 +32,6 @@ struct tpm_intf { int (*init)(void **sc); void (*deinit)(void *sc); - int (*build_acpi_table)(void *sc); + int (*build_acpi_table)(void *sc, struct vmctx *vm_ctx); }; #define TPM_INTF_SET(x) DATA_SET(tpm_intf_set, x) diff --git a/usr.sbin/bhyve/tpm_intf_crb.c b/usr.sbin/bhyve/tpm_intf_crb.c index 5fd640b2d5c9..b8ae33c5ec0a 100644 --- a/usr.sbin/bhyve/tpm_intf_crb.c +++ b/usr.sbin/bhyve/tpm_intf_crb.c @@ -31,12 +31,20 @@ #define TPM_CRB_ADDRESS 0xFED40000 #define TPM_CRB_REGS_SIZE 0x1000 +#define TPM_CRB_CONTROL_AREA_ADDRESS \ + (TPM_CRB_ADDRESS + offsetof(struct tpm_crb_regs, ctrl_req)) +#define TPM_CRB_CONTROL_AREA_SIZE TPM_CRB_REGS_SIZE + #define TPM_CRB_DATA_BUFFER_ADDRESS \ (TPM_CRB_ADDRESS + offsetof(struct tpm_crb_regs, data_buffer)) #define TPM_CRB_DATA_BUFFER_SIZE 0xF80 #define TPM_CRB_LOCALITIES_MAX 5 +#define TPM_CRB_LOG_AREA_MINIMUM_SIZE (64 * 1024) + +#define TPM_CRB_LOG_AREA_FWCFG_NAME "etc/tpm/log" + struct tpm_crb_regs { union tpm_crb_reg_loc_state { struct { @@ -156,6 +164,7 @@ static_assert(sizeof(struct tpm_crb_regs) == TPM_CRB_REGS_SIZE, } while (0) struct tpm_crb { + uint8_t tpm_log_area[TPM_CRB_LOG_AREA_MINIMUM_SIZE]; struct tpm_crb_regs regs; }; @@ -200,6 +209,13 @@ tpm_crb_init(void **sc) CRB_RSP_SIZE_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_SIZE); CRB_RSP_ADDR_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_ADDRESS); + error = qemu_fwcfg_add_file(TPM_CRB_LOG_AREA_FWCFG_NAME, + TPM_CRB_LOG_AREA_MINIMUM_SIZE, crb->tpm_log_area); + if (error) { + warnx("%s: failed to add fwcfg file", __func__); + goto err_out; + } + *sc = crb; return (0); @@ -224,9 +240,44 @@ tpm_crb_deinit(void *sc) free(crb); } +static int +tpm_crb_build_acpi_table(void *sc __unused, struct vmctx *vm_ctx) +{ + struct basl_table *table; + + BASL_EXEC(basl_table_create(&table, vm_ctx, ACPI_SIG_TPM2, + BASL_TABLE_ALIGNMENT)); + + /* Header */ + BASL_EXEC(basl_table_append_header(table, ACPI_SIG_TPM2, 4, 1)); + /* Platform Class */ + BASL_EXEC(basl_table_append_int(table, 0, 2)); + /* Reserved */ + BASL_EXEC(basl_table_append_int(table, 0, 2)); + /* Control Address */ + BASL_EXEC( + basl_table_append_int(table, TPM_CRB_CONTROL_AREA_ADDRESS, 8)); + /* Start Method == (7) Command Response Buffer */ + BASL_EXEC(basl_table_append_int(table, 7, 4)); + /* Start Method Specific Parameters */ + uint8_t parameters[12] = { 0 }; + BASL_EXEC(basl_table_append_bytes(table, parameters, 12)); + /* Log Area Minimum Length */ + BASL_EXEC( + basl_table_append_int(table, TPM_CRB_LOG_AREA_MINIMUM_SIZE, 4)); + /* Log Area Start Address */ + BASL_EXEC( + basl_table_append_fwcfg(table, TPM_CRB_LOG_AREA_FWCFG_NAME, 1, 8)); + + BASL_EXEC(basl_table_register_to_rsdt(table)); + + return (0); +} + static struct tpm_intf tpm_intf_crb = { .name = "crb", .init = tpm_crb_init, .deinit = tpm_crb_deinit, + .build_acpi_table = tpm_crb_build_acpi_table, }; TPM_INTF_SET(tpm_intf_crb);