From nobody Mon May 25 07:34:35 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=1778054350; cv=none; d=zohomail.com; s=zohoarc; b=BaDDc7dB2qO25HtE+sIYcqRsuTzbpDi4d1d1/asc6rcG5SfAkOZr7ky9CCqnG5Zvp9NZzHb8Qk3FXHi/tdPfma/AzDZg0eAVnlwmenNrtFSOPlpCpRixv2+7qGB8HJjbXJH1BQ0EN2B/fDDZC8hn/jvi6iyIOZKok09epjiVSfE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054350; 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=XTylPjmtMa7m+Y9Ht8XnL5ZFtbLGTS0UH9obZKgEZzOkBgecC7tavXS2MS4aivCSRfhOYvn+aygY5x3J2spzmjsk0zkMvBYSzLzYLORlg5uSm4+ovPepfmfI+yi7wp7GkUN6jiOvegbs9gEfNmqfeeCcLnfXhRVZHTDddBso0Sg= 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 177805435072396.68186412092007; Wed, 6 May 2026 00:59:10 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9Q-0004uP-7E; Wed, 06 May 2026 03:58:36 -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 1wKX9O-0004tZ-Ae for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:34 -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 1wKX9L-0000bY-Q5 for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:33 -0400 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-472-BwQ-UbfnMIeR9p6vBbanhA-1; Wed, 06 May 2026 03:58:29 -0400 Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2b2e8bba2e6so72796675ad.1 for ; Wed, 06 May 2026 00:58:29 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054310; 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=Ody11UV4TXXAmYCRh6hWUEZlRM4+eYY1vWBEzReotrajOotdIErCGgZvDmHDUqKh778UuX 7yskV/MbKYHW5ydXRqrOCC3S70tBco77+dHqOc7o/0YBzu9WqEnAiz3xvv+XLQIYQr0I4l KLJMbljI43+32LryU+3IrmsXy0Drmd0= X-MC-Unique: BwQ-UbfnMIeR9p6vBbanhA-1 X-Mimecast-MFC-AGG-ID: BwQ-UbfnMIeR9p6vBbanhA_1778054308 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054308; x=1778659108; 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=cWCx8Ib3OjxnFm+zJhuQqYnCrKzrrh3JdzIgQnJYDc7MZ+vIVt3aOXICOpXZqj2v7B 04119ufEyrttG5/owjT0aT54y+RygcflWmHxueX8nUhguIGbLnDb6vSeEvnCdHdSBRnx Yi/pH2BR6CqNrDoW+DwWx/MK9R6G/8RsbuJf6syj1cKs53WOG3bR1fH/T7iPimj1Z+6K weLzOmTFZRHTcr1Yrp1Ve99z/UJN+DzxR1wHZF5BkxuTAJOewJa0MVeyjcx4CnGb7H0l hP8kAEnmw+jBwjHrqbRe3K4WX3crVRYjofEC8Axgx+sjHOjvC4XHozPGzzqYeyCp+xrW BrDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054308; x=1778659108; 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=Ky85RPXChjE6+C1YX5/asVEGs4Eqcm4UVx7oZuA0DbcLKFqvJ8x5kNzL1FyrcDDQJf RNgT2aczuoKBaGnwwsfYJkFl5G2vzi6VFlkWUkllpJmcBklBDS0ynnna5Yhc9FOcaAF4 W4wTnB6boXi9W8K09ONWpxmItvrSnpoG2zzl3Zn+A6N2QzBSU8UoXldz1tHSFbgv91Cc JbNUIY7ZisM2To4IdPZS+z5qOZIV5shy8mlLZ2+PL4nimBqYpVmMppQjvgJmFqV98QiQ 6xdMs/rw7P+zc3cnwhnZQsqcDGMV2kDZTKgklSR6W/6yjw6fgD/PKb7Kw1HjWagdiogv Ff9w== X-Gm-Message-State: AOJu0Ywi88t37UDTfUWOJvi01irZW7K13TvKsLZCkHPy5flc7f/pyk+K gpLPMwy8HB349O7CRx91L72tqM31DBfe43t1KWau0a/UXch7PpKktdyP0eFZM71iTVfLBS/ZBXY 8Uino8RANQky/hO782funb9/Gi4MJ0H+BuT6WsD8vtg3SOam3rMRegghR0Gtp2yb+l+HqDGqVFt BWIXgaEd+oSqZMs13JuG/G13UF5+TZyck23Zotr6k= X-Gm-Gg: AeBDievwhLpZu/ZwYLxD0jJYD+fvr6LZMADrzIF/g+lVTFhcwIgyrNGNkaw2VqL5SC6 RHZedfwGD3EwAnHPmUuxh6LeRygEEsu4NbuUCia6u8Wi718tuqqCukxG9Dds6nlmi1DLPhkeJ8g Y6SlcEcVNo45gqYmvaxSWVX+LKETaLrglUyLxQT0oVDCIUEkmXMbTbIqqXyrEVFZaWcDxEfWxfG hOHX+FWfEDXUTOeitlVn/02B9wmPsaLlNZDuPETi21D/1gtls89lqz10BM8YeE3M+w8D3dcNz3Q zv6B9Q+QEUKnGVJQqrPk964e2EoodEdbTRFKpuErd9w41fZy1HODQvV0T0Gx6I7uKdhwvH06rq2 odpXfP9o3h9hzpf1erNx5AAvtHr6pJaBLIBPh/vJpfDQlxG9wTLOcG5gGex/Em5W07WIKrDrw X-Received: by 2002:a17:903:1a4c:b0:2ba:9587:25c2 with SMTP id d9443c01a7336-2ba958726f3mr4407315ad.3.1778054308012; Wed, 06 May 2026 00:58:28 -0700 (PDT) X-Received: by 2002:a17:903:1a4c:b0:2ba:9587:25c2 with SMTP id d9443c01a7336-2ba958726f3mr4406945ad.3.1778054307452; Wed, 06 May 2026 00:58:27 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 1/6] hw/tpm: Add TPM CRB chunking fields Date: Wed, 6 May 2026 13:28:08 +0530 Message-ID: <20260506075813.120781-2-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.443, 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: 1778054352362158500 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 07:34:35 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=1778054325; cv=none; d=zohomail.com; s=zohoarc; b=Wn3Z/fRaF67mVZbnxbZnf4biove2EvaEsWjPziGJrScPv1LmAV7BtRFQ/KEXtC+v06S2wqv3NGcEYiGerzkZLeLDoYmjvENiqxEh3531cTTbIbAwcjvu+UmVFvUJHS3CP3aOscOmeByJWa7JgjmDTnt/+AW7CIm08ebafSz28Fg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054325; 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=f1vIxQn5NVSeNZEO3+AMTImH6XYX6JprML62Q4bwVLh5X4acc31jh+jjQB6Cpr+OlU16Nw6UsJXSjQXckL8C38nZpJJFty8Fb1RjPiytDbkJ8VLKSGDaBzyQREXinf8VQlsXVmmt0W3xvn8WtURhiueeXHTMEbQGlK/RQPfIfyQ= 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 1778054325534360.18483041045124; Wed, 6 May 2026 00:58:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9S-0004vQ-WA; Wed, 06 May 2026 03:58:39 -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 1wKX9R-0004ud-M3 for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:37 -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 1wKX9Q-0000cc-86 for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:37 -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-335-Ty5X4LtMMJuhiS8eEyEw8A-1; Wed, 06 May 2026 03:58:34 -0400 Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2b9b8137828so55822375ad.0 for ; Wed, 06 May 2026 00:58:34 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054315; 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=Bzccnmz0kdT+xxEsAlAjYrsHs29fkyFJ60PLy4DGiX9nvRXbG20ziNIsV3F9HZmjNQE9eW YjPj/UiHmnsIpCtfAdgS1oOWSmSEdx7DyH36mn64YgvEOcp+SX+SIKd5tYw3oRT4VhiFOD RADktV1PqWAWgHMQ1/I2aJCzp8eKRZo= X-MC-Unique: Ty5X4LtMMJuhiS8eEyEw8A-1 X-Mimecast-MFC-AGG-ID: Ty5X4LtMMJuhiS8eEyEw8A_1778054313 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054313; x=1778659113; 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=lWzGVpiAHLxeNV3g5l2n2Cy/lIEg7pXRpRX4Xx2X9dkRCp236B6i1Czyw+jNARXShr WKbhlWdAzijVlCoProshoocEdaytj1tMWImlP2fO5oGCdbVkoX5wfcCBXEv3rXe3ljcm FfMiBdGBo5AEvlh4OpTGmAFEykQVceUAHChxNNURByZXFyO3mYFHM9nmFItoCfJq9y8I A5Jj2YGE+NCbu0+CYYrBKmxDSgPKauCIdAVGvT1Nhw+fAQSWbEdkA56Dk2MjejO4Saip rl5BovyvkNPoTQKVyPx5cqB/VE0JJFcPkEEjIg/LwIprbEpYt5etAjK61cVLZkwjTuwv x9Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054313; x=1778659113; 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=aS+OZVDWhOomKXOrlJWl61zfReo/uXsggJERaqQNVheY49/tqWrnig63cWB2rUIITS lR91fn+wOobVdFE3pZD99h9kW6D7V896X9Vj/cyLzxxEO2BLgeQTJxWjs2wJo67TwUEG no0yIkA7bYp6uS7DHP5VBD0GX5Qtwm564OA8veJJCpHUjP6mvXhbQ/U0Alt55joZ1hRN +RtsQOQNJIBb5gzMsY8sWRC3QOWFEMBykeOTk/bC905qcjnxqx853RGpNF9veAyXI4dN /sE2FHdx7thXpRpPW1rruruk8VucnJlrixTbl+rghwqfXJsn6UyUoX5Pvz3ORy8Q+GHV omyQ== X-Gm-Message-State: AOJu0YxkqsMsn6MP9Hw4FPAV2rQAkYb/6hm+Kuy0G5Y2rp+EAQjRHV9s RuAX46MyadjfDiSn6KRoRKQokqp66AsbhLEn58ZRTQL7R5xYvg57aQu2Dm9Fv+1TS5HBDCKeW9H Fj1fQAxzQd2jbFHGR1vRLauTln6akFOepQo98FWX9kAg8py3Sru+3Igio10HOqVdvT7OznDKaU9 XEohL/E88MdXs0iQOvhL72Pux8PKSQTJ8o+W2fJME= X-Gm-Gg: AeBDiev0STUinJULuEbYvRzL4oomUF3IFdxWbQYhW3DpboXBpF7At5eZ4kgmf+iEUJ3 ddhFPYsHQVMFsGS6rdQYbLwM2XVFuOxfg1OH6C8E4jg3LvDH5+73S/luGeHmBSatuyUJx+W7olv HE/FBb2NiAH1X+efJg944oM4/D75nFS3i7G6a2adjRU1UgoPJ29IhHMM3nEe+V3my559+yqL1r9 z6YcZdy3I/knwgVKUhEEJmenJOg5m8kVMpw4QIx5SsOqongr+IStFbvbHMFX8B1A0uieKTlzLSn joopq8ed8mYdM199ZLVAa61Xwp8GIggPXsTm7SzyNvUEnSB95/G7A4mfPO/ViBzjBQ15wM+EoMy sB8RFNjJT3DyHu0MaJHX4E2paR01NNNy7SzioRs6Sqh4zgY4b8Q8KLY7dHPHFigPwD19u6b8d X-Received: by 2002:a17:902:c40a:b0:2ba:13d8:d503 with SMTP id d9443c01a7336-2ba78b3fcfdmr23743755ad.8.1778054313172; Wed, 06 May 2026 00:58:33 -0700 (PDT) X-Received: by 2002:a17:902:c40a:b0:2ba:13d8:d503 with SMTP id d9443c01a7336-2ba78b3fcfdmr23743365ad.8.1778054312559; Wed, 06 May 2026 00:58:32 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 2/6] hw/tpm: Refactor CRB_CTRL_START register access Date: Wed, 6 May 2026 13:28:09 +0530 Message-ID: <20260506075813.120781-3-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.443, 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: 1778054327193154100 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 07:34:35 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=1778054337; cv=none; d=zohomail.com; s=zohoarc; b=gEx2kJuH/VD/3nm7UCUChcfazbnUnlHAdqVcBFc9p6Vv/mstqkZ0G7/EFZAh3q7+4UhACaTMVLoP5LKTEy7Msho+P4AOFmyf8azj2fWT3IVRduJzgSK68IehYg6MxUV/QcT4Nwsz5veQ5uO8+TxyED/WARg8ztDBAp2TOK8CV1M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054337; 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=hD4/VT8L+e+RzQ3/O5aORQeW+0tTr+OeafQVCjH42VA6/9lxCjxdC10fu7UTscHT2MLY/ghmpB8Pyk03X1+7xJwyjBdIVx9o7xw9uqixDxw4KrWiSfe62Yok1TlCo3Qzt4adbdRtFgVf0aqRidP1HQDXUHe4IXPSEoa4fYmbkLQ= 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 1778054337368352.9082377634585; Wed, 6 May 2026 00:58:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9Y-0004wW-IX; Wed, 06 May 2026 03:58:44 -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 1wKX9X-0004wN-Fd for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:43 -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 1wKX9V-0000eh-Tm for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:43 -0400 Received: from mail-pl1-f199.google.com (mail-pl1-f199.google.com [209.85.214.199]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-633-QF_NSvnBMyyjkh7MgOWMhQ-1; Wed, 06 May 2026 03:58:39 -0400 Received: by mail-pl1-f199.google.com with SMTP id d9443c01a7336-2b4654f9bb6so63616545ad.2 for ; Wed, 06 May 2026 00:58:39 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054321; 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=eclsfoytS0bgmsF8ZTxh1Qv+y40I0jICbDw3SNfcrFJaIvsh4Ggzzngaf3zdFyw+X0Ewa4 pVU9fjkCOEPa+9r1cnDDXVH6dCEefankcizus1mVSLdhmIY8llqbiYO+heZSJNWh9XVnnB ttePAyzharUizE04sN3FmXUEkd/sihA= X-MC-Unique: QF_NSvnBMyyjkh7MgOWMhQ-1 X-Mimecast-MFC-AGG-ID: QF_NSvnBMyyjkh7MgOWMhQ_1778054319 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054318; x=1778659118; 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=CP4xgpSgtHv0d6CJ137je5MkmzTKyKjQS3mPnlid5yPCZ1n8fVOkF10WHd/jajkRFs BkBJP7PHcpkObY7JBoFXkFa2l3FKTVnMI/h4U07uBI/4hGB6TXZ8HU2srb4tTT1WzrSY xzbD2K7WBhG0teLJeZ8hb5bkNE21o1S1UFymZzjJi/qnZ3R0eL8DiDRHWU3oZhgOJTA6 vFqs7t6lcIaae3tPdcXQxtA30NtqADB3fkFurrpmpHrJ2Idg1ACxz/djce4dArlgoUVD HK9YIS/TnsFbqHXnPwXQFkpyF2YPr/4J+x5CQhROvxrY47qYb4n49+AjUhpRHjQn56BW 0tjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054318; x=1778659118; 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=PknxQijkhnQ0l8hOI3nj8v9isJb0esD0pQwS/eo1kh5yl2DyWxQfgGJnZlCh+3mnnr 7Z3a7W9jujYko773M22NNNpiBLWwj26QfARc56yS5Cjqq8QQKncydLybk+/AOKoUTnMd cMefdGrcpztq/pzszLXK9Fe2lvelvI+0TALzsB3bvUxmR78LNQnZ9+XK2UZNVfsyco+d 27NSrmywS0d0p0WnkcTUeXALjcG6zwEJ4aI4EZHYGpX/UWvEeFJ9HqyBQsCSpyML2AFI 04hCLfUU2PuGuFk98pP6GYlq9NSAEPP72JTG9qeXDBSUeoq7pVqAiJNT+NjE1ZZwfsYl ymDw== X-Gm-Message-State: AOJu0Yx4FFTTlUjN98v6txdDRE1ueSyhT95FZtbYUiv9Yq3upHyFFOLM OYOsc34HSdLhRiS7ED+W3Z+aU71KDUI9qbhG6W3bJz/LZ7JIE50Ax//EPNfLDFQd3u6A1Prps+0 Btuk4EIwawCuXdake8AwOg8tgD4c7rUeON2PKglphGVdsejWkmjc365e2Nopibb6JqtSNB7Shot DsLZsTKYV5UHLuH6F8eXwsEB8wjBqOmNFg7CW9d0U= X-Gm-Gg: AeBDietgD2RDdk11bhxBuzZbH0XIsAVUfpNClVWsouPmUU7YEW4eqGTRGnZtHmxlffA JIpLzS3FTgdNTzViXfJey2eSwTblCWAb1dLM0ynkwpp2di0icPl+iz6GhtEEkyn5m5cv5Nn+d08 F54GZ7pEjz4w+MYiiky1tWx99I2j9G1av7umj+VMf7BzOY/Uf3TnOIuF06fYSC5j3OiZl5Jt/GD qphfmxAS+uSGV51Tx0Go6J/dbKl0tKEVmgX0xd0AIa7EEaYJhZENAv51hw6Vc3cnwpF+GzSxHF9 1YGrIGROpUoiMvAnrXZGIyQqZd/VUQLjx52lEU80N/TEY3OHRpGk/5AXgYCWyyAonniyQ0kudVL d0ydQjb5DRR9/pA185Gf6W9+uJjF17oBlO/qPhOGXPI/cFQcNVN4+eKftaj+vnK0Khu3WsN94 X-Received: by 2002:a17:903:90e:b0:2b2:4d36:7ba with SMTP id d9443c01a7336-2ba78831407mr24044745ad.0.1778054318407; Wed, 06 May 2026 00:58:38 -0700 (PDT) X-Received: by 2002:a17:903:90e:b0:2b2:4d36:7ba with SMTP id d9443c01a7336-2ba78831407mr24044425ad.0.1778054317739; Wed, 06 May 2026 00:58:37 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 3/6] hw/tpm: Add internal buffer state for chunking Date: Wed, 6 May 2026 13:28:10 +0530 Message-ID: <20260506075813.120781-4-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.443, 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: 1778054339326154100 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 07:34:35 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=1778054337; cv=none; d=zohomail.com; s=zohoarc; b=WaP6cZUDqAWrMX/w7foyo0tFk+YWXsC3JryU3uuJ5YdS3aop3NjDK5bGlDXycudlSgm/19oPXuK4IwuXlllTS/GNb4fEXfyAoIt+Edw7CEci8NS8f97agR4QkDjGV8x/o1lYgLc5FQarLi8An/kggH7K0koVkJRcYmwb+7+5mgs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054337; 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=c7CPWgNB13IdLZBd87QRLaWoqkdY/Umw55r84ixp/UY=; b=Zq29BruCPWSEhYbS8BPbZusvdcnanx+5Jb6+rY3cHsfcfA0Yy4UhFbEMGifXSkObJWg3jioZTBlqfprHbv9liPHMHfwdOz5nLX215H30syWr1Y7x74zN32tosJqO+ukg6wpgSzmavgpv3fz2tMhYE8kMK47jr62kCZLaqP2VrAE= 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 1778054337041103.64443542873437; Wed, 6 May 2026 00:58:57 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9f-00052Q-8R; Wed, 06 May 2026 03:58:51 -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 1wKX9e-00050B-4o for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:50 -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 1wKX9c-0000g5-5B for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:49 -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-691-Dcc2FReKNi-5cssczkpKsg-1; Wed, 06 May 2026 03:58:45 -0400 Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2b9b8137828so55823275ad.0 for ; Wed, 06 May 2026 00:58:44 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054327; 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=c7CPWgNB13IdLZBd87QRLaWoqkdY/Umw55r84ixp/UY=; b=QDz/7ytPqtIGUuZChZ1vHaDB3IQwz4ZlnHlKlyKwL34oeEIyMLforull9xlqFY+ucWRoea 11WLee7+KDTiYDc9FOAxLIKpYQIEWUDTutBX8R2PV7CzriAh7BQ+46iKDgnZPowJTVmHgY 9+I6fn4cv2V8DxX+rMrBAvlUHK+yp4o= X-MC-Unique: Dcc2FReKNi-5cssczkpKsg-1 X-Mimecast-MFC-AGG-ID: Dcc2FReKNi-5cssczkpKsg_1778054324 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054324; x=1778659124; 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=c7CPWgNB13IdLZBd87QRLaWoqkdY/Umw55r84ixp/UY=; b=j8eezvrzHbiUvt0WiCOyw3ylf8cb3GJRSl6aXQMbhqvryRrjA0onUI8PZMR/HJRGHe eTtNjUNT4DI5JbHdE4R7cp0rtJBypCW2dMLpY9by3imBMqhQPOeC0/riuf7Wj6aOR4lE JueeF/qP1SC1NraEH6UYWXJOsAwtxCnpOFWWQx1eXMi7+7krQdC/gZrdgupsm7PiRbni fXEn6LXl55LnRzkrer/2FGaR3HBC4PAo9qUxD+vOhMqqDAycAgu5j62qg/df4uC3FsNt V7wxcs2grmET8xvVfwmfmKcaANVMVkYHket1jQBPgLLZmHyujmR7w15TYOt6HN23znVT Oijw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054324; x=1778659124; 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=c7CPWgNB13IdLZBd87QRLaWoqkdY/Umw55r84ixp/UY=; b=o9YT8fMQIRxbqeEQlK1DlhgFxz9uUhgHnYTYloeDRbE4Q7S2t53TwBGzvzu4NRIXAu nHmBL2cBjxcy1g+PtGq3QAR0/zM+LEE8H/gNbXk2Yma3mSS3J5ZQdrIpJqPBxEDuO890 z92JmyZ5JmbmghesT61CazfxwGJCCUDEMZiCmdvhl+/oGqw3HNwhCmINKO5TUTGldri+ NmIZ58wr3tAzuZqnqoY6VIcbOZoDo2SzCD0jSFw2WMxXrc3u0aXnpmcocJYqCV4ENKtK 7D1XI1pd+gfUsyHy8xvN+VPMR4Z3qPgP3Z/9h8dgHFR964gPGKeAen9Cd8PGeBildSq6 AeJQ== X-Gm-Message-State: AOJu0YwJlFBK+vrF8qX3lj6jZuhBDU8htdM+hds4+wKFxbsDHMSAk6hp L8IY5pPwui5PTE3ISKw+DETxVxx/MrcgplHGqPzSEwBhZ0Z0mwPXxHwDlcKaRT76DJRbq14V7Yl SM42lGz7qUZkcgYLbQtwc8hyO+BEabVjlbRJ9hFrM9FV7qgwhacE7JDP3mKDKDAzvPT6nSXye3B u867BP1tfSWaTOYCWELimRjVVf0LO5dvH6fKC4gUk= X-Gm-Gg: AeBDietqgMmKwHU0+i650cIL/KM04fY+1LMwLtRVOJpiYG/ng/hC6/GD6Ek2Kr4/hHH aDrOcG4LY4OHcLDBJxhAHrRUmqyWSrTIeH3XcCjwsp+DSQAJ8JAj82D7YG5ePP6jjd9Eqcil+3w zGLmcUO2ecE1GmgwSbPZuLZPl/QAJoKyRUb813N7TiafcT4OJ2jg9znZFvFH6Oe85gYN482cHj8 Iw4czl//Xlb9gjv0f2na75sdrfhOm1gw2szyYCztmQr1boC/L3Lu+GJ1A20UVT6/4WyYzCesSe+ kPTTegYf374crbpbsJLPRv8R88rtBRNgTvAlCNDlVWZO/BaPSt1sR+u11hfFpTZqdvmn5PFP3tm s+POeqdByWtfswf4weaXCNasyQlX2fmf6LXQgZr3wZ6buioL5WA3KlX6NBB07tvaFUyhKQfI6 X-Received: by 2002:a17:903:2903:b0:2b0:9c2b:641d with SMTP id d9443c01a7336-2ba78b3fe5dmr15330365ad.2.1778054323660; Wed, 06 May 2026 00:58:43 -0700 (PDT) X-Received: by 2002:a17:903:2903:b0:2b0:9c2b:641d with SMTP id d9443c01a7336-2ba78b3fe5dmr15330015ad.2.1778054322944; Wed, 06 May 2026 00:58:42 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 4/6] hw/tpm: Implement TPM CRB chunking logic Date: Wed, 6 May 2026 13:28:11 +0530 Message-ID: <20260506075813.120781-5-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.443, 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: 1778054339404154100 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 | 143 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 130 insertions(+), 13 deletions(-) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 1c944d7ef2..f85df08185 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,58 @@ 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); - + 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 (!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_size); 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, + .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) { + 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 +316,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 +405,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 07:34:35 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=1778054365; cv=none; d=zohomail.com; s=zohoarc; b=jg6bQUwTWKhXBOu+G5JpSqR+X81fhAHBZvYp16TDWdqsGkf0tV/hInxu25uDuMI80bTGdQp1OXPLcDkioM8ulhI+MnyDsdDUnyUaPrYTs1udZo95fuHoniilwrwyZof7AZxpO8Zb2M9MIEDoca/pHFC++Q74YSUjAyihedet/wc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054365; 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=8VG1umfV8XbLQ9QjPcrnZsX2l74f6GjJZEm8Zg6nu/U=; b=nFxTGomgrCNyjvW4n7XOMaEjTtETHL2sVMyippgUYMveIuPrCdVfDP4X0o33FGQPY8Es3ptDpzOs9PRCzjsRA4EU8PiBvCpWQysUVts8y0tHfHt+begRpEKuouDT96TvYHoORKIdPpX7cTl/WtjN2228KoL1d7jTYdDcrqSLUyg= 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 1778054365184312.4686300629397; Wed, 6 May 2026 00:59:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9k-0005I8-08; Wed, 06 May 2026 03:58:56 -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 1wKX9i-0005Fq-EO for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:54 -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 1wKX9g-0000gy-Is for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:54 -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-582-nJe6ChdlPxGTcGIYFh6iFA-1; Wed, 06 May 2026 03:58:50 -0400 Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-365d4d2fa04so16122a91.3 for ; Wed, 06 May 2026 00:58:50 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054331; 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=8VG1umfV8XbLQ9QjPcrnZsX2l74f6GjJZEm8Zg6nu/U=; b=EkrsCAhNmEi9wYTOfCZ78SXYQUTmWPbqRyzlrb6FhVkwzm14a0OAV5BxDd5NP0SD/HqtVe q0EBKc9of72i6r3U7IVO441IiV90Ekjh/cgMsavbEpVR2MYOn+CWobZJhMKWR9Op8qvNrT f0m+ZRishTg+tVLiOEjKxAysY+VYcN8= X-MC-Unique: nJe6ChdlPxGTcGIYFh6iFA-1 X-Mimecast-MFC-AGG-ID: nJe6ChdlPxGTcGIYFh6iFA_1778054329 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054329; x=1778659129; 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=8VG1umfV8XbLQ9QjPcrnZsX2l74f6GjJZEm8Zg6nu/U=; b=iYx3imMmsWY5cIAD+SJ9B52icp4eHTUsNJktVxGiLJ4PGkaHv3eH70cHTe1wFVNgit N4pUwWLIylBKkFB5mz/W9vGOfyq/QR2myjz5/efOw7ga9HwIG/AAe6E2hAQ1srIBZ9vr tD/55ppsHoIXr/c68JP11XGih88ObPL2G+mgNHhrqIqLogFKQRFOQkkBSriUskS15ZGP oQ+yM5EDHbsz0+N1I+fqbQp0nEaOUY/M5MuWZZTVe6qzYXQ1JRi182mbewtpME4p7Tfw 4rm3TJm0zu/jD8hIVEeVhJur243bAC16HksyG3JUkAyIDwP0oL2d8SMy3Dh1lqtl3GnM 53ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054329; x=1778659129; 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=8VG1umfV8XbLQ9QjPcrnZsX2l74f6GjJZEm8Zg6nu/U=; b=mChFS+dd8uePmtlqda8+CIP8kjg8A2AhMuUkcJ6aB90sTTnDxNYsWPoM+BuuopMm85 1uMqJ0A3w4a15AqA3DysH0p2NwnTN2t7Q6/ubJELq20Lt8fwfadU/OOw8D6UbTCs6vqi /5iujmpLF6h2gv3kvq7wizm7ZF1PrlFBY819wmOG9WVBCbTm674h0RjRyEtVNE3zNSX7 lkYjzKVFVGa8Nsh4U/aKpEFkGW5jZrdthW6fQaTEaZ0BH08uQUFKa52JcM8pq20D6x59 5gBz54DGPSqf6p4xZl3A0xcK0peq90M8rnO1HiV5ji3ybKhg0KhggI+Ar9IeGS+DByAG SZeg== X-Gm-Message-State: AOJu0Ywa+uE95R3UIRACgO/b1eeSWlh1O2zFk2a9goB/GW724iNqwhuN Ln7Ca3VRpcbu77PDmRB9uQyohTg/iZzLS42abpYDX+v5ezEMU+fjxs4bNRCkaNhynBNje437H+i iwiH6UGh9TGW3ruu0xuQxVMVEU/v5CHQxIQBjpAw2JgJLVUi0yVqrV7zs2u7nwwxF0fUptJzwv+ kwYypYbCntJcv7Tc4kdcxof5pWmU+3qySgEXFH7cI= X-Gm-Gg: AeBDiesUlZMuSKb8eD4Os4nW/6QvkvVavVK0Don0hvq22Mm2W70MDxkcb56mA7zLktZ nZncdHv7G7rAcz5SH/KNipVrYQvAjqM7PQ54Hyl2QejJEKGvc4GMF/GguUgPfpQHdQ5ViQZttoR 5iVIMdLrjTHzgNvUeurL1CCROW5t/kcXc6EFyPsDzx2lvRtyxdSlw0f/XdfkSFrIEN4MEbMBZ/q jCQOrzqbYbiFkfgnsjxYW1CHuOfCQk6vFObpgA1pMJNTZyI6XY4cRdMzdNVhY6cmEmyVj42sCVL YQarzts/+j4aAcxpKys8owdLyEXWZNoFx7DWbJ+EINS+FxV9iFUk/RuaLcMC6XZZM6vSzW9mu/u IfnCreLFPNnz3YEWNdUDpG05GCEzCsBbUImLNNi9xNEx2rlyBCymfXP5TGBNsWPkzlnTZPeJb X-Received: by 2002:a17:90b:5207:b0:364:919c:b52f with SMTP id 98e67ed59e1d1-365ac775c4cmr2178923a91.24.1778054328974; Wed, 06 May 2026 00:58:48 -0700 (PDT) X-Received: by 2002:a17:90b:5207:b0:364:919c:b52f with SMTP id 98e67ed59e1d1-365ac775c4cmr2178877a91.24.1778054328326; Wed, 06 May 2026 00:58:48 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 5/6] test/qtest: Add test for tpm crb chunking Date: Wed, 6 May 2026 13:28:12 +0530 Message-ID: <20260506075813.120781-6-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.443, 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: 1778054367669154100 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 | 109 ++++++++++++++++++++++++++----- tests/qtest/tpm-util.h | 5 ++ 3 files changed, 109 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..b0763d86b3 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,75 @@ 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; + unsigned char header[10]; + uint32_t actual_response_size =3D 0; + + 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 + */ + + 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 07:34:35 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=1778054352; cv=none; d=zohomail.com; s=zohoarc; b=Sb9ywf7eg1DVgNroaQS32PF4f9G35JIPJz9+TIs9H3Os0MMu/WkaU7w4FOjPzT/BW6+IFpNkU7kMuH/kD1xgqDF0pmsHHoMxraaRcxtFC3CkvWlHk68gWC/y2mGSuHWhh7aX3i4J8/Yl4EEnt+jtT5fXlV3Ui6jZj8YJeXstcUo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1778054352; 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=wLOTFeibi/SJQNjXUnMOcOvEOv6uYoUj8D8DXGCDyqY=; b=l8/VkAYZdiGCEEc5xCbFKUVzR0Ef0TegTnUzP9EUMUfKug5B4DTvyCZesrTrzHlg/3VBv5XzRRhk63j/je6FfhlIjaNt7tYUH/8HBaealYg87oyljkOG1Ezs2KXPryyT4rJ4feSd6iTnUTtAXg5vuAw2WzMza8dNZ0hjPWqXXSc= 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 1778054352175405.27336560009894; Wed, 6 May 2026 00:59:12 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists1p.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1wKX9p-0005ic-NQ; Wed, 06 May 2026 03:59:01 -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 1wKX9n-0005cn-N9 for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:59 -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 1wKX9l-0000i6-Vr for qemu-devel@nongnu.org; Wed, 06 May 2026 03:58:59 -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-232-g4dqA67-MQyXcbmDJe5eiA-1; Wed, 06 May 2026 03:58:56 -0400 Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2ba5f794825so9484185ad.0 for ; Wed, 06 May 2026 00:58:56 -0700 (PDT) Received: from fedora.armenon-thinkpadp16vgen1.bengluru.csb ([49.36.106.26]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2ba7ca29f9dsm15439865ad.78.2026.05.06.00.58.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 06 May 2026 00:58:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1778054337; 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=wLOTFeibi/SJQNjXUnMOcOvEOv6uYoUj8D8DXGCDyqY=; b=Ts488kS28JvvwD2nM/YTab4NJLkdI838rQ8Rhf9iJNgDD+qhKE6clKvVvyCVqBzmoForT4 F/33m6Q7KO6Z4TSDo1xP0GnAxOaZDU18SJWD4dgv3v/zhpjVrC7A5cMpOvSwY8mMVdFoGG 4YbKoQ1gYalKEBLo1kYNEBgB3MfItwU= X-MC-Unique: g4dqA67-MQyXcbmDJe5eiA-1 X-Mimecast-MFC-AGG-ID: g4dqA67-MQyXcbmDJe5eiA_1778054335 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=google; t=1778054335; x=1778659135; 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=wLOTFeibi/SJQNjXUnMOcOvEOv6uYoUj8D8DXGCDyqY=; b=hKs77L4HN4dx9nahucYjIUrZKptIpcJvG6UGHRre1HOMX4injrdQ3mWsbAqIrKyWIl SXs8UwiTaFj8C8cTYJ5cvA9TzY8xa7y/Ekbtb+Ek2NLqUBloAWx4fUgiBAmIz3VXcU3d UwVWh4PdRBaFvIZSZI3Q+O5/M0SAgd/vM1GGRuGyHce/4nPJ5C1oKnf4H1dFgP2Ezol6 2/bT7Or0L1PvOWX7hunRGX45QghrDGSjeBEC7IT4gJQ9qFgAIi6BiCgDRlKhd0z1lADN B4Y3ve+aGQMd/KdH385FSoldh3gjM2gzO/5831ZrDiW9HDYX+tclKbJwfY3AXXxrIJiX 4VnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778054335; x=1778659135; 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=wLOTFeibi/SJQNjXUnMOcOvEOv6uYoUj8D8DXGCDyqY=; b=V/5/22kEz6k8M4DBVDNfhX2FGta2iNSyCvYhpisDAmUlncu+oqa6O/8v4dCbVcIscO wIfdV1nNWkWkUzc81/86S3sha+IxsRtF54sHurz5mHQHvJ/fEZAPsfuoBtBO242X/Etr oUEz2t8dH/43/ePImqoYCUANCoLBJLA6uRrN0m+1B6IbZPEK8tviZUpjJNk4Ls7XItf+ YFMyuFDwoYhl0bq1rcWsxcXkYusaJsrOsVqIA15z5I54sAhPOcW+AIZ4j84ZxYxdFgaA MjClo/0uwcLfIcJ2MD6ZOWKN148YGVxCl/9uG4qa0sgrRN6S8zBrrYnhMC7p43tHDTod tb6Q== X-Gm-Message-State: AOJu0YygSYHTcl+TDSiMJjh9XQdcR0ybuNO4880MX94ONRWgGOh1/oo9 jbZcEIdDO6QlUXGMRNcBnh2b2Nx+QABKA7XrAAfqtT3UXZE81lpLUJjekwNCg2gDW7/4mkrpySg m6Dm3toMjglFLmBUKKFLWSMcZAmkz+HLOthmfGh/bbea/mVdgQPmvCaNuW/XkBCXXntQNSlZAdT FvppKePeGTjBgZXYC66LWAMMPptz06MDZACxvF0oc= X-Gm-Gg: AeBDieu97kwklrfvxP2dtyXjdRV7blBJncGEpRcrcm7lEW/oUuQq7ULWdQnOoxFWT0K dNHrStbZxnRdSC+Gd5YgwJ79QxvFmnf88K1Hy268EpkocdEdR21HFeCBnGf7nyI36tE254aMk9j HMAYzs+zRWUyiyGLVfQ/HRu5NfkaZMI8rTz6pJkWoFu/1UamOwnOObh5KkkdGKmCZs+l+MQKj5i mzL2yLN0tRfgF9/11uY/Ffb0e/4w87SEzoVvTGwkmQLArkic+StfJ+mnN5KjpNPveZc4RtSUgZo w7AdZ+82lhoODWv/5++J5B/VtqOI7lZHYg8W70oOqVbWzgMdYXXDhdOsbqqeg98uimTbwkRlK+q Qe/BGWMuiJE/8Cc2fnJUod8tTuY4doCN/w9tbiDNudLM8QOMOuiZGEERXxd7Ueb4/1HTDBITQ X-Received: by 2002:a17:902:8487:b0:2b2:b117:1e1b with SMTP id d9443c01a7336-2ba78f72f68mr15876755ad.17.1778054334950; Wed, 06 May 2026 00:58:54 -0700 (PDT) X-Received: by 2002:a17:902:8487:b0:2b2:b117:1e1b with SMTP id d9443c01a7336-2ba78f72f68mr15876255ad.17.1778054333651; Wed, 06 May 2026 00:58:53 -0700 (PDT) From: Arun Menon To: qemu-devel@nongnu.org Cc: Zhao Liu , Marcel Apfelbaum , Ani Sinha , Fabiano Rosas , marcandre.lureau@redhat.com, Stefan Berger , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Yanan Wang , Paolo Bonzini , Laurent Vivier , "Michael S. Tsirkin" , Igor Mammedov , Arun Menon , Stefan Berger Subject: [PATCH v7 6/6] hw/tpm: Add support for VM migration with TPM CRB chunking Date: Wed, 6 May 2026 13:28:13 +0530 Message-ID: <20260506075813.120781-7-armenon@redhat.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260506075813.120781-1-armenon@redhat.com> References: <20260506075813.120781-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.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.443, 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: 1778054353523154100 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 | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 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 f85df08185..54fa2042b5 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 @@ -349,18 +352,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_buffer_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) @@ -415,6 +468,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"); @@ -424,6 +478,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)); @@ -454,6 +517,10 @@ 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); + } } =20 static void tpm_crb_class_init(ObjectClass *klass, const void *data) --=20 2.54.0