From nobody Fri May 10 14:36:13 2024 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 4VbWf610B9z5JZP7; Fri, 10 May 2024 14:36:14 +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 4VbWf60Lktz4kh1; Fri, 10 May 2024 14:36:14 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1715351774; 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=Ip8KKPwfuoRY3pMlxDFjgsp/Zy5d+nymCe1KFem4VBc=; b=xcK99pFRP8IWr4tktC8MziSRvNdj9rjA0BxMjue4b2N/8uFnDwEPXzqaqmyQWGfq4p7J3B 9f79qtkyQ1Vtx/YCFvvxGpB+y2wwIBs7v+yLUiicG48Oz/nyysv4/fPWe7/ut2WPP+If4b 1DIKTwIes1okIO07G8ys42ldTLi+G3iYiVGDUTmDBHoV6lZbMUlUaVulib4rxc99LeL49z bOJ7XaZWcuP5Hpse9jtZJqJL8674IDCNLfBiSX5OmS+nxA+KGiO8PV61shn5A2gc1ojfKR MdudIZKOu3SJ+tB+OB2ehj1bc0Oi5UkatuPpv+Va/TyhZSzBQuaHVSYYG9DIeA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1715351774; a=rsa-sha256; cv=none; b=duifpFhpcZMjVbMtEHGejNlmT7yYzmpx1Bpemh3aoWfwJlMs/KP3K64L5KhxhKozPksWqK akqqRJvKqZQAqm7/3FzTh77a0iyVtYRdLps71IvNaRTwyLcWLpfvCD5Xsozw5SbnqsfIrv 7kLqUdcku1Am6/Rc2W3be3vaefQve2zHNKc0896yERsYVgJavpZfjLvhpPI99ymLm8dlx4 dxl486fAIZp64/dNxXzx1+bXPrmBsilbM8oJkpkesmZNJa3Qb0t83809r7bhts+THFOTND 73LAU5qrdYiEVp34dmvfXC8uA5hD0P3xunUJTukXXuX3MkLOWxY3GHbeT021FA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1715351774; 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=Ip8KKPwfuoRY3pMlxDFjgsp/Zy5d+nymCe1KFem4VBc=; b=cSREizBT3cKkoZxKQnrn3e9ZvrTiCMIzekY/3IAs7N4bQNBS5SXxjMF8rAANzKKLjy9ieT wcC9h52ng7EKoCEuAYwHkT2E8ntPnj5lZygjeK4cPULn3H8U02KGMRwNdRF7YxgBA6+6sb 1pvSHEnFPdoag/D28OgP7jNiBJ0GtWRGCcZ1tju4ksh9qEF01xkNMUm6UE2PiFO7lD3Rji HTHeGqJMSh5f0/d3tQ5Vilf8lO3bMVzVCj6N1afDPm9F6vw6pt57fs7PO6aLqw5N8HDJwq c9yDHdmM1hwDBdxpcRTXw/D1MRzRP+fCOF4XVrH+bZG2aBtldvCe4e+ZmvqprQ== 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 4VbWf56p5xzhG8; Fri, 10 May 2024 14:36:13 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 44AEaD6h003751; Fri, 10 May 2024 14:36:13 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 44AEaDDe003748; Fri, 10 May 2024 14:36:13 GMT (envelope-from git) Date: Fri, 10 May 2024 14:36:13 GMT Message-Id: <202405101436.44AEaDDe003748@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Justin Hibbits Subject: git: 10eea8dc8c4f - main - tpm20: Support partial reads 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: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: jhibbits X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 10eea8dc8c4f3d2a3495e7fb08837d91adf465e9 Auto-Submitted: auto-generated The branch main has been updated by jhibbits: URL: https://cgit.FreeBSD.org/src/commit/?id=10eea8dc8c4f3d2a3495e7fb08837d91adf465e9 commit 10eea8dc8c4f3d2a3495e7fb08837d91adf465e9 Author: Justin Hibbits AuthorDate: 2024-05-09 19:27:35 +0000 Commit: Justin Hibbits CommitDate: 2024-05-10 18:35:28 +0000 tpm20: Support partial reads Summary: In some cases the TPM utilities may read only a partial block, instead of a full block. If a new command starts while in the middle of a read it may cause the TPM to go catatonic and no longer respond to SPI. Reviewed by: kd Obtained from: Juniper Networks, Inc. Differential Revision: https://reviews.freebsd.org/D45140 --- sys/dev/tpm/tpm20.c | 10 +++++++--- sys/dev/tpm/tpm20.h | 1 + sys/dev/tpm/tpm_crb.c | 1 + sys/dev/tpm/tpm_tis_core.c | 1 + 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/sys/dev/tpm/tpm20.c b/sys/dev/tpm/tpm20.c index 3399e17f53aa..80f7d9e105a6 100644 --- a/sys/dev/tpm/tpm20.c +++ b/sys/dev/tpm/tpm20.c @@ -68,6 +68,7 @@ tpm20_read(struct cdev *dev, struct uio *uio, int flags) { struct tpm_sc *sc; size_t bytes_to_transfer; + size_t offset; int result = 0; sc = (struct tpm_sc *)dev->si_drv1; @@ -80,10 +81,10 @@ tpm20_read(struct cdev *dev, struct uio *uio, int flags) } bytes_to_transfer = MIN(sc->pending_data_length, uio->uio_resid); + offset = sc->total_length - sc->pending_data_length; if (bytes_to_transfer > 0) { - result = uiomove((caddr_t) sc->buf, bytes_to_transfer, uio); - memset(sc->buf, 0, TPM_BUFSIZE); - sc->pending_data_length = 0; + result = uiomove((caddr_t) sc->buf + offset, bytes_to_transfer, uio); + sc->pending_data_length -= bytes_to_transfer; cv_signal(&sc->buf_cv); } else { result = ETIMEDOUT; @@ -152,6 +153,7 @@ tpm20_discard_buffer(void *arg) memset(sc->buf, 0, TPM_BUFSIZE); sc->pending_data_length = 0; + sc->total_length = 0; cv_signal(&sc->buf_cv); sx_xunlock(&sc->dev_lock); @@ -191,6 +193,7 @@ tpm20_init(struct tpm_sc *sc) cv_init(&sc->buf_cv, "TPM buffer cv"); callout_init(&sc->discard_buffer_callout, 1); sc->pending_data_length = 0; + sc->total_length = 0; make_dev_args_init(&args); args.mda_devsw = &tpm20_cdevsw; @@ -275,6 +278,7 @@ tpm20_harvest(void *arg, int unused) /* Ignore response size */ sc->pending_data_length = 0; + sc->total_length = 0; /* The number of random bytes we got is placed right after the header */ entropy_size = (uint16_t) sc->buf[TPM_HEADER_SIZE + 1]; diff --git a/sys/dev/tpm/tpm20.h b/sys/dev/tpm/tpm20.h index 683cd7549bd4..7c2ccd30143a 100644 --- a/sys/dev/tpm/tpm20.h +++ b/sys/dev/tpm/tpm20.h @@ -124,6 +124,7 @@ struct tpm_sc { uint8_t *buf; size_t pending_data_length; + size_t total_length; lwpid_t owner_tid; struct callout discard_buffer_callout; diff --git a/sys/dev/tpm/tpm_crb.c b/sys/dev/tpm/tpm_crb.c index b9ddcf0dd3e1..017ebd45c7ea 100644 --- a/sys/dev/tpm/tpm_crb.c +++ b/sys/dev/tpm/tpm_crb.c @@ -398,6 +398,7 @@ tpmcrb_transmit(device_t dev, size_t length) tpmcrb_relinquish_locality(sc); sc->pending_data_length = bytes_available; + sc->total_length = bytes_available; return (0); } diff --git a/sys/dev/tpm/tpm_tis_core.c b/sys/dev/tpm/tpm_tis_core.c index 230eb12d2acd..d8421f8156c9 100644 --- a/sys/dev/tpm/tpm_tis_core.c +++ b/sys/dev/tpm/tpm_tis_core.c @@ -469,6 +469,7 @@ tpmtis_transmit(device_t dev, size_t length) } tpmtis_relinquish_locality(sc); sc->pending_data_length = bytes_available; + sc->total_length = bytes_available; return (0); }