From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916627; cv=none; d=zohomail.com; s=zohoarc; b=N0QUAiPF2R/pH1+uXvxc9CuENG1F2nRjTeLXn1Ru4pq7+nmOAzLCJNQHY3YRzMCyn1B9ttxcBDMl6s4nAU2EX6D90D+l3kllrjzU0swi3WXQRSDfCKZ/jq3KMb2VUB8LDANtFIDMtO4FgZJjvvfUXuIIdkV7aTjWWlTExUjrKEk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916627; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=v4pF4l9L+XhDbGXCnZWjvEQGjfAJPVkKy76gDH2nELI=; b=X7El3n8t/ZE4XG482vWclS0tBlQMDne883cOw51DY4VRa5HDei7ZWkM/GLNJqYCH6PYZYgA0zwlp5/AGv02GFRhaBFphBewTA91IQb6f8KhdLoqjG0z4M2M0aRihfdkfu7xA8OVJj1kwSDij7WffZaqkrpLZsZMBet8Iyk66KrA= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777916627014408.8264916159653; Mon, 4 May 2026 10:43:47 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxJu-00080G-9x; Mon, 04 May 2026 13:43:02 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxJr-000800-Ht for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:00 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxJp-0007bi-N4 for qemu-devel@nongnu.org; Mon, 04 May 2026 13:42:59 -0400 Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-385-Qf2xW1VyNCG-jZBiDlONAQ-1; Mon, 04 May 2026 13:42:55 -0400 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2b465bf993cso45071375ad.1 for ; Mon, 04 May 2026 10:42:55 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.42.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:42:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916576; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v4pF4l9L+XhDbGXCnZWjvEQGjfAJPVkKy76gDH2nELI=; b=BGoyBHzJDRS8hTyz5DNori2YI+TRvoQcw3VLLNzvT4VSj5d5PzI95ST+5lLASFAL2A1Wij oGr9/AO4snVEljsTGdd8cfKiwMwSn/ZlV74uYQjUZD68pgFua1pXPN37EUNEqTAMNotJrx 0edm3Cb/tJAGaaFsuhQtYBoj6uy9byM= X-MC-Unique: Qf2xW1VyNCG-jZBiDlONAQ-1 X-Mimecast-MFC-AGG-ID: Qf2xW1VyNCG-jZBiDlONAQ_1777916574 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916574; x=1778521374; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=v4pF4l9L+XhDbGXCnZWjvEQGjfAJPVkKy76gDH2nELI=; b=cVHcA+eRrxxlx0gVVzpj34zKcFsMc/uz1Qig7dc2ghorjZBhIV0zna3Ck0LwSQBdsZ 3p75IQuYXZhSIFeF9Joa2hyjpYenT9Hc0gre/1Ch4u+te2SAse5P2kevwH6EMafFcd6m yYPW9k6DlO9b/vQ0hp6dqQdwk7owiy29JFiHs85r7JDkZCdiuO1oFHg0deUcAbRyRTIa KJ8FFGzxnnU6b69UUt8by2X7ppdcItqd/T3Eo8URaw+2Q4hagfuvZSWViDNbyBCvQRP0 AwGLV99G4nK9R9mf7QvMsKP6g6JiN+fQigjBnvgTNqEIpF0OLrVb8StVTFuYBnH/W/4Q mNfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916574; x=1778521374; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=v4pF4l9L+XhDbGXCnZWjvEQGjfAJPVkKy76gDH2nELI=; b=r3EDbmQAaTBGgZMMPL0mclbk335lBgSw11v4usX87kG49Dspoi79vLYOgPEqqKnnrT n0g0JKD/Yj+kDGI986MJKHjZWccu3Y9iq6rAMlU149SPw7VmK/XrJ8Se9YlUgYkSTh5R ea1rwwvQXeLrbbtf2z9UlxtF7k8hNRdsYH8LVIlVQYfHcuJDhsNseywSW39d7exPr6X3 gVX6XalTRqQ2JdMpnp/at2YLq8upLWHkeT4Q+yNdXuWnh7wWJVHw3qv8KiA5FGegOZIk 2FRYZ7HuYVSIMzRJh2Yl4cuI5CRWf6JR1wCoJFCp7lhmAxOnWiRqorkq1mLfMP5FJWQs CRkw== X-Gm-Message-State: AOJu0Ywnj+2dRJ9/HFMg++1kta9ERu+1Z88amw1lttpLzjZ7gKssXcdZ zn4DqHifbYL67jJeKToApyz/SJ0X4S5auR8aocexFTtI5EE09jYE3onU9KTvn0KI2FSgjuf0MOc WH1Ygaf2LIEK73GyIf1FfvNfdOUiR0sDgL0gEomTbddP72Udyi2XaBaiDoKLzgh1FNhvFMjas8Z wH2uNqHacnAOCh7CY1LWMbsgG6IcB1fd4CVAGtqRI= X-Gm-Gg: AeBDievpzyPVqYkgpKOunzed14kiigWCJ0LpWYujbYtrHcXvzyEblzC1hqkSK4QU2i5 oeksiWgwRw7KdTe/riMHLfdcsjfmIQLJrjHh9Nmu10oplJAz5L4m8d0Fz+/95sUwIHACNl1jbip hVW5fWsqmSHwb+2Ecgcr+3Rrb1NBSEwvfzS1ww4piJ840GuJ+2r6lBjWePykkqXSz/Z0WLRgohK Ad97lmww2LrB+EqHyZC22svi4H9crThLoObrXXcMISpJZUMQtIh0MdyD7VV9CCjibuBobAzJnLR wQ9XFveWU9cGa0HydY/DR2Zvd0hmU93xkNk0eUXYxrhNtXSB1+sBgUOiT48OyMnB0xiiYGyxHVl P04l6VfQVzRyaPrPSOJ55M9musMrPEvdXSFLbQc+VdzC2k8mczEOU/XflUjYYV689jMO0WGzG X-Received: by 2002:a17:902:c40e:b0:2b0:6e6a:8504 with SMTP id d9443c01a7336-2b9f2810604mr111287975ad.27.1777916573940; Mon, 04 May 2026 10:42:53 -0700 (PDT) X-Received: by 2002:a17:902:c40e:b0:2b0:6e6a:8504 with SMTP id d9443c01a7336-2b9f2810604mr111287475ad.27.1777916573137; Mon, 04 May 2026 10:42:53 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon , Stefan Berger Subject: [PATCH v6 1/6] hw/tpm: Add TPM CRB chunking fields Date: Mon, 4 May 2026 23:12:29 +0530 Message-ID: <20260504174234.13556-2-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916628931154100 From: Arun Menon - Add new fields to the CRB Interface Identifier and the CRB Control Start registers. - CRB_CTRL_START now has 2 new settings, that can be toggled using the nextChunk and crbRspRetry bits. - CapCRBChunk bit (10) was Reserved1 previously. The field is reused in this revision of the specification. Refer to section 6.4.2.2 of [1] - Add hw_compat global property called cap-chunk because the chunking feature is only supported for machine type 11.1 and higher. [1] https://trustedcomputinggroup.org/wp-content/uploads/PC-Client-Specific= -Platform-TPM-Profile-for-TPM-2p0-v1p07_Pub.pdf Signed-off-by: Arun Menon Reviewed-by: Stefan Berger Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/core/machine.c | 4 +++- hw/tpm/tpm_crb.c | 6 ++++++ include/hw/acpi/tpm.h | 5 ++++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/hw/core/machine.c b/hw/core/machine.c index 1b661fd36a..4e0a93e231 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -39,7 +39,9 @@ #include "hw/acpi/generic_event_device.h" #include "qemu/audio.h" =20 -GlobalProperty hw_compat_11_0[] =3D {}; +GlobalProperty hw_compat_11_0[] =3D { + { "tpm-crb", "cap-chunk", "off" }, +}; const size_t hw_compat_11_0_len =3D G_N_ELEMENTS(hw_compat_11_0); =20 GlobalProperty hw_compat_10_2[] =3D { diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 02701ab948..bfa09c04cf 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -44,6 +44,8 @@ struct CRBState { size_t be_buffer_size; =20 TPMPPI ppi; + + bool cap_chunk; }; typedef struct CRBState CRBState; =20 @@ -58,6 +60,7 @@ DECLARE_INSTANCE_CHECKER(CRBState, CRB, #define CRB_INTF_CAP_FIFO_NOT_SUPPORTED 0b0 #define CRB_INTF_CAP_CRB_SUPPORTED 0b1 #define CRB_INTF_IF_SELECTOR_CRB 0b1 +#define CRB_INTF_CAP_CRB_CHUNK 0b1 =20 #define CRB_CTRL_CMD_SIZE (TPM_CRB_ADDR_SIZE - A_CRB_DATA_BUFFER) =20 @@ -227,6 +230,7 @@ static const VMStateDescription vmstate_tpm_crb =3D { =20 static const Property tpm_crb_properties[] =3D { DEFINE_PROP_TPMBE("tpmdev", CRBState, tpmbe), + DEFINE_PROP_BOOL("cap-chunk", CRBState, cap_chunk, true), }; =20 static void tpm_crb_reset(void *dev) @@ -258,6 +262,8 @@ static void tpm_crb_reset(void *dev) CapCRB, CRB_INTF_CAP_CRB_SUPPORTED); ARRAY_FIELD_DP32(s->regs, CRB_INTF_ID, InterfaceSelector, CRB_INTF_IF_SELECTOR_CRB); + ARRAY_FIELD_DP32(s->regs, CRB_INTF_ID, + CapCRBChunk, s->cap_chunk ? CRB_INTF_CAP_CRB_CHUNK : = 0); ARRAY_FIELD_DP32(s->regs, CRB_INTF_ID, RID, 0b0000); ARRAY_FIELD_DP32(s->regs, CRB_INTF_ID2, diff --git a/include/hw/acpi/tpm.h b/include/hw/acpi/tpm.h index 2ab186a745..782dc8212c 100644 --- a/include/hw/acpi/tpm.h +++ b/include/hw/acpi/tpm.h @@ -150,7 +150,7 @@ REG32(CRB_INTF_ID, 0x30) FIELD(CRB_INTF_ID, InterfaceVersion, 4, 4) FIELD(CRB_INTF_ID, CapLocality, 8, 1) FIELD(CRB_INTF_ID, CapCRBIdleBypass, 9, 1) - FIELD(CRB_INTF_ID, Reserved1, 10, 1) + FIELD(CRB_INTF_ID, CapCRBChunk, 10, 1) FIELD(CRB_INTF_ID, CapDataXferSizeSupport, 11, 2) FIELD(CRB_INTF_ID, CapFIFO, 13, 1) FIELD(CRB_INTF_ID, CapCRB, 14, 1) @@ -169,6 +169,9 @@ REG32(CRB_CTRL_STS, 0x44) FIELD(CRB_CTRL_STS, tpmIdle, 1, 1) REG32(CRB_CTRL_CANCEL, 0x48) REG32(CRB_CTRL_START, 0x4C) + FIELD(CRB_CTRL_START, Start, 0, 1) + FIELD(CRB_CTRL_START, crbRspRetry, 1, 1) + FIELD(CRB_CTRL_START, nextChunk, 2, 1) REG32(CRB_INT_ENABLED, 0x50) REG32(CRB_INT_STS, 0x54) REG32(CRB_CTRL_CMD_SIZE, 0x58) --=20 2.54.0 From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916626; cv=none; d=zohomail.com; s=zohoarc; b=MXXKjtUFr4LCp9gVoRIPAuZUp8bWeRfYpQBZZ8uuJpAlpkcvFmGHSp489ZQZzjt5YZ3UrHfNUhOYuKn20NNc0jwGxLPEr7iJqmA/OLfZqaULJB2z4FdUtHjeo2hVWEr3vYakT3crMSLLPfq4wmRIDRvB1OUh9ZMnue3/lCUKSVw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916626; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=rrFde0CzVFJL6FQDSYJhldHvMPOSgrKBQeMX0L6Tpo4=; b=PjvrLVa4/FHE2yfpIO2bqTqDOhOwLuFadjK3N+vKMNnQVC7kdZG0mYKi9SjSCWscN12hCtSEBYh8CxmODQZRmFIfNv6A/oX1XPzyzdRmB+rJwwiDwyzpVmi6w2mhYyBKAqEh8ig0LChAANK3/c1blpUjJzRrQGv0L5iNQ41mp+A= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 17779166262381015.1650416495213; Mon, 4 May 2026 10:43:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxK2-000811-PM; Mon, 04 May 2026 13:43:11 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxJz-00080k-Eb for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:07 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxJx-0007ez-KQ for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:07 -0400 Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-683-cBdb0BFnMTGbxqR3rdtB2A-1; Mon, 04 May 2026 13:43:02 -0400 Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-36514eb1194so4041803a91.2 for ; Mon, 04 May 2026 10:43:02 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.42.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:42:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916584; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=rrFde0CzVFJL6FQDSYJhldHvMPOSgrKBQeMX0L6Tpo4=; b=LOhh9TaNywbFktvZaNA44p8bRWeERD/raE/bSlSiiGYgFDBbXSgKVeat46WpOMatgUvFUZ G0jVMlyDZMzA3jbzv1fJ2p1sEE+EdorfVPPNPJya+AfT2EA2bybMAx/fP4TQcqHhdPnJEp L1hDCvgNAs9l8g61Rv6/qkilm001p1w= X-MC-Unique: cBdb0BFnMTGbxqR3rdtB2A-1 X-Mimecast-MFC-AGG-ID: cBdb0BFnMTGbxqR3rdtB2A_1777916582 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916581; x=1778521381; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=rrFde0CzVFJL6FQDSYJhldHvMPOSgrKBQeMX0L6Tpo4=; b=b5iKkGAycVESmU2XdBbwc0p/iSH6HjtjXF99me4p8FURoo3VNo+lCv7juJzmrKxIhE XlCAZ3TZWghHyAizLr8uxb0SBni8XLwbATwJpjU377+zx60G99rd6Q+w3xEPUMQ5GE+u iSgFaEyakcN5cKfWKpBGQru0nn7GwmYLS/IIXOveIlLlmiGnni7dLlRoBvulOIye2VEU +mHL4/COlMfJ8/xv4w9s7pc68TjntwnMQlmUsYIqxiz/oaAmS3EoDJjSTuzvx3XtE8Mt 2JFn05YJP6jRnKEv/H36cwE0r0vu98aXefVeBJqotjaPRk+bXiWY+BJBGwvCE3A1vFBR 6a8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916581; x=1778521381; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=rrFde0CzVFJL6FQDSYJhldHvMPOSgrKBQeMX0L6Tpo4=; b=Sm565ouKY4Kwd2x63zicOiuYS8ixm3Gr/m5qLhrup97awoINAQuWsI921Y0s81AwP3 aV/uVl9aa4YHnNhvfsMs//0ue4LDagUsJnqWHgov3pf9k3BPytXmmYNd4sbuQmlhrPw2 /S3ArVBB7ADHU5r+16EOqOhPWHdjp8BjouB9bMyLk4YcPnFEFrt6d0bRUZe5eVs3h7Cc NApK8wdL34VeAA9gyQDr3ftY4tsoazLRoVSbK4kIhFSNCSNJxmQPRK7aFE/3dTesJ4C+ ZGFZmNv9tTj8jjAjqQ103H2yb/y/VjltakfsZTSYO5EX2ts+XEiFJudsIAM/fB6xUB43 Gsfg== X-Gm-Message-State: AOJu0Ywiaso4/yfRBTVqDcaiTylD7WStzjYyVVRGzHxDOB3t7kTai2v5 jQLsUSXDp82bogbYtw2usyjjEJOCxZvmYaLf5tK2TtDcsTD0yja3socjaZ1Kn93MTRF5zPlfSYs J1XUh06Mgr8JK41qT3jz3fmYrTw12xpT7to3tCrsYpk4o9xa0K47pbP3BMRnMiVVykrDJf170ht 6e52WggwGakluNV4qEj8RscwHMCQ23AE9YqaCxEvg= X-Gm-Gg: AeBDieujXLI5NDNWWS6r8AjRIFNCPgw5nXqPJwFoDGJWUuDSjbjnwzij89vwJj30RuD xKsQZAJtZP/TJV4wwePJgDZfLWxY30uxTIX5x5EhjYpRb3rwcYhZzVwOXXc0ZbhPpHLwnIR6cES FVVqw/jCYTBm5/toiJn5J6TnwuK8+paZRR/dHTLzv6BSfOVr9OmKophHd+i2eT6z+fbFcKFtI/z hueZ5IdgOSoeHmadF++4DzX4FhwnbNSWYDDNefyAYqIn41xLT56dBNHvhOK4gCXfXC/qHBVG5Fe 6RCkVQ8pNn9xu4EyfAJCWiz4DcsyvDIlXj3/QNflIr5bSpDptPYiZDXSq/ron3KZMCvEeppiQw4 hZICJVc70gNZlTi6W2UXXS5erT/v6Vv08unMSevGsWpgyAFL8gyOklWGwUO7Dv7IlZYE/QBJK X-Received: by 2002:a17:90b:4ec5:b0:35b:9b77:d7c with SMTP id 98e67ed59e1d1-3650ce8ef90mr10698447a91.14.1777916580827; Mon, 04 May 2026 10:43:00 -0700 (PDT) X-Received: by 2002:a17:90b:4ec5:b0:35b:9b77:d7c with SMTP id 98e67ed59e1d1-3650ce8ef90mr10698411a91.14.1777916580365; Mon, 04 May 2026 10:43:00 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon , Stefan Berger Subject: [PATCH v6 2/6] hw/tpm: Refactor CRB_CTRL_START register access Date: Mon, 4 May 2026 23:12:30 +0530 Message-ID: <20260504174234.13556-3-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916628359158500 From: Arun Menon Replace manual bitwise operations with ARRAY_FIELD_DP32 macros No functional changes. Signed-off-by: Arun Menon Reviewed-by: Stefan Berger Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/tpm/tpm_crb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index bfa09c04cf..a0f472652e 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -146,7 +146,7 @@ static void tpm_crb_mmio_write(void *opaque, hwaddr add= r, tpm_crb_get_active_locty(s) =3D=3D locty) { void *mem =3D memory_region_get_ram_ptr(&s->cmdmem); =20 - s->regs[R_CRB_CTRL_START] |=3D CRB_START_INVOKE; + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, Start, 1); s->cmd =3D (TPMBackendCmd) { .in =3D mem, .in_len =3D MIN(tpm_cmd_get_size(mem), s->be_buffer_size), @@ -195,7 +195,7 @@ static void tpm_crb_request_completed(TPMIf *ti, int re= t) { CRBState *s =3D CRB(ti); =20 - s->regs[R_CRB_CTRL_START] &=3D ~CRB_START_INVOKE; + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, Start, 0); if (ret !=3D 0) { ARRAY_FIELD_DP32(s->regs, CRB_CTRL_STS, tpmSts, 1); /* fatal error */ --=20 2.54.0 From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916698; cv=none; d=zohomail.com; s=zohoarc; b=KRrTDshQFKKIlz5wjJXHpQG6YssfJcNJ6ajsmPsr48NYakJP8ZHBroLDSVcf8Hhl41g3/lSSHUxtn3RiYwxF51d73reW3M7BiyB/PjLLHXJzTDjQRGkNl/Yh7UnxYSOMDX+w/meEj7llc5JGLjK3RgpTOGqGR3MyWVhySGc/fqs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916698; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=mqQQa0sIdgZK6GVtiZnksrInbkePHvX9cE0LybQFiho=; b=Lo3Fa03dEPRB5VJNzqvQ0Twy1iBeoYmxoqIycsrIy3R2t3zNmir0T+HDvsoue1KcPE47P4RVPZjanFaZqLQqUy7k413Kxg68WUKrvu88tpnGxv9FWYt63oG6FaJL5S50NyN67qBWDfQ5DpS/1usAqhIQEXSIjuHBZfh5sDbdEBo= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777916698816574.337246028664; Mon, 4 May 2026 10:44:58 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxKD-00081l-CH; Mon, 04 May 2026 13:43:22 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxK7-00081L-6w for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:15 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxK4-0007gN-9M for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:13 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-34-8cRBGPhWPFCwSLkZ2JU_ZQ-1; Mon, 04 May 2026 13:43:10 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2b258636d16so47070885ad.2 for ; Mon, 04 May 2026 10:43:09 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.43.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:43:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916591; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=mqQQa0sIdgZK6GVtiZnksrInbkePHvX9cE0LybQFiho=; b=OCEmFLXsmL6MR/S9qR7Xi+vyfo2Kf76+LJ3nNmXQl6q3e7952gVox3NSPTdhS9HqODrIZr sS5w9BY2yoPl+aKk79sfLl3Au8sV8whe7pcnmIzwVazialnjE0QPqIqgyc38q0l/UvLDQV 3Hg/LqxvUqSuC42rxWo1c1KDIjcXE1I= X-MC-Unique: 8cRBGPhWPFCwSLkZ2JU_ZQ-1 X-Mimecast-MFC-AGG-ID: 8cRBGPhWPFCwSLkZ2JU_ZQ_1777916589 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916588; x=1778521388; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mqQQa0sIdgZK6GVtiZnksrInbkePHvX9cE0LybQFiho=; b=oElN9e0TLB1q6Y0Jor+HxpiakK45AHur0+CFsROUX9OD7LKj0oiJpX+u++S9uzs6ad efHji+LOsdO4prqK3mJ9ka04FQ9MUkGR70k83iGiXePa+NmBkAnvbkdzO+4J8PnFNj7M i73NyV0R2BHuWWzLbmqIUDvOoHsWS556ND+TRFpkF1DwjxUo7IjZwEAuMmZ6MkFKKdvv 6btTb4AUF1Hb2f3IZELuEG/GqDcoa100Va/l4z0huQzjYy3paINadSgEa6tEVizuzfhq oBq0l5upvfnGYKZHKiVzqVzvhtXqdbAgBSAVjQNrYOf5mTBXt/VnWcN4ewNrEiURiRBS 75sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916588; x=1778521388; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=mqQQa0sIdgZK6GVtiZnksrInbkePHvX9cE0LybQFiho=; b=luYAybNe4AjNWvD3VsCb9r+CRC91H8Kge6oTtWE8nlgRbwbl9v/TjbkAEH3+z4zgIL a4piqUYWtZoQMxvpiu0CxsRHhtbWs3vIjY4SFxeOX+voxYubXTMTn3Ili9Gnaodzz1OX fAN9ZOqLACbE1zk5B0GQGJYiLKh6w3BqqWgU30thx1m5jYzeLL+nqIGNJXV74KIq21IP u9r4GxoVfjC7Q55NsHtofCI8u5K7djq27KbpNPI8vfYttcxxG0rsyKt8L4pFbV9x8c8/ sWw6GHJ9RAFjj2TnCwQSQhSfG221KHJEp8WYIPa8cOnCLd4lnk5/lPMoUBtFl9M/Ghln Kk9A== X-Gm-Message-State: AOJu0YysJme1E6sYQ9DtIwO63mTelpwbxUoIsKPcAv9mNYZLr3aKYY3p 2aHTcZ2kHthMz7AjIo6i+tkZPKfB1cYYUmjNyo/2oSMvhcYIeZ2Mfy2mfzpSb6qEon23vcGzuRR IO0ocMnEwvVlBgxy3pRGQH/67QQGdpf8f1Rdg9WG8jGPzb+fD+AeXYMv0aC1bSrW7pATKniPFyD pEo5h1ofkP9z/1KJUXFHEiriaXBQ3EImZfxpHfths= X-Gm-Gg: AeBDieuEbAg2ok6niouqXtq7TlboqagBhfsLGGqM5A5ep02ifehhJYef0Qh68fFDKbG 1UlHscLwFLKPwVkMnJpbLn7H3gbEfnWcORE4IhJVc3AIlYa8DqpyfRRR0DrC/ucBOA3cXhZqo7D 9l/oNxILpNSxWB78O+SjaJZtkuJ9lvBydFEoZcWKHUemINV5ADfT6CzTGnVHjXXgww/NCprP4U3 Al+fGa3vWpH0gDUp2UbxhDU7D9buJ5xbB0gKgT6hVc+b6+Ziz54eVEbMTnjVoAWNX1JbW7vLrc7 xRXz5KOcWmomPYuXPNWbCDdBo26NuBfJ5oCsEgap1TrqZfFlXk5g9dxMWoXcOANMgMvrHyACbW7 hNeBdYd/k/HEiJbRVM7F6bpryqtuYQNMGkP35CxG6L7ZbsAJmoXUFArKSpdwsE5tSTUFY2DyY X-Received: by 2002:a17:902:ebcd:b0:2b4:5d87:a1fd with SMTP id d9443c01a7336-2b9f25f7302mr103679065ad.27.1777916588491; Mon, 04 May 2026 10:43:08 -0700 (PDT) X-Received: by 2002:a17:902:ebcd:b0:2b4:5d87:a1fd with SMTP id d9443c01a7336-2b9f25f7302mr103678735ad.27.1777916587943; Mon, 04 May 2026 10:43:07 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon , Stefan Berger Subject: [PATCH v6 3/6] hw/tpm: Add internal buffer state for chunking Date: Mon, 4 May 2026 23:12:31 +0530 Message-ID: <20260504174234.13556-4-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916700558158500 From: Arun Menon - Introduce GByteArray buffers to hold the command request and response data during chunked TPM CRB transactions. - Add helper function to clean them. Signed-off-by: Arun Menon Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Stefan Berger --- hw/tpm/tpm_crb.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index a0f472652e..1c944d7ef2 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -38,10 +38,13 @@ struct CRBState { TPMBackend *tpmbe; TPMBackendCmd cmd; uint32_t regs[TPM_CRB_R_MAX]; + size_t be_buffer_size; MemoryRegion mmio; MemoryRegion cmdmem; =20 - size_t be_buffer_size; + GByteArray *command_buffer; + GByteArray *response_buffer; + uint32_t response_offset; =20 TPMPPI ppi; =20 @@ -86,6 +89,13 @@ enum crb_cancel { =20 #define TPM_CRB_NO_LOCALITY 0xff =20 +static void tpm_crb_clear_internal_buffers(CRBState *s) +{ + g_byte_array_set_size(s->response_buffer, 0); + g_byte_array_set_size(s->command_buffer, 0); + s->response_offset =3D 0; +} + static uint64_t tpm_crb_mmio_read(void *opaque, hwaddr addr, unsigned size) { @@ -135,9 +145,11 @@ static void tpm_crb_mmio_write(void *opaque, hwaddr ad= dr, } break; case A_CRB_CTRL_CANCEL: - if (val =3D=3D CRB_CANCEL_INVOKE && - s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE) { - tpm_backend_cancel_cmd(s->tpmbe); + if (val =3D=3D CRB_CANCEL_INVOKE) { + if (s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE) { + tpm_backend_cancel_cmd(s->tpmbe); + } + tpm_crb_clear_internal_buffers(s); } break; case A_CRB_CTRL_START: @@ -239,6 +251,7 @@ static void tpm_crb_reset(void *dev) =20 tpm_ppi_reset(&s->ppi); tpm_backend_reset(s->tpmbe); + tpm_crb_clear_internal_buffers(s); =20 memset(s->regs, 0, sizeof(s->regs)); =20 @@ -305,6 +318,9 @@ static void tpm_crb_realize(DeviceState *dev, Error **e= rrp) memory_region_add_subregion(get_system_memory(), TPM_CRB_ADDR_BASE + sizeof(s->regs), &s->cmdmem); =20 + s->command_buffer =3D g_byte_array_new(); + s->response_buffer =3D g_byte_array_new(); + tpm_ppi_init(&s->ppi, get_system_memory(), TPM_PPI_ADDR_BASE, OBJECT(s)); =20 @@ -315,12 +331,21 @@ static void tpm_crb_realize(DeviceState *dev, Error *= *errp) } } =20 +static void tpm_crb_unrealize(DeviceState *dev) +{ + CRBState *s =3D CRB(dev); + + g_clear_pointer(&s->command_buffer, g_byte_array_unref); + g_clear_pointer(&s->response_buffer, g_byte_array_unref); +} + static void tpm_crb_class_init(ObjectClass *klass, const void *data) { DeviceClass *dc =3D DEVICE_CLASS(klass); TPMIfClass *tc =3D TPM_IF_CLASS(klass); =20 dc->realize =3D tpm_crb_realize; + dc->unrealize =3D tpm_crb_unrealize; device_class_set_props(dc, tpm_crb_properties); dc->vmsd =3D &vmstate_tpm_crb; dc->user_creatable =3D true; --=20 2.54.0 From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916672; cv=none; d=zohomail.com; s=zohoarc; b=bLOcKH9RP6qYxOucyr1gGTvUjmuLd+1epvJWTOievHKEwdfSDjRmhq/mBtHfwlO0DW+MKa0NBViE/gOPxKsNSvzoLfOeIEgAWp4Fq7nSDQ6KKL0QWK7SZELGk39KVsQyfBchEPreCexi1+ijoNAZAnjlpuTvozrXps894p9jxOA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916672; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=POg2kcrHtD7IxbfH3c9M90/eSffzpD9OEInNvAEthqM=; b=WWk7XYa5p46IbfwlkSfauoGK/Mf9mmiUSmttVO1P4v8/AkqdtjFqRFX+A3q1mhVA4zQSFVc33J5B3HFN6ff51EjYWmJG4R6y5XfTAlLRI4DmMUOFhpuPLlgkA61MpJb6YIDZDb04maj3XPEX280JSs69RM9/00neSJS5y//OEEI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 177791667266138.083868638995796; Mon, 4 May 2026 10:44:32 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxKM-00085c-AC; Mon, 04 May 2026 13:43:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKE-00084A-RB for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:25 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKB-0007li-IK for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:22 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-205-8AQjMHVdO1SUoOHzu2jc6Q-1; Mon, 04 May 2026 13:43:17 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2b249975139so83761965ad.0 for ; Mon, 04 May 2026 10:43:17 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.43.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:43:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916598; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=POg2kcrHtD7IxbfH3c9M90/eSffzpD9OEInNvAEthqM=; b=bgnLT85ADa2e8jlf7VST9LnxIZaHbdMm1KQqrBFeIy/DgubaU+pmfloRJi5ZZ7mmCeCMVQ wQ2CFHVwPzOvzqS4Qxpu/y7YwdaKLk5lBKcAQEVcfuibxECCJJLduB8LAM+F1MjwiCFsoA jsuHsQS0pn2CX2tzJtn4D/DP+k/OoaA= X-MC-Unique: 8AQjMHVdO1SUoOHzu2jc6Q-1 X-Mimecast-MFC-AGG-ID: 8AQjMHVdO1SUoOHzu2jc6Q_1777916596 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916596; x=1778521396; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=POg2kcrHtD7IxbfH3c9M90/eSffzpD9OEInNvAEthqM=; b=ls/hj5dKfUuiUDArttv1mH6UAsuCXCBnXe+VktZCv9VQoVn+KQ/3cSCsObeyb5Tgqz LUIRdxsxl7ZCiJYyB6uEG1MC3UoNWJRgaNOuDfoHa2sdvJOCMn5iuJkjVgdasSnv70AT MunUjE1n6jNMjT7eGxMClMmz5c35gOMdfhqzEggxXRdjhRucoGMR8YGrEmT8cyx0apvI 3bAVqFkEkF14Tc9CvofcK4FuGJcH8v+HfidlmZ9NLEl/5aIeaQsuv+JD33JTU9gsg+Rx 5lmiG7gu7ww78mJ+eugjTCkkcfkzIWvzwNt3+CDlOE8rgVwbxp33QZjQqDgTbYxxFe5C 45Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916596; x=1778521396; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=POg2kcrHtD7IxbfH3c9M90/eSffzpD9OEInNvAEthqM=; b=daVuFd9EYmE18A5ZejKnb0OpMcaVPXWJqVKImBMUh9rhsisMvEXc5pYMiEVYt2qWeA 2FrrS2CLmcpdBYS06aZvnoHWwuzoRqQr8/6ksru4qczDk+HCG8scDrOuGNTQPHHKNQBL 46lH+FzMcyv+Ovz4m8YLupwifeCyKAw1QrltDCgWyxdCcuW3sdr+qzFitjzm75suHlcj MKngtasG2gQaFIO4ETmXaPtEpXGUitmP5/4y3FqM8DYbFn2SOmNTrRc7lkHxVdNw9pBJ bZfKAstlU5bjSRRu29NlK6MBaSAaFPfl/Y1a48r4NqNKKT2pdfm4ApNHL5l3Zd3Y119r jw/Q== X-Gm-Message-State: AOJu0YzBP/X4KbVNQpA6CtEukdLv0aCb9+kTOBSq68/yDkdqoAvsQCVa R/ED1308yEeU4hQEk8lgXbY+PFYLEr5ODy2oqNFWWSfMEL50gKJPT9zt0EkBchmYgKiBbRvo8XD Ap1ZpbLWtne2UO+oM6DasBwN4v/uIPFC0jtSfUoXo4J7QpkdjfPnf4qTVLvbgCvQ64leHxF3vWV N/vFY4+2GImHBO+k5R0CPvbeWN72SYiLbaCcYmLrU= X-Gm-Gg: AeBDiet5iNh+16vGc1226YEbrJAXjXThMXUhVM6FVf4KaU834ilMc2SyTUx81HXMpaS GmhXlJhYETMFtorR50t8dOAUqqc1FXAlGq3fXCkjYTtococ7db413l3Kd/ef/0jvuQFY4EPkr7k Nuju4XafNhbruG2X3blkhXoUTAd1YNmKMskhlCy7LDFRXAeB4qtdgarWvN54UCQNbiGneVRcFy7 rCiN/V+qgD6pJcJGL2q8BuvU0m3iOmDD5x0zOnsQ5bRmIrx1k5oMvfpLtBzOL6IRxlJubsPNCKs tJ3EyZPfqXpSe5i1oZGd7s5q/0FKLTKdpVD/puyBT2lk8w2GL4jQKyfiB+w6n2BiSdU1pz/4Ega zVtpk4OpmNbVYhPkMm+qlxBo9JtZ3xz+YvaTvDzMwxKKP+X9M5PHZhvtJNGMLxMgDpTDlh60s X-Received: by 2002:a17:903:1acd:b0:2b2:501c:bc0 with SMTP id d9443c01a7336-2b9f2533e8emr99468495ad.7.1777916595717; Mon, 04 May 2026 10:43:15 -0700 (PDT) X-Received: by 2002:a17:903:1acd:b0:2b2:501c:bc0 with SMTP id d9443c01a7336-2b9f2533e8emr99468125ad.7.1777916595043; Mon, 04 May 2026 10:43:15 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon , Stefan Berger Subject: [PATCH v6 4/6] hw/tpm: Implement TPM CRB chunking logic Date: Mon, 4 May 2026 23:12:32 +0530 Message-ID: <20260504174234.13556-5-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916674526158500 From: Arun Menon - Add logic to populate internal TPM command request and response buffers and to toggle the control registers after each operation. - The chunk size is limited to CRB_CTRL_CMD_SIZE which is (TPM_CRB_ADDR_SIZE - A_CRB_DATA_BUFFER). This comes out as 3968 bytes (4096 - 128 or 0x1000 - 0x80), because 128 bytes are reserved for control and status registers. In other words, only 3968 bytes are available for the TPM data. - With this feature, guests can send commands larger than 3968 bytes. - Refer section 6.5.3.9 of [1] for implementation details. [1] https://trustedcomputinggroup.org/wp-content/uploads/PC-Client-Specific= -Platform-TPM-Profile-for-TPM-2p0-v1p07_Pub.pdf Signed-off-by: Arun Menon Reviewed-by: Stefan Berger Reviewed-by: Marc-Andr=C3=A9 Lureau --- hw/tpm/tpm_crb.c | 154 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 137 insertions(+), 17 deletions(-) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 1c944d7ef2..5572d89268 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -17,6 +17,7 @@ #include "qemu/osdep.h" =20 #include "qemu/module.h" +#include "qemu/error-report.h" #include "qapi/error.h" #include "system/address-spaces.h" #include "hw/core/qdev-properties.h" @@ -66,6 +67,7 @@ DECLARE_INSTANCE_CHECKER(CRBState, CRB, #define CRB_INTF_CAP_CRB_CHUNK 0b1 =20 #define CRB_CTRL_CMD_SIZE (TPM_CRB_ADDR_SIZE - A_CRB_DATA_BUFFER) +#define TPM_HEADER_SIZE 10 =20 enum crb_loc_ctrl { CRB_LOC_CTRL_REQUEST_ACCESS =3D BIT(0), @@ -81,6 +83,8 @@ enum crb_ctrl_req { =20 enum crb_start { CRB_START_INVOKE =3D BIT(0), + CRB_START_RSP_RETRY =3D BIT(1), + CRB_START_NEXT_CHUNK =3D BIT(2), }; =20 enum crb_cancel { @@ -123,6 +127,69 @@ static uint8_t tpm_crb_get_active_locty(CRBState *s) return ARRAY_FIELD_EX32(s->regs, CRB_LOC_STATE, activeLocality); } =20 +static bool tpm_crb_append_command_request(CRBState *s) +{ + /* + * The linux guest writes the TPM command to the MMIO region in chunks. + * This function appends a chunk from the MMIO region to internal + * command_buffer. + */ + void *mem =3D memory_region_get_ram_ptr(&s->cmdmem); + uint32_t to_copy =3D 0; + uint32_t total_request_size =3D 0; + + /* + * The initial call extracts the total TPM command size + * from its header. For the subsequent calls, the data already + * appended in the command_buffer is used to calculate the total + * size, as its header stays the same. + */ + if (s->command_buffer->len =3D=3D 0) { + total_request_size =3D tpm_cmd_get_size(mem); + if (total_request_size < TPM_HEADER_SIZE) { + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_STS, tpmSts, 1); + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, Start, 0); + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, nextChunk, 0); + tpm_crb_clear_internal_buffers(s); + error_report("Command size %" PRIu32 " less than " + "TPM header size %" PRIu32, + total_request_size, (uint32_t)TPM_HEADER_SIZE); + return false; + } + } else { + total_request_size =3D tpm_cmd_get_size(s->command_buffer->data); + } + total_request_size =3D MIN(total_request_size, s->be_buffer_size); + + if (total_request_size > s->command_buffer->len) { + uint32_t remaining =3D total_request_size - s->command_buffer->len; + to_copy =3D MIN(remaining, CRB_CTRL_CMD_SIZE); + g_byte_array_append(s->command_buffer, (guint8 *)mem, to_copy); + } + return true; +} + +static void tpm_crb_fill_command_response(CRBState *s) +{ + /* + * Response from the tpm backend will be stored in the internal + * response_buffer. This function will serve that accumulated response + * to the linux guest in chunks by writing it back to MMIO region. + */ + void *mem =3D memory_region_get_ram_ptr(&s->cmdmem); + uint32_t remaining =3D s->response_buffer->len - s->response_offset; + uint32_t to_copy =3D MIN(CRB_CTRL_CMD_SIZE, remaining); + + memcpy(mem, s->response_buffer->data + s->response_offset, to_copy); + + if (to_copy < CRB_CTRL_CMD_SIZE) { + memset((guint8 *)mem + to_copy, 0, CRB_CTRL_CMD_SIZE - to_copy); + } + + s->response_offset +=3D to_copy; + memory_region_set_dirty(&s->cmdmem, 0, CRB_CTRL_CMD_SIZE); +} + static void tpm_crb_mmio_write(void *opaque, hwaddr addr, uint64_t val, unsigned size) { @@ -153,20 +220,61 @@ static void tpm_crb_mmio_write(void *opaque, hwaddr a= ddr, } break; case A_CRB_CTRL_START: - if (val =3D=3D CRB_START_INVOKE && - !(s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE) && - tpm_crb_get_active_locty(s) =3D=3D locty) { - void *mem =3D memory_region_get_ram_ptr(&s->cmdmem); - - ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, Start, 1); - s->cmd =3D (TPMBackendCmd) { - .in =3D mem, - .in_len =3D MIN(tpm_cmd_get_size(mem), s->be_buffer_size), - .out =3D mem, - .out_len =3D s->be_buffer_size, - }; - - tpm_backend_deliver_request(s->tpmbe, &s->cmd); + if (tpm_crb_get_active_locty(s) !=3D locty) { + break; + } + if (s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE) { + /* + * Backend TPM is busy processing a request. + */ + break; + } + if (val & CRB_START_INVOKE) { + if (!(s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE)) { + if (!tpm_crb_append_command_request(s)) { + break; + } + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, Start, 1); + g_byte_array_set_size(s->response_buffer, s->be_buffer_siz= e); + s->cmd =3D (TPMBackendCmd) { + .in =3D s->command_buffer->data, + .in_len =3D s->command_buffer->len, + .out =3D s->response_buffer->data, + .out_len =3D s->response_buffer->len, + }; + tpm_backend_deliver_request(s->tpmbe, &s->cmd); + } + } else if (val & CRB_START_NEXT_CHUNK) { + if (!s->cap_chunk) { + break; + } + /* + * nextChunk is used both while sending and receiving data. + * To distinguish between the two, response_buffer is checked. + * If it does not have data, then that means we have not yet + * sent the command to the tpm backend, and therefore call + * tpm_crb_append_command_request(). + */ + if (s->response_buffer->len > 0 && + s->response_offset < s->response_buffer->len) { + tpm_crb_fill_command_response(s); + } else { + if (!tpm_crb_append_command_request(s)) { + break; + } + } + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, nextChunk, 0); + } else if (val & CRB_START_RSP_RETRY) { + if (!s->cap_chunk) { + break; + } + if (s->response_buffer->len > 0) { + trace_tpm_crb_mmio_write(addr, size, val); + s->response_offset =3D 0; + tpm_crb_fill_command_response(s); + } + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, crbRspRetry, 0); + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, nextChunk, 0); } break; case A_CRB_LOC_CTRL: @@ -211,8 +319,21 @@ static void tpm_crb_request_completed(TPMIf *ti, int r= et) if (ret !=3D 0) { ARRAY_FIELD_DP32(s->regs, CRB_CTRL_STS, tpmSts, 1); /* fatal error */ + tpm_crb_clear_internal_buffers(s); + } else { + uint32_t actual_resp_size =3D tpm_cmd_get_size(s->response_buffer-= >data); + uint32_t total_resp_size =3D MIN(actual_resp_size, s->be_buffer_si= ze); + g_byte_array_set_size(s->response_buffer, total_resp_size); + s->response_offset =3D 0; } - memory_region_set_dirty(&s->cmdmem, 0, CRB_CTRL_CMD_SIZE); + /* + * Send the first chunk. Subsequent chunks will be sent + * on receiving nextChunk from the guest + */ + tpm_crb_fill_command_response(s); + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, nextChunk, 0); + ARRAY_FIELD_DP32(s->regs, CRB_CTRL_START, crbRspRetry, 0); + g_byte_array_set_size(s->command_buffer, 0); } =20 static enum TPMVersion tpm_crb_get_version(TPMIf *ti) @@ -287,8 +408,7 @@ static void tpm_crb_reset(void *dev) s->regs[R_CRB_CTRL_RSP_SIZE] =3D CRB_CTRL_CMD_SIZE; s->regs[R_CRB_CTRL_RSP_ADDR] =3D TPM_CRB_ADDR_BASE + A_CRB_DATA_BUFFER; =20 - s->be_buffer_size =3D MIN(tpm_backend_get_buffer_size(s->tpmbe), - CRB_CTRL_CMD_SIZE); + s->be_buffer_size =3D tpm_backend_get_buffer_size(s->tpmbe); =20 if (tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size) < 0) { exit(1); --=20 2.54.0 From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916684; cv=none; d=zohomail.com; s=zohoarc; b=dfiKcYCJDcsaA2sJtUcfs2IJ0v9sdjTjAs7i05hNgvRkvCOiJCO32IzSKrlwmzZ2tD+NMFQsO/j0uiONXPcJGhixxox5jPr5hPGNdIncBHl81WhDd9EQGfgb2eZnzIveuwvdWVPVV4gxuwLBirquWd5ZKJdND2AvD+92sv8tpAo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916684; h=Content-Type:Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=PErGi0I1XqID5q8HKlQNmc+sGgy3pO+HdWtIS8h3lWI=; b=cgbZp0db7gfDigFOevGTJEy9J2nvejbcF9UgK9cgmf8QCVYtSsJ/dFI5QxJru8M/ngurTBDeCEiHGsnYh/27iR36CQ/CxfhI6TZG2fyfNouEhrt3GNVbV31/t/XNOSch2u/KlLUBp2fae9GUOVG22ia0/Y1tDXZDF9rjJb5xKBQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777916684599700.3493579340953; Mon, 4 May 2026 10:44:44 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxKd-0008Lr-T6; Mon, 04 May 2026 13:43:47 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKU-00087j-M7 for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:39 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKQ-0007ot-8V for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:38 -0400 Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-54-DDuokzivOfGtSK5R1yh6zw-1; Mon, 04 May 2026 13:43:28 -0400 Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2b2e91add2aso42490605ad.1 for ; Mon, 04 May 2026 10:43:27 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.43.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:43:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916610; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PErGi0I1XqID5q8HKlQNmc+sGgy3pO+HdWtIS8h3lWI=; b=ezuC/3LeGKesT2iiZzjrnlPl0OTVf+0c5SSQBb5vFznKGYrULCoowzIGewmSE/UcHVyV2V w8TsqFP4cxuXZkyPx3mrEpTNtMX2Cts6ZO20Q6XMx9VbbUxaukvN5Q4qf7LbTLqe4Wtzlx GBIgDDMqNiAYhP8ORFp7uZmbzx+Haq4= X-MC-Unique: DDuokzivOfGtSK5R1yh6zw-1 X-Mimecast-MFC-AGG-ID: DDuokzivOfGtSK5R1yh6zw_1777916607 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916607; x=1778521407; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=PErGi0I1XqID5q8HKlQNmc+sGgy3pO+HdWtIS8h3lWI=; b=WphLqcBAAcVvq0pR/KAME6KJf5BrdgNTprgyJwTZmFcl2s3avNPrkykGhWuIwCzA6M ZS2qJcXdcZIyaW+xGDxDZTK+Z21FcihRITI9Dzfgi/4YVCLWul7KeCBlNhxfL+mKJlZK zLrVDkTebAuyyOpv9hy/x2p0YnwLpWsi3DAAtd5ixBOLsz5NO5CHfgsq9LSfdn0zmmiX sK/GRpChgmEDxPXkGrk9f4aXDYWzuLY7r5+obMae8qmrbbhmYqbPXqoMjD4d4rKlUl+f 99RU/vCCA5l79kE+Z392Iom4uJKUR2ha3RThJRYIUi8yVfZwjHsDZ6H0PkpebxL6IcCI KDfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916607; x=1778521407; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=PErGi0I1XqID5q8HKlQNmc+sGgy3pO+HdWtIS8h3lWI=; b=bZyX4EJM4tY2N9cJqcs6opXmTtmt7wa5QDnzYnTYH+yY0ryTHGb/Kac+q3qToN7851 tS5p1cpqEK6Vgapa80Dz3ZzMpj8vyMldj/7OtCJrf2GIg7ZgfG5uHKTq/M+CTGm/PQbz 7Q8QdzgY4Ut5uFziJWelupB9nCYsSlqCTB9ZvnkLZooaekLdDg/s9IwZKGSj9/sEo2NJ zb5DE0QH9W8MJmsxKiK7TgUyaSbS/OuYG1IT8UG4utV9FgDZgo8R1amVgobvexYFhL3S tOLmzgwn+FeSrA/t2KRJy5Iij6e3s3E/6uzYzf3mY79q4OXF5AUVWP5di+rjt8TV6xAH VLNg== X-Gm-Message-State: AOJu0Yy3SematAxObBjwesVjIs89JvskbmgPKRbh7d5vFbjJiYcjXFLs KNbuiOW8IDcxOllVL7sNQFHrR/eN37YI8dRbyO6LWrVzouNadW1O1bKikRJwifnuatAO2PO46Q1 Ju02ziRP8Ve9R5cQJ9UecSPFEUp9aUAfh9jhbZrMMb4vbCoOCBa6XD6+GDT3GM6TZ53hSndv4AK 1WGkmBc7w4crygPXQwlkihmDH5ECeBcOGtJ4SG0gg= X-Gm-Gg: AeBDies3MI8DD8i7W6H8RHM7mP984Ssktc7+tbUmeweoU7f7u5MZnYM+fH5Zxp4UcW6 0NWIyc59je2gPwIlkxsUHSfXrsJagLpAXoIeV9+sfVYtkbWxeggwB6pSheKi24TQRsAQ+9FW/89 RxgE4JNTqay7sBuJ+9Jp6I+a3q02lUEInHN0TjNRom0bxbEIi1bsrYyL0ksxwgfP0eMrUBvGSMq 6gt59hN5grNC/5ao2l/nhK93cyC9NLz10T1SqczgsKs7rMBgWuKdPZo46nfmJLwfuQBYcrlfuT0 s/9JpHv+Hm9nVKxWP1XEpTmOOK3zQRDrT7XVqRSe8tyshHrEl63h4rjotgyTVJ+mM+hjWmNb6HE +zox4KiMWbOX6DJb9tvYW6vIfN+Yp4d3hhhPjol5KgmeEhRCQUPhyIukY5or72zwptkxBnG/c X-Received: by 2002:a17:902:f087:b0:2b2:ebed:7af8 with SMTP id d9443c01a7336-2b9f252f63amr74489215ad.1.1777916606397; Mon, 04 May 2026 10:43:26 -0700 (PDT) X-Received: by 2002:a17:902:f087:b0:2b2:ebed:7af8 with SMTP id d9443c01a7336-2b9f252f63amr74488855ad.1.1777916605796; Mon, 04 May 2026 10:43:25 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon , Stefan Berger Subject: [PATCH v6 5/6] test/qtest: Add test for tpm crb chunking Date: Mon, 4 May 2026 23:12:33 +0530 Message-ID: <20260504174234.13556-6-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.133.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H5=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916685749154100 From: Arun Menon - New test case added to the swtpm test. Data is written and read from the buffer in chunks. - The chunk size is dynamically calculated by reading the CRB_CTRL_CMD_SIZE address. This can be changed manually to test. - Add a helper function tpm_wait_till_bit_clear() - Note that this commit does not yet exercise the chunked read/write logic, as current transfer sizes remain small. Testing for large transfers is introduced in a subsequent patch: 'tests: Use ML-DSA-87 operations to cause large TPM transfers with CRB' Signed-off-by: Arun Menon Reviewed-by: Marc-Andr=C3=A9 Lureau Reviewed-by: Stefan Berger --- tests/qtest/tpm-crb-swtpm-test.c | 10 +++ tests/qtest/tpm-util.c | 110 ++++++++++++++++++++++++++----- tests/qtest/tpm-util.h | 5 ++ 3 files changed, 110 insertions(+), 15 deletions(-) diff --git a/tests/qtest/tpm-crb-swtpm-test.c b/tests/qtest/tpm-crb-swtpm-t= est.c index ffeb1c396b..050c7b0c1f 100644 --- a/tests/qtest/tpm-crb-swtpm-test.c +++ b/tests/qtest/tpm-crb-swtpm-test.c @@ -33,6 +33,14 @@ static void tpm_crb_swtpm_test(const void *data) "tpm-crb", NULL); } =20 +static void tpm_crb_chunk_swtpm_test(const void *data) +{ + const TestState *ts =3D data; + + tpm_test_swtpm_test(ts->src_tpm_path, tpm_util_crb_chunk_transfer, + "tpm-crb", NULL); +} + static void tpm_crb_swtpm_migration_test(const void *data) { const TestState *ts =3D data; @@ -54,6 +62,8 @@ int main(int argc, char **argv) g_test_init(&argc, &argv, NULL); =20 qtest_add_data_func("/tpm/crb-swtpm/test", &ts, tpm_crb_swtpm_test); + qtest_add_data_func("/tpm/crb-chunk-swtpm/test", &ts, + tpm_crb_chunk_swtpm_test); qtest_add_data_func("/tpm/crb-swtpm-migration/test", &ts, tpm_crb_swtpm_migration_test); ret =3D g_test_run(); diff --git a/tests/qtest/tpm-util.c b/tests/qtest/tpm-util.c index 2cb2dd4796..744592763f 100644 --- a/tests/qtest/tpm-util.c +++ b/tests/qtest/tpm-util.c @@ -14,16 +14,44 @@ =20 #include "qemu/osdep.h" #include +#include "qemu/bswap.h" =20 #include "hw/acpi/tpm.h" #include "libqtest.h" #include "tpm-util.h" #include "qobject/qdict.h" =20 +#define CRB_ADDR_START (TPM_CRB_ADDR_BASE + A_CRB_CTRL_START) +#define CRB_ADDR_CTRL_STS (TPM_CRB_ADDR_BASE + A_CRB_CTRL_STS) +#define CRB_ADDR_CTRL_CMD_SIZE \ + (TPM_CRB_ADDR_BASE + A_CRB_CTRL_CMD_SIZE) + +#define CRB_START_INVOKE (1 << 0) +#define CRB_START_RSP_RETRY (1 << 1) +#define CRB_START_NEXT_CHUNK (1 << 2) + +void tpm_wait_till_bit_clear(QTestState *s, uint64_t addr, uint32_t mask) +{ + uint32_t sts; + uint64_t end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; + + while (true) { + sts =3D qtest_readl(s, addr); + if ((sts & mask) =3D=3D 0) { + break; + } + if (g_get_monotonic_time() >=3D end_time) { + g_assert_cmphex(sts & mask, =3D=3D, 0); + break; + } + } +} + void tpm_util_crb_transfer(QTestState *s, const unsigned char *req, size_t req_size, unsigned char *rsp, size_t rsp_size) { + uint32_t tpm_sts; uint64_t caddr =3D qtest_readq(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_CMD_L= ADDR); uint64_t raddr =3D qtest_readq(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_RSP_A= DDR); =20 @@ -31,24 +59,76 @@ void tpm_util_crb_transfer(QTestState *s, =20 qtest_memwrite(s, caddr, req, req_size); =20 - uint32_t sts, start =3D 1; - uint64_t end_time =3D g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND; - qtest_writel(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_START, start); - while (true) { - start =3D qtest_readl(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_START); - if ((start & 1) =3D=3D 0) { - break; + qtest_writel(s, CRB_ADDR_START, CRB_START_INVOKE); + tpm_wait_till_bit_clear(s, CRB_ADDR_START, CRB_START_INVOKE); + + tpm_sts =3D qtest_readl(s, CRB_ADDR_CTRL_STS); + g_assert_cmpint(tpm_sts & 1, =3D=3D, 0); + + qtest_memread(s, raddr, rsp, rsp_size); +} + +void tpm_util_crb_chunk_transfer(QTestState *s, + const unsigned char *req, size_t req_size, + unsigned char *rsp, size_t rsp_size) +{ + uint32_t tpm_sts; + size_t chunk_size; + + uint64_t caddr =3D qtest_readq(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_CMD_L= ADDR); + uint64_t raddr =3D qtest_readq(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_RSP_A= DDR); + uint32_t crb_ctrl_cmd_size =3D qtest_readl(s, CRB_ADDR_CTRL_CMD_SIZE); + + chunk_size =3D crb_ctrl_cmd_size; + + qtest_writeb(s, TPM_CRB_ADDR_BASE + A_CRB_LOC_CTRL, 1); + + for (size_t i =3D 0; i < req_size; i +=3D chunk_size) { + bool last_chunk =3D false; + size_t current_chunk_size =3D chunk_size; + + if (i + chunk_size > req_size) { + last_chunk =3D true; + current_chunk_size =3D req_size - i; } - if (g_get_monotonic_time() >=3D end_time) { - break; + + qtest_memwrite(s, caddr, req + i, current_chunk_size); + + if (last_chunk) { + qtest_writel(s, CRB_ADDR_START, CRB_START_INVOKE); + tpm_wait_till_bit_clear(s, CRB_ADDR_START, CRB_START_INVOKE); + } else { + qtest_writel(s, CRB_ADDR_START, CRB_START_NEXT_CHUNK); + tpm_wait_till_bit_clear(s, CRB_ADDR_START, CRB_START_NEXT_CHUN= K); } - }; - start =3D qtest_readl(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_START); - g_assert_cmpint(start & 1, =3D=3D, 0); - sts =3D qtest_readl(s, TPM_CRB_ADDR_BASE + A_CRB_CTRL_STS); - g_assert_cmpint(sts & 1, =3D=3D, 0); + } + tpm_sts =3D qtest_readl(s, CRB_ADDR_CTRL_STS); + g_assert_cmpint(tpm_sts & 1, =3D=3D, 0); =20 - qtest_memread(s, raddr, rsp, rsp_size); + /* + * Read response in chunks + */ + + unsigned char header[10]; + uint32_t actual_response_size =3D 0; + + qtest_memread(s, raddr, header, sizeof(header)); + actual_response_size =3D ldl_be_p(&header[2]); + + if (actual_response_size > rsp_size) { + actual_response_size =3D rsp_size; + } + + for (size_t i =3D 0; i < actual_response_size; i +=3D chunk_size) { + size_t to_read =3D i + chunk_size > actual_response_size + ? actual_response_size - i + : chunk_size; + if (i > 0) { + qtest_writel(s, CRB_ADDR_START, CRB_START_NEXT_CHUNK); + tpm_wait_till_bit_clear(s, CRB_ADDR_START, CRB_START_NEXT_CHUN= K); + } + qtest_memread(s, raddr, rsp + i, to_read); + } } =20 void tpm_util_startup(QTestState *s, tx_func *tx) diff --git a/tests/qtest/tpm-util.h b/tests/qtest/tpm-util.h index 0cb28dd6e5..681544e7d8 100644 --- a/tests/qtest/tpm-util.h +++ b/tests/qtest/tpm-util.h @@ -24,10 +24,15 @@ typedef void (tx_func)(QTestState *s, const unsigned char *req, size_t req_size, unsigned char *rsp, size_t rsp_size); =20 +void tpm_wait_till_bit_clear(QTestState *s, uint64_t addr, uint32_t mask); void tpm_util_crb_transfer(QTestState *s, const unsigned char *req, size_t req_size, unsigned char *rsp, size_t rsp_size); =20 +void tpm_util_crb_chunk_transfer(QTestState *s, + const unsigned char *req, size_t req_size, + unsigned char *rsp, size_t rsp_size); + void tpm_util_startup(QTestState *s, tx_func *tx); void tpm_util_pcrextend(QTestState *s, tx_func *tx); void tpm_util_pcrread(QTestState *s, tx_func *tx, --=20 2.54.0 From nobody Mon May 25 06:57:11 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=quarantine dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1777916649; cv=none; d=zohomail.com; s=zohoarc; b=UOLxNtR2csnbruUo+JfrT4egOU2mHmDHevMhFPWaSk1lYUCDzLJKlwVL+NQBbc0qlAwUcSc6yVBjzSd6dZYAEzOK4ttJc80R0s9SwQU29d6vhIq6k+Nba2DzSA5JgoW7b5O6D01QRCH5p4s1CuOmqVaHD1mDI5UvBbPsgOYiSTg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1777916649; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=WucsC/EyLEgEjhfoh4v+bCxHQS+l16Kx9Qrfs9o+zOA=; b=HmUZZBb46UtJ2ckOqMiK0H6c1gGd3aymOrHb3/rGVTz1msi41/EooVFQx/DqgEXmoRtmCaUUH3fuliY4u3H9T7A/wdVy4KLaXVMwRof5fd0LyfJhUNMBBNTiR/bejYjBNiVNDzxQ4wgXr2sr+QG3e617a5OqUU+/8TgCFs2pZBg= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=quarantine dis=none) Return-Path: Received: from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1777916649765414.71899366862294; Mon, 4 May 2026 10:44:09 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wJxKe-0008Pp-Jm; Mon, 04 May 2026 13:43:48 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKX-00087w-0A for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:42 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1wJxKS-0007pe-Fs for qemu-devel@nongnu.org; Mon, 04 May 2026 13:43:39 -0400 Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-131-xPpMll69MKipIMd7OzHqlA-1; Mon, 04 May 2026 13:43:33 -0400 Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2b7c2ee830aso95109495ad.3 for ; Mon, 04 May 2026 10:43:33 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.108.92]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b9caaaec82sm112765315ad.24.2026.05.04.10.43.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 May 2026 10:43:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1777916614; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WucsC/EyLEgEjhfoh4v+bCxHQS+l16Kx9Qrfs9o+zOA=; b=RLOqfxiBEdGg4nZe9h7J7/u6ricLkTEeFswtLTmmwBsiTxnA8ERMXK7OTnV05iCe64XaOx gLFmwXFnFH7fHulcdcBEadCr0iUTKnrUYc+oXkTHVJ9SBv9ToCtcgqZ21oZB51DojiTc+J q5oy/k6yBtitqRvk0kuN5Ynt27vcIdA= X-MC-Unique: xPpMll69MKipIMd7OzHqlA-1 X-Mimecast-MFC-AGG-ID: xPpMll69MKipIMd7OzHqlA_1777916612 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1777916612; x=1778521412; darn=nongnu.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WucsC/EyLEgEjhfoh4v+bCxHQS+l16Kx9Qrfs9o+zOA=; b=BEM1YI+fGePnNubLSvzuJDeXD3ZnTN5A0wFT3V8XbNIOLyneXauDsOuXSMEkDqw/lk iaL7BOyNhbj3LMDA0RX9NCHFhky/GBf2Qhq50v9LgAsNuvfkmPj96Klq3FxGY9tC3JF9 Lfb3CrX6ZX2YzivSiKmwbEPD3ODjy4imdcCTJO4N44Fxm3qUYlQk0lqqAeBz7vo3AVas 0TlJgEprMBbbMtkVWzsiwKayUm4UiFJ7SWaDMSUhuSWwUAjpdoP1mLkf+3r5dTWUDxBA rqAJdS69djjUNy+whISfK6UC+DTZAsTDrpk+UTDeME/7KsKYCau5aiDsp8W6yc9E1b9l m97Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777916612; x=1778521412; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=WucsC/EyLEgEjhfoh4v+bCxHQS+l16Kx9Qrfs9o+zOA=; b=L0t3/7MZ03Hu0MoEHQ+y+KLxInk/ttsNPZJJjt2XK2tUyWygTKVXCyPhCMyP8+PYat UA8TGW2365aJBY9nck3E0mRAlRiKXxCYYGOn+dmIlJIQxVFJoaqFp/24qDjxIGumfMnT 6vVb5zHPanj/72nZbeRj3sAoC6V8BWHF1zF5WLzlT/DnHacknkdKd04/4pHL+XCcz1vA cO2IG8KWSi251mTo1CATZYAbhNSIXh6zjB7wztQAKrBEA+SpdeyYY+PV25+sXcq9YjCa lZ29gmt9476HdDGerrHlOoIRJr+i8D/Fvo4rWWN9PniojQg4YCKHo9y+JLPvxceeVj5t 5TLQ== X-Gm-Message-State: AOJu0YxHng9sYg65xSCKuxM1v7ysaW1Ox4JvbyNsXghl9OcmQQnHZ1N5 MiMOm+g4/TGrvafSsEezM3e6P+YZCOTDNvXW9n7gbgeaEY6ML98SeB0+ztD35Ds69i5+KHCIrPb LLS1l5aNJsx+W4azIrDlWppluhvmR7dXlPSGLeI2UzNCKLgXWb2NI91DoVxKiE/lE2EOVDZxAmM O+9lTIXKMwd3qd/NfdT02Jbz8+CveGV2lKVLIYkDY= X-Gm-Gg: AeBDietxS2twifWw1PSpI93Tw6GfWkMYFtOzR61kLSW+/0EIL+PZl4uuxZXj3o9Rps/ vez28qW+5PpXrOrRof6wZDCqeXcLJ0HrZ1AEhL35ezxs1pXbUVDD7Xm4cBuOjh99SzirgSpJfwz XUZ+lppR9gz3OFiUVIKc9xkOWC7T39V8R+7dj/YHLYb2dCpZiWpyKYvgzGIe71w+zgE7sTjE6O4 VuqFQKLYwvQo4HPQHxTWRmV3TpmKipoaaJ1yc2sDqBjbJcBrTcnsLKESl1JRnJeFMAr8A558GKp 91Yfaoa/sesvjdxV/IhmBh3g73OD2DWAlIFec77tY+8TbTpH7eSzKG+0JhmKp0eSODqD9dVkgGN ttoHZffabSgP0NYD9Wwta8EWyOteqbAsxevLKPvRxxgHVnhhCe3msX44zWKuh6ATDud2F6LLZ X-Received: by 2002:a17:903:1984:b0:2b2:ec46:dfd4 with SMTP id d9443c01a7336-2b9f25df2fcmr110953395ad.22.1777916612019; Mon, 04 May 2026 10:43:32 -0700 (PDT) X-Received: by 2002:a17:903:1984:b0:2b2:ec46:dfd4 with SMTP id d9443c01a7336-2b9f25df2fcmr110952985ad.22.1777916611408; Mon, 04 May 2026 10:43:31 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Ani Sinha , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Marcel Apfelbaum , marcandre.lureau@redhat.com, Zhao Liu , Igor Mammedov , "Michael S. Tsirkin" , Yanan Wang , Stefan Berger , Paolo Bonzini , Fabiano Rosas , Laurent Vivier , Arun Menon Subject: [PATCH v6 6/6] hw/tpm: Add support for VM migration with TPM CRB chunking Date: Mon, 4 May 2026 23:12:34 +0530 Message-ID: <20260504174234.13556-7-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504174234.13556-1-armenon@redhat.com> References: <20260504174234.13556-1-armenon@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists1p.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=armenon@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -24 X-Spam_score: -2.5 X-Spam_bar: -- X-Spam_report: (-2.5 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.444, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: qemu development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1777916650285158500 Content-Type: text/plain; charset="utf-8" From: Arun Menon - Add subsection in VMState for TPM CRB with the newly introduced command and response buffer GByteArrays, along with a needed callback, so that newer QEMU only sends the buffers if it is necessary. - Implement a migration blocker to prevent migration of the VM if the user manually enables chunking capability, cap-chunk, but the machine type does not support it, using a new hw_compat property called allow_chunk_migration. - Add a post_load_errp hook so that during a migration, the buffers are validated before destination VM is started. Signed-off-by: Arun Menon Reviewed-by: Stefan Berger --- hw/core/machine.c | 1 + hw/tpm/tpm_crb.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/hw/core/machine.c b/hw/core/machine.c index 4e0a93e231..30464b21ac 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -41,6 +41,7 @@ =20 GlobalProperty hw_compat_11_0[] =3D { { "tpm-crb", "cap-chunk", "off" }, + { "tpm-crb", "x-allow-chunk-migration", "off" }, }; const size_t hw_compat_11_0_len =3D G_N_ELEMENTS(hw_compat_11_0); =20 diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 5572d89268..98feb734d5 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -24,6 +24,7 @@ #include "hw/pci/pci_ids.h" #include "hw/acpi/tpm.h" #include "migration/vmstate.h" +#include "migration/blocker.h" #include "system/tpm_backend.h" #include "system/tpm_util.h" #include "system/reset.h" @@ -50,6 +51,8 @@ struct CRBState { TPMPPI ppi; =20 bool cap_chunk; + bool allow_chunk_migration; + Error *migration_blocker; }; typedef struct CRBState CRBState; =20 @@ -352,18 +355,68 @@ static int tpm_crb_pre_save(void *opaque) return 0; } =20 +static bool tpm_crb_chunk_needed(void *opaque) +{ + CRBState *s =3D opaque; + + if (!s->allow_chunk_migration) { + return false; + } + + return ((s->command_buffer && s->command_buffer->len > 0) || + (s->response_buffer && s->response_buffer->len > 0)); +} + +static bool tpm_crb_chunk_post_load(void *opaque, int version_id, Error **= errp) +{ + CRBState *s =3D opaque; + + /* + * The external TPM emulator (example swtpm) determines the backend + * buffer capacity (s->be_bufer_size). This check ensures that if we + * migrate from a source with a PQC-enabled emulator that supports + * larger buffers to a destination with a non-PQC emulator, the + * migrated data does not exceed the destination's capacity. + */ + if (s->response_buffer->len > s->be_buffer_size || + s->command_buffer->len > s->be_buffer_size) { + error_setg(errp, "tpm-crb: Buffer sizes exceed backend capacity"); + return false; + } + return true; +} + +static const VMStateDescription vmstate_tpm_crb_chunk =3D { + .name =3D "tpm-crb/chunk", + .version_id =3D 0, + .needed =3D tpm_crb_chunk_needed, + .post_load_errp =3D tpm_crb_chunk_post_load, + .fields =3D (const VMStateField[]) { + VMSTATE_GBYTEARRAY(command_buffer, CRBState, 0), + VMSTATE_GBYTEARRAY(response_buffer, CRBState, 0), + VMSTATE_UINT32(response_offset, CRBState), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_tpm_crb =3D { .name =3D "tpm-crb", .pre_save =3D tpm_crb_pre_save, .fields =3D (const VMStateField[]) { VMSTATE_UINT32_ARRAY(regs, CRBState, TPM_CRB_R_MAX), VMSTATE_END_OF_LIST(), + }, + .subsections =3D (const VMStateDescription * const []) { + &vmstate_tpm_crb_chunk, + NULL, } }; =20 static const Property tpm_crb_properties[] =3D { DEFINE_PROP_TPMBE("tpmdev", CRBState, tpmbe), DEFINE_PROP_BOOL("cap-chunk", CRBState, cap_chunk, true), + DEFINE_PROP_BOOL("x-allow-chunk-migration", CRBState, + allow_chunk_migration, true), }; =20 static void tpm_crb_reset(void *dev) @@ -418,6 +471,7 @@ static void tpm_crb_reset(void *dev) static void tpm_crb_realize(DeviceState *dev, Error **errp) { CRBState *s =3D CRB(dev); + int ret; =20 if (!tpm_find()) { error_setg(errp, "at most one TPM device is permitted"); @@ -427,6 +481,15 @@ static void tpm_crb_realize(DeviceState *dev, Error **= errp) error_setg(errp, "'tpmdev' property is required"); return; } + if (s->cap_chunk && !s->allow_chunk_migration) { + error_setg(&s->migration_blocker, + "The tpm-crb device does not support chunk migration wi= th " + "machine version less than 11.1"); + ret =3D migrate_add_blocker_normal(&s->migration_blocker, errp); + if (ret < 0) { + return; + } + } =20 memory_region_init_io(&s->mmio, OBJECT(s), &tpm_crb_memory_ops, s, "tpm-crb-mmio", sizeof(s->regs)); @@ -457,6 +520,11 @@ static void tpm_crb_unrealize(DeviceState *dev) =20 g_clear_pointer(&s->command_buffer, g_byte_array_unref); g_clear_pointer(&s->response_buffer, g_byte_array_unref); + + if (s->migration_blocker) { + migrate_del_blocker(&s->migration_blocker); + error_free(s->migration_blocker); + } } =20 static void tpm_crb_class_init(ObjectClass *klass, const void *data) --=20 2.54.0