From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994823; cv=none; d=zohomail.com; s=zohoarc; b=eiZyviF3/YhiC+1Ael4+W5F4SQfyO+8jRHxjnsngNhzVx57ZV0nFqgl8f35K+YsIT7uIT+0f7RzT5u6Vk9VZgdq3f4eEShTaeoXI36scVuhEbKivSvMgtbXt7eE/SZ1CiYIvbWumj1LtG2CEj4AC8Gm7L4pPZWN5JSteiZntzNA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994823; 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=MTg2qHrPvrxsE+HxD6nqzetaydLWT/8UFPiMG7L5pOI=; b=RRnU73ALlK0yHifbFt5JDIXfirQf5mYkc0YkCX1JdfuxiZJVuuF6kTxSOdZ2BMG0CR+tZJVVYCOXhsbPwtW2NiHwy+MY+kuggVYdumIXZeMRjHcqeknaFw7dL/C/wessw4wNbkCCNx9DZXjddtqgFEQkIGA0RoRju0S/ttCtWbM= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994823114600.7317863984152; Wed, 21 Jan 2026 03:27:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLN-0002zp-MO; Wed, 21 Jan 2026 06:25:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLE-0002qC-5I for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0007n7-Oz for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:39 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 3493860097; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DD7A7C19425; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJK-0266; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994724; bh=xmEiSuUa3wEa/j4Qrcz3mClFYl0VN4QyBX3akXF9gpk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ffCwY8IjtDmK8YptyJVu2TMkJlHlE+cdOMcO0Ab1nK/qTi1QY/ZUOk2P4h6PaCnHW PZO8A+1IUToynsWMcPmPjH7g2mrD0UFzC681CiQhxMuqGqoGCW7d1myqlR27bHL0Kb iLM6t6wtlu5/WqfJ5iY9bKgGSgUx/EDPZ5hRPuz/KJNkUiMQVSOOaXI36qAlrICDOq 6I4OvDT+9YqoN8xA6ih0zbi6w4M9qJfqtFELL0daLm8V5W40z+CJm2R1if+e/I2UiD iy+CkHWclRCG1R4TQ0Bfl1eArysf9riDjUKZKJdznOE5SsC/V6tbbUt8opHl+ZzQaX Diwge2tzvhmFA== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 01/13] scripts/qmp_helper: add a return code to send_cper Date: Wed, 21 Jan 2026 12:25:09 +0100 Message-ID: <2aa2c3565ceec788bcf637ce64454b7946e7d20c.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c04:e001:324:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994824353158500 When used inside a loop, it is interesting to have a return code to indicate weather a send cper command succedded or not. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index c1e7e0fd80ce..249a8c7187d1 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -531,7 +531,11 @@ def __init__(self, host, port, debug=3DFalse): # Socket QMP send command # def send_cper_raw(self, cper_data): - """Send a raw CPER data to QEMU though QMP TCP socket""" + """ + Send a raw CPER data to QEMU though QMP TCP socket. + + Return True on success, False otherwise. + """ =20 data =3D b64encode(bytes(cper_data)).decode('ascii') =20 @@ -543,9 +547,16 @@ def send_cper_raw(self, cper_data): =20 if self.send_cmd("inject-ghes-v2-error", cmd_arg): print("Error injected.") + return True + + return False =20 def send_cper(self, notif_type, payload): - """Send commands to QEMU though QMP TCP socket""" + """ + Send commands to QEMU though QMP TCP socket. + + Return True on success, False otherwise. + """ =20 # Fill CPER record header =20 @@ -599,8 +610,7 @@ def send_cper(self, notif_type, payload): =20 util.dump_bytearray("Payload", payload) =20 - self.send_cper_raw(cper_data) - + return self.send_cper_raw(cper_data) =20 def search_qom(self, path, prop, regex): """ --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994773; cv=none; d=zohomail.com; s=zohoarc; b=VTUSC+EEA7U5/pqDkdgYz/Xr92moQxFz+oLgwutCEeKjmBoyI0O/bsj2EXcX7S13r7ZFB8baNKTAdctBcJfv6ysrf9yt0F/wI5PHswBPM3rQdfwoap2pMuMMhdyUofZ4h5MRfj2OcthhbgFJTZ8ig4R/FUjuPwjyiLCOETJiM/M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994773; 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=PAEH5qFCGlf6gPe94tVd6mAb7RmVs5A3VZ6n25Y4Zcw=; b=G4AaVksLmP2mA7peRyfe6DxZ9UmlH6Bkr7Qojf1toUjU+fmsr+iJV08YGCtwRc2M+7R857WmfsusWg/aL+1SJT0LbGDKud33buydLJgnXncatB54dWaKtj/Eslsj7Ex38nGRyiCtbemfQgu0law6ewUaR1dsqkruNROQfAvR0XE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994773017787.883013942646; Wed, 21 Jan 2026 03:26:13 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLH-0002rx-4P; Wed, 21 Jan 2026 06:25:43 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0002mo-VG for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:38 -0500 Received: from tor.source.kernel.org ([172.105.4.254]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWL8-0007nA-1m for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:35 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 328AA60051; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DB933C19422; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJO-08r5; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994724; bh=hwyWdnz7CG8TDTdys6cTh9QCw69st0xyx0awwfXMyL0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GzcRoeY2pWYCzmYKm49hfVh59r7CKssBjYcWgYyxmGznKEFqTI08Z0n4O6M+KHDId iv2LUeKJQ82XW1N/WrmaMocQiIPZxnLFxQqPgQusHPcRtfONVtP+S/S4xfiEb5lOpL pQKFziQR3uuLd4GRsvv61kQXP2Px0KvrS2JRAJA/ry7m9eUgFEDpoyvKrx47PhclZz XDzHYt2JEBusDDwRd2S2F2k7MEIYUb280VZixTKfvnqQcJMs+bNdULb5SlauMW7XK+ eW+7QaeNs4pE2uTFAU5dXKFphG2P5pXT8/puzwAiNiKal065LMvQn7HmUo5kU99Te/ DFe1XcHoJJJqQ== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 02/13] scripts/qmp_helper: add missing CXL UEFI GUID Date: Wed, 21 Jan 2026 12:25:10 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=172.105.4.254; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994774237158500 The UEFI 2.11 - N.2.14. CXL Component Events Section states that XL events are described at CXL specification 3.2: 8.2.10.2.1 Event Records Add the GUIDs defined here to fuzzy logic error injection code. Signed-off-by: Mauro Carvalho Chehab --- scripts/qmp_helper.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 249a8c7187d1..7e786c4adfd9 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -711,3 +711,28 @@ class cper_guid: CPER_CXL_PROT_ERR =3D guid(0x80B9EFB4, 0x52B5, 0x4DE3, [0xA7, 0x77, 0x68, 0x78, 0x4B, 0x77, 0x10, 0x48]) + + CPER_CXL_EVT_GEN_MEDIA =3D guid(0xFBCD0A77, 0xC260, 0x417F, + [0x85, 0xA9, 0x08, 0x8B, + 0x16, 0x21, 0xEB, 0xA6]) + CPER_CXL_EVT_DRAM =3D guid(0x601DCBB3, 0x9C06, 0x4EAB, + [0xB8, 0xAF, 0x4E, 0x9B, + 0xFB, 0x5C, 0x96, 0x24]) + CPER_CXL_EVT_MEM_MODULE =3D guid(0xFE927475, 0xDD59, 0x4339, + [0xA5, 0x86, 0x79, 0xBA, + 0xB1, 0x13, 0xBC, 0x74]) + CPER_CXL_EVT_MEM_SPARING =3D guid(0xE71F3A40, 0x2D29, 0x4092, + [0x8A, 0x39, 0x4D, 0x1C, + 0x96, 0x6C, 0x7C, 0x65]) + CPER_CXL_EVT_PHY_SW =3D guid(0x77CF9271, 0x9C02, 0x470B, + [0x9F, 0xE4, 0xBC, 0x7B, + 0x75, 0xF2, 0xDA, 0x97]) + CPER_CXL_EVT_VIRT_SW =3D guid(0x40D26425, 0x3396, 0x4C4D, + [0xA5, 0xDA, 0x3D, 0x47, + 0x2A, 0x63, 0xAF, 0x25]) + CPER_CXL_EVT_MLD_PORT =3D guid(0x8DC44363, 0x0C96, 0x4710, + [0xB7, 0xBF, 0x04, 0xBB, + 0x99, 0x53, 0x4C, 0x3F]) + CPER_CXL_EVT_DYNA_CAP =3D guid(0xCA95AFA7, 0xF183, 0x4018, + [0x8C, 0x2F, 0x95, 0x26, + 0x8E, 0x10, 0x1A, 0x2A]) --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994805; cv=none; d=zohomail.com; s=zohoarc; b=BDf9pWZ3zGO3pTaYSPVpzXUYTb4mlDE6SX3U0pbVnl6fJmVpfS+iFkDYD1RgDJbd19muecPhT6xRBKBxqYPR7ln/EZrb0T9QxzQ7bcmHDekhk7srSmA/4/i9M9lq5wF35B+Ke/7aynVQWfKiB4Lp+GPw/mUAo8bINtUYN4VQqXo= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994805; 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=ynQgY2FSzyPHH+rIXGtHYUmooPJDW72PDq4TOqiROPI=; b=HbpLHNaXoUIZ/r8kYc2tdoIfpqN8fNaFi4azP4mSvxmFlXphJOMlucuY3+LojrGGLj+EadUY/G+ggsZOZVkcQ941ekkvyDBeO8mNJz/XYyAXWn/d7hLha9gmx548WBNrV3vp2/GZJ93ms6V6Wf8nSWQzJaLdMFF5jhAhLxIZ7WQ= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994805280786.0258954195087; Wed, 21 Jan 2026 03:26:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLa-0003Ck-1s; Wed, 21 Jan 2026 06:26:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLF-0002rT-Ao for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:42 -0500 Received: from tor.source.kernel.org ([172.105.4.254]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLB-0007n9-Qa for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 76940600CB; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E74F8C2BC9E; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJS-0Fou; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=OwzMtHSbgVDNyZakvOAJFDH2xXl6OCwOdHlToFrd0Ro=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NKYRrdBINvcp+M7wxheTPHFCZeIvdfD03QERZHavem5esN5aWRmA6JFdC93bhuWd3 kwEVqyyq510C/eT90c+Maz/+/KF1F24dFEuIgkPl3vmebv5HeCM3wcnBdgJ0JW5EpS EyCLYsSqDtThyKYE1zYUknUlRdA3cRYuriD9Uh91+KxJcAbS8+IJa0vwuGn1E3xXEm AxhN2wiGGfvfgTd5Lk1BT+bSpzvFbKVwAIfctb9WfFG5AxRrQVxA6h/XaqRGxp5FIQ IdJXy2fXKfwf0fliVC4icPuOJ5fKcAm8P7Qy2iTyacZ3G1YiU0ktSYfCdkKZWMSivt U3LrWVhOSkAvA== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 03/13] scripts/qmp_helper: add support for FRU Memory Poison Date: Wed, 21 Jan 2026 12:25:11 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=172.105.4.254; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994806209158500 This GUID record descriptor was added on UEFI 2.11. Add support for it. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 7e786c4adfd9..19bf641a13ce 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -736,3 +736,7 @@ class cper_guid: CPER_CXL_EVT_DYNA_CAP =3D guid(0xCA95AFA7, 0xF183, 0x4018, [0x8C, 0x2F, 0x95, 0x26, 0x8E, 0x10, 0x1A, 0x2A]) + + CPER_FRU_MEM_POISON =3D guid(0x5E4706C1, 0x5356, 0x48C6, + [0x93, 0x0B, 0x52, 0xF2, + 0x12, 0x0A, 0x44, 0x58]) --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994832; cv=none; d=zohomail.com; s=zohoarc; b=VfuvUeb2ohgtexLo1hoWdyVMf/wndk8ZCMo9qiqe4uwdu/osONPJM1xq2qajug/roVkCvy/8nD0p4orAemNIF9irUHGRaJs64dul0G6YmyPxHubp5E+fuHSDiZ08s/0LU/JIi1e3SoWOXv1FA/sZjRYRxcQ5cYPM7l8L5yt9R0I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994832; 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=YrBlTge7d5IsHKXDS61i70rTZhM/EuMa2plXNBXxDDs=; b=IYZe5X/nLohRJBeWRidFvdpH9/7TBkpTK3uVKqoRATE4l2yhjGXFLqMvyjhuv6927pRhaGYsXefRKUmyxEnTP0M+xWWX+WKcOAlHKdTe0Dt1+zFH0ivhVBUJld0kGef26K4K+SbFnipCWXMx0DkYw5NIUrRvMpSlve0eFD4c4YE= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994832521363.5501953428509; Wed, 21 Jan 2026 03:27:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLX-00037c-Bj; Wed, 21 Jan 2026 06:25:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLE-0002qD-4N for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0007mx-P0 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:39 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 386F444175; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E55FAC19424; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJW-0McM; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994724; bh=2JILPJ6jI/HfWZUXE4cKdBtggHc0n6EAmY9XXq4NC5U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=TPShCNPAS1uSlESGFBntKR3QY4jF7Qg3ZbDJAUOVAczg32uTKQHdfDi5hPk/cgKDZ aGIVaxg5So+70s8NEgeLKfVE3/G3aNBrg0SXw9/vbPENrP6BWmdbsYRWKNxs505cdL gsdG7cEfx9Apdeyqhq55QPn73aLtBIw7pRuWVICk2BeNwFHvvTsTkJRh9NEAud5iNW kqrMQWr8R+x40WWrzoT6D6z9X26UNY/TGycXjr5gDl0X/9kpF++CwqQ0omyy7oDVZ2 qtRbUb7IWJRFEbVBFMb1Io+O9zbyghWCsZxWc0Nql7xF3RaAOWlXpqxRzqrI9N6ni5 bl2BgF/GOSkkQ== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 04/13] scripts/qmp_helper: make send_cper() more generic Date: Wed, 21 Jan 2026 12:25:12 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c0a:e001:78e:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994834398158500 Allow the caller to set GEDE, GEBS and raw data. This can be useful if one wants to replicate a CPER with the same parameters as the original one. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 69 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 19bf641a13ce..51c8ad92a39d 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -551,22 +551,11 @@ def send_cper_raw(self, cper_data): =20 return False =20 - def send_cper(self, notif_type, payload): + def get_gede(self, notif_type, cper_length): """ - Send commands to QEMU though QMP TCP socket. - - Return True on success, False otherwise. + Return a Generic Error Data Entry bytearray """ =20 - # Fill CPER record header - - # NOTE: bits 4 to 13 of block status contain the number of - # data entries in the data section. This is currently unsupported. - - cper_length =3D len(payload) - data_length =3D cper_length + len(self.raw_data) + self.GENERIC_DA= TA_SIZE - - # Generic Error Data Entry gede =3D bytearray() =20 gede.extend(notif_type.to_bytes()) @@ -579,7 +568,13 @@ def send_cper(self, notif_type, payload): gede.extend(self.fru_text) gede.extend(self.timestamp) =20 - # Generic Error Status Block + return gede + + def get_gebs(self, data_length): + """ + Return a Generic Error Status Block bytearray + """ + gebs =3D bytearray() =20 if self.raw_data: @@ -593,6 +588,52 @@ def send_cper(self, notif_type, payload): util.data_add(gebs, data_length, 4) util.data_add(gebs, self.error_severity, 4) =20 + return gebs + + def send_cper(self, notif_type, payload, + gede=3DNone, gebs=3DNone, raw_data=3DNone): + """ + Send commands to QEMU though QMP TCP socket. + + Return True on success, False otherwise. + + Arguments: + notif_type: Notification type (GUID) + payload: bytearray with the payload + gede: Generic Error Data Entry. If None, the code will generate + one using the defaults and generic error data arguments + gebs: Generic Error Status block. If None, the code will gener= ate + one using the defaults and generic error data arguments + raw_data: Raw data to be added after GEBS. If not specified, + the code will generate one if Generic Error Data + --raw-data parameter is specified. + """ + + # Fill CPER record header + + # NOTE: bits 4 to 13 of block status contain the number of + # data entries in the data section. This is currently unsupported. + + if raw_data: + self.raw_data =3D raw_data + + cper_length =3D len(payload) + data_length =3D cper_length + len(self.raw_data) + self.GENERIC_DA= TA_SIZE + + if gede and len(gede) !=3D 72: + print(f"Invalid Generic Error Data Entry length: {len(gede)}. = Ignoring it") + gede =3D None + + if gebs and len(gebs) !=3D 20: + print(f"Invalid Generic Error Status Block length: {len(gebs)}= . Ignoring it") + gebs =3D None + + if not gede: + gede =3D self.get_gede(notif_type, cper_length) + + if not gebs: + gebs =3D self.get_gebs(data_length) + cper_data =3D bytearray() cper_data.extend(gebs) cper_data.extend(gede) --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994772; cv=none; d=zohomail.com; s=zohoarc; b=KruAmQP9dZo1kG5JdrGuXOvyo8WkvaeJNFoJgC6s/HjdTBNNM4fhuwdX8+GFTw345IgKieGA89bg/eFTZms4qUQ159XLjGENz5ca0NrWC2WxIyXTNaj33iLhUR2T1YwZ6gF4hDdMkjUBIS5urmDzER+3+Cysti/9Y6fwWSB0mNY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994772; 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=pTird3RDSwTTp7B/ate4EHcEcCJXAPDtH5k0pNkuXrs=; b=nr2MI2lhC4JJ+K8+u2btMUXwp1MDMui+lfNFq21hn4XknDCDW3/7vqwS4LcnIeiZ7ilIyQ6Ubp4SJ1FSF+M20RmJumn7Bk/tbBxQAOpZcUSy2K8t1ZeSqvUMtlyWVxCh+VXMp5170cBN0do3XdmISK3GNJ+9MHs5MtJbPbLU7q8= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994772660562.7978710834898; Wed, 21 Jan 2026 03:26:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLJ-0002wZ-0k; Wed, 21 Jan 2026 06:25:45 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLC-0002oj-U2 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:38 -0500 Received: from tor.source.kernel.org ([172.105.4.254]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWL8-0007n8-1j for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:36 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 4F95F600AA; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DF83FC2BC86; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJa-0TSq; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994724; bh=GxqXjU/gsmVVnItuvIwe8JVTgtQ4M8GaTVghV9hwIRI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=S/emF1+Kp58gkPBbJCONcCHnP9gBF4xO5+UNZbmnn8MKcQj7Rq2HU4JGGQtgWDMql zeEv4PkjfHlj2Pl1rB51QYtiTYGSn8iWNKnPFv4vSt2yPZm0eqvSznIxUXIlyVLeNA MYsG3t3J4o6jLRkIAsj3jWltkrHS1ny+3iFR3tgx1ORCJSQ72i4kQF3gZ/Rngbpbbb mm8MmUFf7PsLH343A1VwWeJAq9PFspMfQODJD5VP6ATq17LwyOJsL437X3wQNOCzKO b44n51MGmDCPZTIMjW8cAcfpSzP+ll0ilqVaaWK8gxx+H8pRbGt3JxAr4LuhjPNlqa DViLelvGfJPdg== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 05/13] scripts/qmp_helper: fix raw_data logic Date: Wed, 21 Jan 2026 12:25:13 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=172.105.4.254; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994773895154100 According with UEFI 6.4 spec Table 18.11 Generic Error Status Block: Raw Data Offset: Offset in bytes from the beginning of the Error Status Block to raw error data. The raw data must follow any Generic Error Data Entries. Data Length: Length in bytes of the generic error data. So, basically, we have: +----------+ / | GEBS | | +----------+ / | | GEDE | | | | header | | +--> raw data +----------+ +--> data | offset | GEDE | | length | | payload | | | +----------+ / / | Raw data | +----------+ where: - raw data offset is relative to the beginning of GEBS; - data length is only for GEDE header and payload. Fix the code to handle it the expected way. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 51c8ad92a39d..40059cd105f6 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -411,6 +411,7 @@ def _connect(self): "simulated": util.bit(2), } =20 + GENERIC_ERROR_STATUS_SIZE =3D 20 GENERIC_DATA_SIZE =3D 72 =20 def argparse(parser): @@ -551,7 +552,7 @@ def send_cper_raw(self, cper_data): =20 return False =20 - def get_gede(self, notif_type, cper_length): + def get_gede(self, notif_type, payload_length): """ Return a Generic Error Data Entry bytearray """ @@ -563,22 +564,27 @@ def get_gede(self, notif_type, cper_length): util.data_add(gede, 0x300, 2) util.data_add(gede, self.validation_bits, 1) util.data_add(gede, self.flags, 1) - util.data_add(gede, cper_length, 4) + util.data_add(gede, payload_length, 4) gede.extend(self.fru_id) gede.extend(self.fru_text) gede.extend(self.timestamp) =20 return gede =20 - def get_gebs(self, data_length): + def get_gebs(self, payload_length): """ Return a Generic Error Status Block bytearray """ =20 + data_length =3D payload_length + data_length +=3D self.GENERIC_DATA_SIZE + gebs =3D bytearray() =20 if self.raw_data: - raw_data_offset =3D len(gebs) + raw_data_offset =3D payload_length + raw_data_offset +=3D self.GENERIC_ERROR_STATUS_SIZE + raw_data_offset +=3D self.GENERIC_DATA_SIZE else: raw_data_offset =3D 0 =20 @@ -617,8 +623,7 @@ def send_cper(self, notif_type, payload, if raw_data: self.raw_data =3D raw_data =20 - cper_length =3D len(payload) - data_length =3D cper_length + len(self.raw_data) + self.GENERIC_DA= TA_SIZE + payload_length =3D len(payload) =20 if gede and len(gede) !=3D 72: print(f"Invalid Generic Error Data Entry length: {len(gede)}. = Ignoring it") @@ -629,16 +634,16 @@ def send_cper(self, notif_type, payload, gebs =3D None =20 if not gede: - gede =3D self.get_gede(notif_type, cper_length) + gede =3D self.get_gede(notif_type, payload_length) =20 if not gebs: - gebs =3D self.get_gebs(data_length) + gebs =3D self.get_gebs(payload_length) =20 cper_data =3D bytearray() cper_data.extend(gebs) cper_data.extend(gede) - cper_data.extend(bytearray(self.raw_data)) cper_data.extend(bytearray(payload)) + cper_data.extend(bytearray(self.raw_data)) =20 if self.debug: print(f"GUID: {notif_type}") --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994772; cv=none; d=zohomail.com; s=zohoarc; b=UJSwcR4J1GdOoHBWKbnQ5OvVWLpSR1zjGzNfuVt9ifykEZwfiU5SKbPie0n2QzWyY7vfBvcLd2rfiODBPz8Xr17Uxzzt9T+luyu7rNOf+nYUyr9AEd5p0sUXyVbI6umPB1jaUbuQLV9f1YZ0ijiLbyPMAze9Uhm1RebLKmoi7FA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994772; 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=qJgghm1I/u47AvRlxLoJmH1D0eOqQCR8JS/ZYdo22GU=; b=P6U7OYiV336EFkicB3KAPVj7OtYaca66WifD0sBh+qW6Yws6JgBa3nh2rwcZYkiR95StdgDLpdf4S/CT5tp0H5vJvF3Btk0YlYJLVuABOE4C4VwjWevoB9sndrivOFFlMJj+3DoL6he4wJnFJQRdA5hnDKlsXsC8RBmtrIOOF+U= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994772532670.0875615025071; Wed, 21 Jan 2026 03:26:12 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLJ-0002wp-9Y; Wed, 21 Jan 2026 06:25:47 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLF-0002rJ-9o for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:42 -0500 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0007n6-N2 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 5A38E600AE; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E3796C4AF0B; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJe-0aL4; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994724; bh=IoP6UNuVlYspWDh1PMyMvKQhO54WgyTdoBbrxGt6IDE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RaE+MEkZVzzaGHogAv/Z04qA1jYZdEBkMgW1VPiRJAWy2puU3Y4YO+xlzaf0rqw85 0f+1r3qTFJY1Bt6x8ByBKI/RRHgS+oWA5wScP0YulezofELv+dagOS4AcibSIch9nm BmeqLVtUAuTZOWb1g7qP3Oj1fwn2BxxVT2Rz49iGyXlOglDPg1HcSRvYp3zh3ceF9s vKH2eFg5Ge2IQ69Ciyo6OzJFFBexqWotuU2GauT0b/Cd75pvsKnZiLyosLvhL5wrcn hi9B1OO+IbyuYc7blWwgiA1w1LAhmycTJwzBUNmwQ5yYVDBCmIJ8jTWtQtZk1nJpKO uEtrU/jFZTcvQ== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 06/13] scripts/qmp_helper: add support for a timeout logic Date: Wed, 21 Jan 2026 12:25:14 +0100 Message-ID: <2539e524dd467af51f8286bd1b201feaad06c81e.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c04:e001:324:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994773898154100 We can't inject a new GHES record to the same source before it has been acked. There is an async mechanism to verify when the Kernel is ready, which is implemented at QEMU's ghes driver. If error inject is too fast, QEMU may return an error. When such errors occur, implement a retry mechanism, based on a maximum timeout. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 47 +++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 40059cd105f6..63f3df2d75c3 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -14,6 +14,7 @@ =20 from datetime import datetime from os import path as os_path +from time import sleep =20 try: qemu_dir =3D os_path.abspath(os_path.dirname(os_path.dirname(__file__)= )) @@ -324,7 +325,8 @@ class qmp: Opens a connection and send/receive QMP commands. """ =20 - def send_cmd(self, command, args=3DNone, may_open=3DFalse, return_erro= r=3DTrue): + def send_cmd(self, command, args=3DNone, may_open=3DFalse, return_erro= r=3DTrue, + timeout=3DNone): """Send a command to QMP, optinally opening a connection""" =20 if may_open: @@ -336,12 +338,31 @@ def send_cmd(self, command, args=3DNone, may_open=3DF= alse, return_error=3DTrue): if args: msg['arguments'] =3D args =20 - try: - obj =3D self.qmp_monitor.cmd_obj(msg) - # Can we use some other exception class here? - except Exception as e: # pylint: disable= =3DW0718 - print(f"Command: {command}") - print(f"Failed to inject error: {e}.") + if timeout and timeout > 0: + attempts =3D int(timeout * 10) + else: + attempts =3D 1 + + # Try up to attempts + for i in range(0, attempts): + try: + obj =3D self.qmp_monitor.cmd_obj(msg) + + if obj and "return" in obj and not obj["return"]: + break + + except Exception as e: # pylint: disable= =3DW0718 + print(f"Command: {command}") + print(f"Failed to inject error: {e}.") + obj =3D None + + if attempts > 1: + print(f"Error inject attempt {i + 1}/{attempts} failed.") + + if i + 1 < attempts: + sleep(0.1) + + if not obj: return None =20 if "return" in obj: @@ -531,7 +552,7 @@ def __init__(self, host, port, debug=3DFalse): # # Socket QMP send command # - def send_cper_raw(self, cper_data): + def send_cper_raw(self, cper_data, timeout=3DNone): """ Send a raw CPER data to QEMU though QMP TCP socket. =20 @@ -546,11 +567,11 @@ def send_cper_raw(self, cper_data): =20 self._connect() =20 - if self.send_cmd("inject-ghes-v2-error", cmd_arg): + ret =3D self.send_cmd("inject-ghes-v2-error", cmd_arg, timeout=3Dt= imeout) + if ret: print("Error injected.") - return True =20 - return False + return ret =20 def get_gede(self, notif_type, payload_length): """ @@ -597,7 +618,7 @@ def get_gebs(self, payload_length): return gebs =20 def send_cper(self, notif_type, payload, - gede=3DNone, gebs=3DNone, raw_data=3DNone): + gede=3DNone, gebs=3DNone, raw_data=3DNone, timeout=3DNon= e): """ Send commands to QEMU though QMP TCP socket. =20 @@ -656,7 +677,7 @@ def send_cper(self, notif_type, payload, =20 util.dump_bytearray("Payload", payload) =20 - return self.send_cper_raw(cper_data) + return self.send_cper_raw(cper_data, timeout=3Dtimeout) =20 def search_qom(self, path, prop, regex): """ --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994855; cv=none; d=zohomail.com; s=zohoarc; b=h8vI1X2+XCKz5SSFkGVwkHK0w7QGe/kmc6MO8DwQ+mxRuucGX/fBns5w5WvuFp6qB5o0d35/jGT4TXfWLTC9pBI6jlRt3NwRVUCfuHJAvKHlHzwMhT71BgRYihxIMCTmfrp7K1A+somybyIc8y2NY213WPkjeKD6qSPZ1dznp+M= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994855; 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=avmOIy17ISg3r67qYXIsv/OhHH7kqnF+4aes3t7/8do=; b=iZSPgmKVxcizUct6KasJNaq9lzYi0ZtuEZqwjfrQ2qPGI6awCGMBoBt/7mmOh9MEU8gQz0TDT/+ibHAocJes1whV7GxEaZwhV9OyU2E/wYrERldWi3w9FrhFWq8ThojKIgjOfRwGcA7eJYFCtOCMcuNc58ZO6CBtDFyP6AfHXA8= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994855374728.5876890433874; Wed, 21 Jan 2026 03:27:35 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLX-00037M-25; Wed, 21 Jan 2026 06:25:59 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLJ-0002x2-A8 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:48 -0500 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLE-0007q7-SM for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:44 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 67EC2442A3; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E152CC4AF09; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJi-0hWp; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=8e5RF/aQwhLqNXjNsMZpkBi52YYeY693ooTiAmxMxa0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tY0DvxcpWZKmJnsN/8N5rNOl3gpN+1myG0C7+Ghou9bzDqlFvvfoKdaOryDipU3hU wvyQUtfcNzRdSy14P1C9nvBEMPJARaeGSqhpyZaY/D9q9jck+88FAeaIrQsm8wrB0q vcd2bWO1b+Df2km/Fm1zB645PclP1VSAfpFjQqZ2gYf7wqVgvHDSfpSIyXepTu8W6a lwbnvL8g+puhuid2doM2/rv37gj3PFDDKEkO5nS7aFz8J2FmVOEhzxwuUbvlN5Lqlm U/Axg/jITorE6VoDiF4LgTwbFphSJSzlPD1PHZo/W8Ujp1YfZBQ7U943ABw4KEXOat IHMD1/Ok2mszA== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 07/13] scripts/ghes_inject: add a logic to decode CPER Date: Wed, 21 Jan 2026 12:25:15 +0100 Message-ID: <71dc0f56a7856cc9fe9f0c9c915b56cd49d6f0bd.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c0a:e001:78e:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994857209154100 Add a decoder to help debugging injected CPERs. This is more relevant when we add fuzzy-testing error inject, as the decoder is helpful to identify what it packages will be sent via QEMU to the firmware-fist logic. By purpose, I opted to keep this completely independent from the encoders implementation, as this can be used even when there are no encoders for a certain GGUID type (except for a fuzzy logic test, which is pretty much independent of the records meaning). Signed-off-by: Mauro Carvalho Chehab --- MAINTAINERS | 1 + scripts/ghes_decode.py | 1155 ++++++++++++++++++++++++++++++++++++++++ scripts/qmp_helper.py | 3 + 3 files changed, 1159 insertions(+) create mode 100644 scripts/ghes_decode.py diff --git a/MAINTAINERS b/MAINTAINERS index 36a2be3ddba7..a970c47dd089 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2225,6 +2225,7 @@ S: Maintained F: hw/arm/ghes_cper.c F: hw/acpi/ghes_cper_stub.c F: qapi/acpi-hest.json +F: scripts/ghes_decode.py F: scripts/ghes_inject.py F: scripts/arm_processor_error.py F: scripts/qmp_helper.py diff --git a/scripts/ghes_decode.py b/scripts/ghes_decode.py new file mode 100644 index 000000000000..6c7fdfe84e3a --- /dev/null +++ b/scripts/ghes_decode.py @@ -0,0 +1,1155 @@ +#!/usr/bin/env python3 +# +# pylint: disable=3DR0903,R0912,R0913,R0915,R0917,R1713,E1121,C0302,W0613 +# SPDX-License-Identifier: GPL-2.0-or-later +# +# Copyright (C) 2025 Mauro Carvalho Chehab + +""" +Helper classes to decode a generic error data entry. + +By purpose, the logic here is independent of the logic inside qmp_helper +and other modules. With a different implementation, it is more likely to +discover bugs at the error injection logic. Also, as this can be used to +dump errors injected by reproducing an error mesage or for fuzzy error +injection, it can't rely at the encoding logic inside each module of +ghes_inject.py. + +To make the decoder simple, the decode logic here is at field level, not +trying to decode bitmaps. +""" + +from typing import Optional + +class DecodeField(): + """ + Helper functions to decode a field, printing its results + """ + + def __init__(self, cper_data: bytearray): + """Initialize the decoder with a cper bytearray""" + self.data =3D cper_data + self.pos =3D 0 + self.past_end =3D False + + @property + def remaining(self): + """Returns the number of bytes not decoded yet""" + return max(0, len(self.data) - self.pos) + + @property + def is_end(self): + """ + Returns true if all bytes were decoded and it didn't try + to read past the end. + """ + if not self.past_end and self.pos =3D=3D len(self.data): + return True + + return False + + def decode(self, name: str, size: int, ftype: str, + pos: Optional[int] =3D None, + show_incomplete: Optional[bool] =3D False) -> None: + """ + Decodes and outputs a specified field from an ACPI table. + + For ints, we opted to decode them byte by byte, thus not being + limited to an integer max size. + + Arguments: + name: name of the field + size: number of bytes of the field + ftype: field type (str, int, guid, bcd) + pos: if specified, show a field at the specific position. If + not, use last position and increment it with size at the = end + """ + if pos: + cur_pos =3D pos + else: + cur_pos =3D self.pos + + try: + if cur_pos + size > len(self.data): + if not pos: + self.past_end =3D True + + if not show_incomplete: + decoded =3D "N/A" + return None + + raw_data =3D self.data[cur_pos:cur_pos + size] + + decoded =3D "" + if ftype =3D=3D "str": + failures =3D False + for b in raw_data: + if b >=3D 32 and b <=3D 126: # pylint: disa= ble=3DR1716 + decoded +=3D chr(b) + elif b: + decoded +=3D '.' + failures =3D True + else: + decoded +=3D r'\x0' + + if failures: + decoded +=3D " # warning: non-ascii chars found" + + if self.past_end: + if decoded: + decoded +=3D " " + decoded +=3D "EOL" + + elif ftype =3D=3D "int": + i =3D 0 + for b in reversed(raw_data): + i +=3D 1 + if len(raw_data) > 8 and i > 1: + decoded +=3D " " + + decoded +=3D f"{b:02x}" + + if self.past_end: + if decoded: + decoded +=3D " " + decoded +=3D "EOL" + + elif ftype =3D=3D "guid": + if len(raw_data) !=3D 16 or size !=3D 16: + decoded =3D "Invalid GUID" + else: + for b in reversed(raw_data[0:4]): + decoded +=3D f"{b:02x}" + + decoded +=3D "-" + + for b in reversed(raw_data[4:6]): + decoded +=3D f"{b:02x}" + + decoded +=3D "-" + + for b in reversed(raw_data[6:8]): + decoded +=3D f"{b:02x}" + + decoded +=3D "-" + + for b in raw_data[8:10]: + decoded +=3D f"{b:02x}" + + decoded +=3D "-" + + for b in raw_data[10:]: + decoded +=3D f"{b:02x}" + + raw_data =3D decoded + + elif ftype =3D=3D "bcd": + val =3D 0 + for b in raw_data: + if (b & 0xf0) > 9 or (b & 0x0f) > 9: + raise ValueError("Invalid BCD value") + val =3D (val << 4) | (b & 0x0f) + + decoded =3D f"{val:0{size * 2}x}" + + if self.past_end: + if decoded: + decoded +=3D " " + decoded +=3D "EOL" + else: + decoded =3D f"Warning: Unknown format {ftype}" + + except ValueError as e: + decoded =3D f"Error decoding {e}" + + finally: + print(f"{name:<26s}: {decoded}") + if not pos: + self.pos +=3D size + + return raw_data + + +class DecodeProcGeneric(): + """ + Class to decode a Generic Processor Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + # GUID for Generic Processor Error + guid =3D "9876ccad-47b4-4bdb-b65e-16f193c4f3db" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Processor Type", 1, "int"), + ("Processor ISA", 1, "int"), + ("Processor Error Type", 1, "int"), + ("Operation", 1, "int"), + ("Flags", 1, "int"), + ("Level", 1, "int"), + ("Reserved", 2, "int"), + ("CPU Version Info", 8, "int"), + ("CPU Brand String", 128, "str"), + ("Processor ID", 8, "int"), + ("Target Address", 8, "int"), + ("Requestor Identifier", 8, "int"), + ("Responder Identifier", 8, "int"), + ("Instruction IP", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Generic Processor Error""" + print("Generic Processor Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeProcGeneric.guid, DecodeProcGeneric)] + +class DecodeProcX86(): + """ + Class to decode an x86 Processor Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for x86 Processor Error + guid =3D "dc3ea0b0-a144-4797-b95b-53fa242b6e1d" + + pei_fields =3D [ + ("Error Structure Type", 16, "guid"), + ("Validation Bits", 8, "int"), + ("Check Information", 8, "int"), + ("Target Identifier", 8, "int"), + ("Requestor Identifier", 8, "int"), + ("Responder Identifier", 8, "int"), + ("Instruction Pointer", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode x86 Processor Error""" + print("x86 Processor Error") + + val =3D self.cper.decode("Validation Bits", 8, "int") + try: + val_bits =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + val_bits =3D 0 + + error_info_num =3D (val_bits >> 2) & 0x3f # bits 2-7 + context_info_num =3D (val_bits >> 8) & 0xff # bits 8-13 + + self.cper.decode("Local APIC_ID", 8, "int") + self.cper.decode("CPUID Info", 48, "int") + + for pei in range(0, error_info_num): + if self.cper.past_end: + return + + print() + print(f"Processor Error Info {pei}") + for name, size, ftype in self.pei_fields: + self.cper.decode(name, size, ftype) + + for ctx in range(0, context_info_num): + if self.cper.past_end: + return + + print() + print(f"Context {ctx}") + + self.cper.decode("Register Context Type", 2, "int") + + val =3D self.cper.decode("Register Array Size", 2, "int") + try: + context_size =3D int(int.from_bytes(val, byteorder=3D'litt= le') / 8) + except ValueError, TypeError: + context_size =3D 0 + + self.cper.decode("MSR Address", 4, "int") + self.cper.decode("MM Register Address", 8, "int") + + for reg in range(0, context_size): + if self.cper.past_end: + return + self.cper.decode(f"Register offset {reg:<3}", 8, "int") + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeProcX86.guid, DecodeProcX86)] + +class DecodeProcItanium(): + """ + Class to decode an Itanium Processor Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for Itanium Processor Error + guid =3D "e429faf1-3cb7-11d4-bca7-0080c73c8881" + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """ + Decode Itanium Processor Error. + + Itanum processors stopped being sold in 2021. Probably not much + sense implementing a decoder for it. + """ + + print("Itanium Processor Error") + + remaining =3D self.cper.remaining + if remaining: + print() + self.cper.decode("Data", remaining, "int") + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeProcItanium.guid, DecodeProcItanium)] + + +class DecodeProcArm(): + """ + Class to decode an ARM Processor Error as defined at + UEFI 2.6 - N.2.2 Section Descriptor + """ + + # GUID for ARM Processor Error + guid =3D "e19e3d16-bc11-11e4-9caa-c2051d5d46b0" + + arm_pei_fields =3D [ + ("Version", 1, "int"), + ("Length", 1, "int"), + ("valid", 2, "int"), + ("type", 1, "int"), + ("multiple-error", 2, "int"), + ("flags", 1, "int"), + ("error-info", 8, "int"), + ("virt-addr", 8, "int"), + ("phy-addr", 8, "int"), + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Processor ARM""" + + print("ARM Processor Error") + + start =3D self.cper.pos + + self.cper.decode("Valid", 4, "int") + + val =3D self.cper.decode("Error Info num", 2, "int") + try: + error_info_num =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + error_info_num =3D 0 + + val =3D self.cper.decode("Context Info num", 2, "int") + try: + context_info_num =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + context_info_num =3D 0 + + val =3D self.cper.decode("Section Length", 4, "int") + try: + section_length =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + section_length =3D 0 + + self.cper.decode("Error affinity level", 1, "int") + self.cper.decode("Reserved", 3, "int") + self.cper.decode("MPIDR_EL1", 8, "int") + self.cper.decode("MIDR_EL1", 8, "int") + self.cper.decode("Running State", 4, "int") + self.cper.decode("PSCI State", 4, "int") + + for pei in range(0, error_info_num): + if self.cper.past_end: + return + + print() + print(f"Processor Error Info {pei}") + for name, size, ftype in self.arm_pei_fields: + self.cper.decode(name, size, ftype) + + for ctx in range(0, context_info_num): + if self.cper.past_end: + return + + print() + print(f"Context {ctx}") + self.cper.decode("Version", 2, "int") + self.cper.decode("Register Context Type", 2, "int") + val =3D self.cper.decode("Register Array Size", 4, "int") + try: + context_size =3D int(int.from_bytes(val, byteorder=3D'litt= le') / 8) + except ValueError: + context_size =3D 0 + + for reg in range(0, context_size): + if self.cper.past_end: + return + self.cper.decode(f"Register {reg:<3}", 8, "int") + + remaining =3D max(section_length + start - self.cper.pos, 0) + if remaining: + print() + self.cper.decode("Vendor data", remaining, "int") + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeProcArm.guid, DecodeProcArm)] + + +class DecodePlatformMem(): + """ + Class to decode a Platform Memory Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for Platform Memory Error + guid =3D "a5bc1114-6f64-4ede-b863-3e83ed7c83b1" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Error Status", 8, "int"), + ("Physical Address", 8, "int"), + ("Physical Address Mask", 8, "int"), + ("Node", 2, "int"), + ("Card", 2, "int"), + ("Module", 2, "int"), + ("Bank", 2, "int"), + ("Device", 2, "int"), + ("Row", 2, "int"), + ("Column", 2, "int"), + ("Bit Position", 2, "int"), + ("Requestor ID", 8, "int"), + ("Responder ID", 8, "int"), + ("Target ID", 8, "int"), + ("Memory Error Type", 1, "int"), + ("Extended", 1, "int"), + ("Rank Number", 2, "int"), + ("Card Handle", 2, "int"), + ("Module Handle", 2, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Platform Memory Error""" + print("Platform Memory Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodePlatformMem.guid, DecodePlatformMem)] + + +class DecodePlatformMem2(): + """ + Class to decode a Platform Memory Error (Type 2) as defined at + UEFI 2.5 - N.2.6. Memory Error Section 2 + """ + + # GUID for Platform Memory Error Type 2 + guid =3D "61ec04fc-48e6-d813-25c9-8daa44750b12" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Error Status", 8, "int"), + ("Physical Address", 8, "int"), + ("Physical Address Mask", 8, "int"), + ("Node", 2, "int"), + ("Card", 2, "int"), + ("Module", 2, "int"), + ("Bank", 2, "int"), + ("Device", 4, "int"), + ("Row", 4, "int"), + ("Column", 4, "int"), + ("Rank", 4, "int"), + ("Bit Position", 4, "int"), + ("Chip Identification", 1, "int"), + ("Memory Error Type", 1, "int"), + ("Status", 1, "int"), + ("Reserved", 1, "int"), + ("Requestor ID", 8, "int"), + ("Responder ID", 8, "int"), + ("Target ID", 8, "int"), + ("Card Handle", 4, "int"), + ("Module Handle", 4, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Platform Memory Error Type 2""" + print("Platform Memory Error Type 2") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodePlatformMem2.guid, DecodePlatformMem2)] + + +class DecodePCIe(): + """ + Class to decode a PCI Express Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + # GUID for PCI Express Error + guid =3D "d995e954-bbc1-430f-ad91-b44dcb3c6f35" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Port Type", 4, "int"), + ("Version", 4, "int"), + ("Command Status", 4, "int"), + ("RCRB High Address", 4, "int"), + ("Device ID", 16, "int"), + ("Device Serial Number", 8, "int"), + ("Bridge Control Status", 4, "int"), + ("Capability Structure", 60, "int"), + ("AER Info", 96, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode PCI Express Error""" + print("PCI Express Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodePCIe.guid, DecodePCIe)] + + +class DecodePCIBus(): + """ + Class to decode a PCI Bus Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for PCI Bus Error + guid =3D "c5753963-3b84-4095-bf78-eddad3f9c9dd" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Error Status", 8, "int"), + ("Error Type", 2, "int"), + ("Bus Id", 2, "int"), + ("Reserved", 4, "int"), + ("Bus Address", 8, "int"), + ("Bus Data", 8, "int"), + ("Bus Command", 8, "int"), + ("Bus Requestor Id", 8, "int"), + ("Bus Completer Id", 8, "int"), + ("Target Id", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode PCI Bus Error""" + print("PCI Bus Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodePCIBus.guid, DecodePCIBus)] + + +class DecodePCIDev(): + """ + Class to decode a PCI Device Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for PCI Device Error + guid =3D "eb5e4685-ca66-4769-b6a2-26068b001326" + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode PCI Device Error""" + print("PCI Device Error") + + self.cper.decode("Validation Bits", 8, "int") + self.cper.decode("Error Status", 8, "int") + self.cper.decode("Id Info", 16, "int") + + val =3D self.cper.decode("Memory Number", 4, "int") + try: + mem_num =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + mem_num =3D 0 + + self.cper.decode("IO Number", 4, "int") + + for mem in range(0, mem_num): + if self.cper.past_end: + return + + print() + print(f"Register Data Pair {mem}") + self.cper.decode("Register 0", 8, "int") + self.cper.decode("Register 1", 8, "int") + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodePCIDev.guid, DecodePCIDev)] + + +class DecodeFWError(): + """ + Class to decode a Firmware Error as defined at + UEFI 2.1 - N.2.2 Section Descriptor + """ + + # GUID for Firmware Error + guid =3D "81212a96-09ed-4996-9471-8d729c8e69ed" + + # NOTE: UEFI 2.11 has a discrepancy, as it lists: + # byte offset 1: revision (1 byte) + # byte offset 1: reserved (7 bytes) + # + # both starting at position 1. We opted to change reserved size to 6, + # in order to better cope with the spec issues + + fields =3D [ + ("Firmware Error Record Type", 1, "int"), + ("Revision", 1, "int"), + ("Reserved", 6, "int"), + ("Record Identifier", 8, "int"), + ("Record identifier GUID extension", 16, "guid") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Firmware Error""" + print("Firmware Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeFWError.guid, DecodeFWError)] + + +class DecodeDMAGeneric(): + """ + Class to decode a Generic DMA Error as defined at + UEFI 2.2 - N.2.2 Section Descriptor + """ + + # GUID for Generic DMA Error + guid =3D "5b51fef7-c79d-4434-8f1b-aa62de3e2c64" + + fields =3D [ + ("Requester-ID", 2, "int"), + ("Segment Number", 2, "int"), + ("Fault Reason", 1, "int"), + ("Access Type", 1, "int"), + ("Address Type", 1, "int"), + ("Architecture Type", 1, "int"), + ("Device Address", 8, "int"), + ("Reserved", 16, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode Generic DMA Error""" + print("Generic DMA Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeDMAGeneric.guid, DecodeDMAGeneric)] + + +class DecodeDMAVT(): + """ + Class to decode a DMA Virtualization Technology Error as defined at + UEFI 2.2 - N.2.2 Section Descriptor + """ + + # GUID for DMA VT Error + guid =3D "71761d37-32b2-45cd-a7d0-b0fedd93e8cf" + + fields =3D [ + ("Version", 1, "int"), + ("Revision", 1, "int"), + ("OemId", 6, "int"), + ("Capability", 8, "int"), + ("Extended Capability", 8, "int"), + ("Global Command", 4, "int"), + ("Global Status", 4, "int"), + ("Fault Status", 4, "int"), + ("Reserved", 12, "int"), + ("Fault record", 16, "int"), + ("Root Entry", 16, "int"), + ("Context Entry", 16, "int"), + ("Level 6 Page Table Entry", 8, "int"), + ("Level 5 Page Table Entry", 8, "int"), + ("Level 4 Page Table Entry", 8, "int"), + ("Level 3 Page Table Entry", 8, "int"), + ("Level 2 Page Table Entry", 8, "int"), + ("Level 1 Page Table Entry", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode DMA VT Error""" + print("DMA VT Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeDMAVT.guid, DecodeDMAVT)] + + +class DecodeDMAIOMMU(): + """ + Class to decode an IOMMU DMA Error as defined at + UEFI 2.2 - N.2.2 Section Descriptor + """ + + # GUID for IOMMU DMA Error + guid =3D "036f84e1-7f37-428c-a79e-575fdfaa84ec" + + fields =3D [ + ("Revision", 1, "int"), + ("Reserved", 7, "int"), + ("Control", 8, "int"), + ("Status", 8, "int"), + ("Reserved", 8, "int"), + ("Event Log Entry", 16, "int"), + ("Reserved", 16, "int"), + ("Device Table Entry", 32, "int"), + ("Level 6 Page Table Entry", 8, "int"), + ("Level 5 Page Table Entry", 8, "int"), + ("Level 4 Page Table Entry", 8, "int"), + ("Level 3 Page Table Entry", 8, "int"), + ("Level 2 Page Table Entry", 8, "int"), + ("Level 1 Page Table Entry", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode IOMMU DMA Error""" + print("IOMMU DMA Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeDMAIOMMU.guid, DecodeDMAIOMMU)] + + +class DecodeCCIXPER(): + """ + Class to decode a CCIX Protocol Error as defined at + UEFI 2.8 - N.2.12. CCIX PER Log Error Section + """ + + # GUID for CCIX Protocol Error + guid =3D "91335ef6-ebfb-4478-a6a6-88b728cf75d7" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("CCIX Source ID", 1, "int"), + ("CCIX Port ID", 1, "int"), + ("Reserved", 2, "int"), + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode CCIX Protocol Error""" + print("CCIX Protocol Error") + + val =3D self.cper.decode("Length", 4, "int") + try: + length =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + length =3D 0 + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + remaining =3D max(0, length - self.cper.pos) + for dword in range(0, int(remaining / 4)): + if self.cper.past_end: + return + + self.cper.decode(f"CCIX PER log {dword}", 4, "int") + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeCCIXPER.guid, DecodeCCIXPER)] + + +class DecodeCXLProtErr(): + """ + Class to decode a CXL Protocol Error as defined at + UEFI 2.9 - N.2.13. Compute Express Link (CXL) Protocol Error Section + """ + + # GUID for CXL Protocol Error + guid =3D "80b9efb4-52b5-4de3-a777-68784b771048" + + fields =3D [ + ("Validation Bits", 8, "int"), + ("CXL Agent Type", 1, "int"), + ("Reserved", 7, "int"), + ("CXL Agent Address", 8, "int"), + ("Device ID", 16, "int"), + ("Device Serial Number", 8, "int"), + ("Capability Structure", 60, "int"), + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode CXL Protocol Error""" + print("CXL Protocol Error") + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + val =3D self.cper.decode("CXL DVSEC Length", 2, "int") + try: + cxl_devsec_len =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + cxl_devsec_len =3D 0 + + val =3D self.cper.decode("CXL Error Log Length", 2, "int") + try: + cxl_error_log_len =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + cxl_error_log_len =3D 0 + + self.cper.decode("Reserved", 4, "int") + self.cper.decode("CXL DVSEC", cxl_devsec_len, "int", + show_incomplete=3DTrue) + self.cper.decode("CXL Error Log", cxl_error_log_len, "int", + show_incomplete=3DTrue) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeCXLProtErr.guid, DecodeCXLProtErr)] + + +class DecodeCXLCompEvent(): + """ + Class to decode a CXL Component Error as defined at + UEFI 2.9 - N.2.14. CXL Component Events Section + + Currently, the decoder handles only the common fields, displaying + the CXL Component Event Log field in bytes. + """ + + # GUIDs, as defined at CXL specification 3.2: 8.2.10.2.1 Event Records + guids =3D [ + ("General Media", "fbcd0a77-c260-417f-85a9-088b1621eb= a6"), + ("DRAM", "601dcbb3-9c06-4eab-b8af-4e9bfb5c96= 24"), + ("Memory Module", "fe927475-dd59-4339-a586-79bab113bc= 74"), + ("Memory Sparing", "e71f3a40-2d29-4092-8a39-4d1c966c7c= 65"), + ("Physical Switch", "77cf9271-9c02-470b-9fe4-bc7b75f2da= 97"), + ("Virtual Switch", "40d26425-3396-4c4d-a5da-3d472a63af= 25"), + ("MDL Port", "8dc44363-0c96-4710-b7bf-04bb99534c= 3f"), + ("Dynamic Capabilities", "ca95afa7-f183-4018-8c2f-95268e101a= 2a"), + ] + + fields =3D [ + ("Validation Bits", 8, "int"), + ("Device ID", 12, "int"), + ("Device Serial Number", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode CXL Protocol Error""" + for name, guid_event in DecodeCXLCompEvent.guids: + if guid =3D=3D guid_event: + print(f"CXL {name} Event Record") + break + + val =3D self.cper.decode("Length", 4, "int") + try: + length =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + length =3D 0 + + for name, size, ftype in self.fields: + self.cper.decode(name, size, ftype) + + length =3D max(0, length - self.cper.pos) + + self.cper.decode("CXL Component Event Log", length, "int", + show_incomplete=3DTrue) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + + guid_list =3D [] + + for _, guid in DecodeCXLCompEvent.guids: + guid_list.append((guid, DecodeCXLCompEvent)) + + return guid_list + + +class DecodeFRUMemoryPoison(): + """ + Class to decode a CXL Protocol Error as defined at + UEFI 2.11 - N.2.15 FRU Memory Poison Section + """ + + # GUID for FRU Memory Poison Section + guid =3D "5e4706c1-5356-48c6-930b-52f2120a4458" + + common_fields =3D [ + ("Checksum", 4, "int"), + ("Validation Bits", 8, "int"), + ("FRU Architecture Type", 4, "int"), + ("FRU Architecture Value", 8, "int"), + ("FRU Identifier Type", 4, "int"), + ("FRU Identifier Value", 8, "int") + ] + + poison_fields =3D [ + ("Poison Timestamp", 8, "int"), + ("Hardware Identifier Type", 4, "int"), + ("Hardware Identifier Value", 8, "int"), + ("Address Type", 4, "int"), + ("Address Value", 8, "int") + ] + + def __init__(self, cper: DecodeField): + self.cper =3D cper + + def decode(self, guid): + """Decode CXL Protocol Error""" + print("FRU Memory Poison") + + for name, size, ftype in self.common_fields: + self.cper.decode(name, size, ftype) + + val =3D self.cper.decode("Poison List Entries", 4, "int") + try: + poison_list_entries =3D int.from_bytes(val, byteorder=3D'littl= e') + except ValueError, TypeError: + poison_list_entries =3D 0 + + for entry in range(0, poison_list_entries): + if self.cper.past_end: + return + + print() + print(f"Poison List {entry}") + for name, size, ftype in self.poison_fields: + if self.cper.past_end: + return + + self.cper.decode(name, size, ftype) + + @staticmethod + def decode_list(): + """ + Returns a tuple with the GUID and class + """ + return [(DecodeFRUMemoryPoison.guid, DecodeFRUMemoryPoison)] + + +class DecodeGhesEntry(): + """ + Class to decode a GHESv2 element, as defined at: + ACPI 6.1: 18.3.2.8 Generic Hardware Error Source version 2 + """ + + # Fields present on all CPER records + common_fields =3D [ + # Generic Error Status Block fields + ("Block Status", 4, "int", None), + ("Raw Data Offset", 4, "int", "raw_data_offset"), + ("Raw Data Length", 4, "int", "raw_data_len"), + ("Data Length", 4, "int", None), + ("Error Severity", 4, "int", None), + + # Generic Error Data Entry + ("Section Type", 16, "guid", "session_type"), + ("Error Severity", 4, "int", None), + ("Revision", 2, "int", None), + ("Validation Bits", 1, "int", None), + ("Flags", 1, "int", None), + ("Error Data Length", 4, "int", None), + ("FRU Id", 16, "guid", None), + ("FRU Text", 20, "str", None), + ("Timestamp", 8, "bcd", None), + ] + + def __init__(self, cper_data: bytearray): + """ + Initializes a byte array, decoding it, printing results at the + screen. + """ + + # Create a decode list with the per-type decoders + decode_list =3D [] + decode_list +=3D DecodeProcGeneric.decode_list() + decode_list +=3D DecodeProcX86.decode_list() + decode_list +=3D DecodeProcItanium.decode_list() + decode_list +=3D DecodeProcArm.decode_list() + decode_list +=3D DecodePlatformMem.decode_list() + decode_list +=3D DecodePlatformMem2.decode_list() + decode_list +=3D DecodePCIe.decode_list() + decode_list +=3D DecodePCIBus.decode_list() + decode_list +=3D DecodePCIDev.decode_list() + decode_list +=3D DecodeFWError.decode_list() + decode_list +=3D DecodeDMAGeneric.decode_list() + decode_list +=3D DecodeDMAVT.decode_list() + decode_list +=3D DecodeDMAIOMMU.decode_list() + decode_list +=3D DecodeCCIXPER.decode_list() + decode_list +=3D DecodeCXLProtErr.decode_list() + decode_list +=3D DecodeCXLCompEvent.decode_list() + decode_list +=3D DecodeFRUMemoryPoison.decode_list() + + # Handle common types + cper =3D DecodeField(cper_data) + + fields =3D {} + for name, size, ftype, var in self.common_fields: + val =3D cper.decode(name, size, ftype) + + if ftype =3D=3D "int": + try: + val =3D int.from_bytes(val, byteorder=3D'little') + except ValueError, TypeError: + val =3D 0 + + if var is not None: + fields[var] =3D val + + if fields["raw_data_len"]: + cper.decode("Raw Data", fields["raw_data_len"], + "int", pos=3Dfields["raw_data_offset"]) + + if not fields["session_type"]: + return + + print() + + # Now, decode the rest of the record for known decoders + for guid, cls in decode_list: + if fields["session_type"] =3D=3D guid: + dec =3D cls(cper) + dec.decode(guid) + + if not cper.is_end: + print() + print("Warning: incomplete decode or broken CPER") + if cper.remaining: + cper.decode("Extra Data", cper.remaining, "int") + + print() + return + + # If we don't have a class to decode the full payload, + # output the undecoded part + print(f"Unknown GGID: {fields['session_type']}") + remaining =3D cper.remaining + if remaining: + cper.decode("Payload", remaining, "int") + + print() diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 63f3df2d75c3..32baca17ce10 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -21,6 +21,7 @@ sys.path.append(os_path.join(qemu_dir, 'python')) =20 from qemu.qmp.legacy import QEMUMonitorProtocol + from ghes_decode import DecodeGhesEntry =20 except ModuleNotFoundError as exc: print(f"Module '{exc.name}' not found.") @@ -677,6 +678,8 @@ def send_cper(self, notif_type, payload, =20 util.dump_bytearray("Payload", payload) =20 + DecodeGhesEntry(cper_data) + return self.send_cper_raw(cper_data, timeout=3Dtimeout) =20 def search_qom(self, path, prop, regex): --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994881; cv=none; d=zohomail.com; s=zohoarc; b=brFBcbSgLGVmhNUtE2XkYGl8FhSF9HIZFeTX60jGVMJ/DbOD9rqlPVnXTGmF+wPsTKLOOjn1dtkSAYyvxejpJmm5QxeBWmqjZOJJruCItpioVeYgB52nzu6bGK6HzF6NbyIbGUJ7ul77y8NpCYxNf0WBiiainy9f4jIv7PV56Yk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994881; 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=tiy5jwlvNJtgYrKL1Zp71cKxHcxJ+ZogQWSGqcDSkZk=; b=hMP9MqW4hpMSS56n6onpwAiMRUp7FAD7krV9P04z2elZAzu9C0HGtwuM/ZJEdeMJeMY9EkFY+h8UbUE/mXpdDh8YeIoYVVE12zlZj/EWKFCcfjFU3xltoizdisZchwh9O+oUOPnF6/vPyZ/TlEiVYRje7oRWc6Xu3C/Cm+MKVt0= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994881066285.45539607051944; Wed, 21 Jan 2026 03:28:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLZ-0003Bw-Ee; Wed, 21 Jan 2026 06:26:01 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLF-0002rN-AU for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:42 -0500 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0007my-P0 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 555B3441EA; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E92CEC2BC87; Wed, 21 Jan 2026 11:25:24 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJm-0oM7; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=WLJTrMBVRNsrytHUwDMQLh8d+CckHuO5TQBxhn4AWog=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=s8/1scL14pnxSE6QTeXMtFh7Rg0nWVOq3sNyEIffw66Orgc7e7Eu+5ZOpE4zx7bLU gMyvf61HYMhGNC4h+jCa61fkRwANtw7f84lhGJ6yzlifp8GSw/dsEYkUDsePe0R5M/ I0gKk390C0FolbxqXzj9A8NF3sn707O6j68tynEgnW+vpVdel6fK1aiS3T1FeLYtSV OIriU+IGHQKdxn+hiYNannQzsyNn/EaccYY9rdCRLJkRN91Oe0KCNBkwoBzh+/MkiU JwSTpoqyoSNg5nrqSul/Ba9FVcKKyJ+g1Pt6fbH1IeWv5eTmZYxd/G98FgbTHh+Brl yJV7WbGDMFUrA== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 08/13] scripts/ghes_inject: exit 1 if command was not sent Date: Wed, 21 Jan 2026 12:25:16 +0100 Message-ID: <746cc65bbde60ebe2232b048d6448d19466601c5.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c0a:e001:78e:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994883425154100 add a return code to subparser func() and return 1 if the command failed. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/arm_processor_error.py | 2 +- scripts/ghes_inject.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/arm_processor_error.py b/scripts/arm_processor_error.py index 73d069f070d4..d9845adb0c0a 100644 --- a/scripts/arm_processor_error.py +++ b/scripts/arm_processor_error.py @@ -473,4 +473,4 @@ def send_cper(self, args): =20 self.data =3D data =20 - qmp_cmd.send_cper(cper_guid.CPER_PROC_ARM, self.data) + return qmp_cmd.send_cper(cper_guid.CPER_PROC_ARM, self.data) diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 9a235201418b..6ac917d0b5db 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -43,7 +43,8 @@ def main(): =20 args =3D parser.parse_args() if "func" in args: - args.func(args) + if not args.func(args): + sys.exit(1) else: sys.exit(f"Please specify a valid command for {sys.argv[0]}") =20 --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994826; cv=none; d=zohomail.com; s=zohoarc; b=RkZGqWJ18Z0gIofLLXnsHrqHigxDiHJpuvvygj+r32he1BuWtXYoU++Wuc6ve7uGGoInSov0DiaVrEKDL3s36e0jQeqRjwnnMRUMl021Asnp7fOIgwLwiant87pNmnqA5qA1PJ3GV7tXH6QCxF8R4WJu+TZeil2GyQz7me5wsHw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994826; 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=j1VX8NTsmcC7VHxAXOG3RAIXbPbO+HOv1gt0PF2dWmg=; b=RZnfpn1k36smAmCqVmDXN4nlOwhizDycHHd4738faQ8iOYYMogf5eKMZbx8ajUM7k55BZI6YOO9ayprHVJoTt9JUVYG4+19kZNK1FEcXLf9hspOrnW6rDFh83M/XJJ91RPAYGZmigGEM8ZSIAkfj/N27nrUg7y9ht049fS8OsSc= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994826809658.2556808203519; Wed, 21 Jan 2026 03:27:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLa-0003DJ-E4; Wed, 21 Jan 2026 06:26:02 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLH-0002ty-9g for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:43 -0500 Received: from tor.source.kernel.org ([2600:3c04:e001:324:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLC-0007ow-LY for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:42 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 90E2D60129; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 066B9C4AF0D; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJq-0vJd; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=Hu2Nuwxl05GDxOG3ScOICaIXDI/9+rYXUfgkR+kkZQ0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=foVDdA/RGyJ26rskWO1o7EhNbpjRdT4l9uFLHC32ADEP4xwzjJ2cmedJ0otawVa7I m+F6llD7hKcRahu/n6914X2lpS6YIj0cR+ZWtdQZzyohyCcRLOMmj62lhssOGunnPj cRHhP5Wq2p7kc8jZrsdoxYI0GTtovmGY3qBbd3R6iGCdfbSsYuZ3nU2ZWLDD+ufRyL DRyQOTb04ssAnIfZCv8kN799PRW58GcSDSoHphv+HglIS5j8Ici2mhKg6MxPWrI1ky 86oXIOiu200WZMUwKcamuIwvO9J6rjZjX2GgVn0bILP3wH+NuJXsjkGB7APagmyabl CHumBI6JwX9VQ== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 09/13] scripts/ghes_inject: add a handler for PCIe bus error Date: Wed, 21 Jan 2026 12:25:17 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c04:e001:324:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994828681154100 Add a logic to do PCIe BUS error injection. On Linux Kernel, despite CPER_SEC_PCI_X_BUS macro is defined for such event, ghes.c doesn't implement support for it yet: [16950.077494] {26}[Hardware Error]: Hardware error from APEI Generic Hardw= are Error Source: 1 [16950.077866] {26}[Hardware Error]: event severity: recoverable [16950.078118] {26}[Hardware Error]: Error 0, type: recoverable [16950.078444] {26}[Hardware Error]: section type: unknown, c5753963-3b84= -4095-bf78-eddad3f9c9dd [16950.078800] {26}[Hardware Error]: section length: 0x48 [16950.079069] {26}[Hardware Error]: 00000000: 00000000 00000000 00000000= 00000000 ................ [16950.079442] {26}[Hardware Error]: 00000010: 00000001 00000000 00000000= 00000000 ................ [16950.079811] {26}[Hardware Error]: 00000020: 00000000 00000000 00000000= 00000000 ................ [16950.080181] {26}[Hardware Error]: 00000030: 00000000 00000000 00000000= 00000000 ................ [16950.080538] {26}[Hardware Error]: 00000040: 00000000 00000000 = ........ Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- MAINTAINERS | 1 + scripts/ghes_inject.py | 2 + scripts/pcie_bus_error.py | 146 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 scripts/pcie_bus_error.py diff --git a/MAINTAINERS b/MAINTAINERS index a970c47dd089..48067a618523 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2228,6 +2228,7 @@ F: qapi/acpi-hest.json F: scripts/ghes_decode.py F: scripts/ghes_inject.py F: scripts/arm_processor_error.py +F: scripts/pcie_bus_error.py F: scripts/qmp_helper.py =20 ppc4xx diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 6ac917d0b5db..29a6a57508cd 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -12,6 +12,7 @@ import sys =20 from arm_processor_error import ArmProcessorEinj +from pcie_bus_error import PcieBusError =20 EINJ_DESC =3D """ Handle ACPI GHESv2 error injection logic QEMU QMP interface. @@ -40,6 +41,7 @@ def main(): subparsers =3D parser.add_subparsers() =20 ArmProcessorEinj(subparsers) + PcieBusError(subparsers) =20 args =3D parser.parse_args() if "func" in args: diff --git a/scripts/pcie_bus_error.py b/scripts/pcie_bus_error.py new file mode 100644 index 000000000000..e8285b5dcc84 --- /dev/null +++ b/scripts/pcie_bus_error.py @@ -0,0 +1,146 @@ +#!/usr/bin/env python3 +# +# pylint: disable=3DC0114,R0903 +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2024 Mauro Carvalho Chehab + +from qmp_helper import qmp, util, cper_guid + +class PcieBusError: + """ + Implements PCI Express bus error injection via GHES + """ + + def __init__(self, subparsers): + """Initialize the error injection class and add subparser""" + + # Valid values + self.valid_bits =3D { + "status": util.bit(0), + "type": util.bit(1), + "bus-id": util.bit(2), + "bus-addr": util.bit(3), + "bus-data": util.bit(4), + "command": util.bit(5), + "requestor-id": util.bit(6), + "completer-id": util.bit(7), + "target-id": util.bit(8), + } + + self.bus_command_bits =3D { + "pci": 0, # Bit 56 is zero + "pci-x": util.bit(56) + } + + self.data =3D bytearray() + + parser =3D subparsers.add_parser("pcie-bus", + description=3D"Generate PCIe bus er= ror CPER") + g_pcie =3D parser.add_argument_group("PCIe bus error") + + valid_bits =3D ",".join(self.valid_bits.keys()) + bus_command_bits =3D ",".join(self.bus_command_bits.keys()) + + g_pcie.add_argument("-v", "--valid", + help=3Df"Valid bits: {valid_bits}") + g_pcie.add_argument("-s", "--error-status", + type=3Dlambda x: int(x, 0), + help=3D"Error Status") + g_pcie.add_argument("-t", "--error-type", + type=3Dlambda x: int(x, 0), + help=3D"Error type") + g_pcie.add_argument("-b", "--bus-number", + type=3Dlambda x: int(x, 0), + help=3D"Bus number") + g_pcie.add_argument("-S", "--segment-number", + type=3Dlambda x: int(x, 0), + help=3D"Segment number") + g_pcie.add_argument("-a", "--bus-address", + type=3Dlambda x: int(x, 0), + help=3D"Bus address") + g_pcie.add_argument("-d", "--bus-data", + type=3Dlambda x: int(x, 0), + help=3D"Bus data") + g_pcie.add_argument("-c", "--bus-command", + help=3Df"bus-command: {bus_command_bits}") + g_pcie.add_argument("-r", "--bus-requestor", + type=3Dlambda x: int(x, 0), + help=3D"Bus requestor ID") + g_pcie.add_argument("-C", "--bus-completer", + type=3Dlambda x: int(x, 0), + help=3D"Bus completer ID") + g_pcie.add_argument("-i", "--target-id", + type=3Dlambda x: int(x, 0), + help=3D"Target ID") + + parser.set_defaults(func=3Dself.send_cper) + + def send_cper(self, args): + """Parse subcommand arguments and send a CPER via QMP""" + + qmp_cmd =3D qmp(args.host, args.port, args.debug) + + cper =3D {} + arg =3D vars(args) + + # Handle global parameters + if args.valid: + valid_init =3D False + cper["valid"] =3D util.get_choice(name=3D"valid", + value=3Dargs.valid, + choices=3Dself.valid_bits) + else: + cper["valid"] =3D 0 + valid_init =3D True + + if args.bus_command: + cper["bus-command"] =3D util.get_choice(name=3D"bus-command", + value=3Dargs.bus_comma= nd, + choices=3Dself.bus_com= mand_bits) + if valid_init: + if args.error_status: + cper["valid"] |=3D self.valid_bits["status"] + + if args.error_type: + cper["valid"] |=3D self.valid_bits["type"] + + if args.bus_number and args.bus_segment: + cper["valid"] |=3D self.valid_bits["bus-id"] + + if args.bus_address: + cper["valid"] |=3D self.valid_bits["bus-address"] + + if args.bus_data: + cper["valid"] |=3D self.valid_bits["bus-data"] + + if args.bus_requestor: + cper["valid"] |=3D self.valid_bits["requestor-id"] + + if args.bus_completer: + cper["valid"] |=3D self.valid_bits["completer-id"] + + if args.target_id: + cper["valid"] |=3D self.valid_bits["target-id"] + + util.data_add(self.data, cper["valid"], 8) + util.data_add(self.data, arg.get("error-status", 0), 8) + util.data_add(self.data, arg.get("error-type", util.bit(0)), 2) + + # Bus ID + util.data_add(self.data, arg.get("bus-number", 0), 1) + util.data_add(self.data, arg.get("segment-number", 0), 1) + + # Reserved + util.data_add(self.data, 0, 4) + + util.data_add(self.data, arg.get("bus-address", 0), 8) + util.data_add(self.data, arg.get("bus-data", 0), 8) + + util.data_add(self.data, cper.get("bus-command", 0), 8) + + util.data_add(self.data, arg.get("bus-requestor", 0), 8) + util.data_add(self.data, arg.get("bus-completer", 0), 8) + util.data_add(self.data, arg.get("target-id", 0), 8) + + return qmp_cmd.send_cper(cper_guid.CPER_PCI_BUS, self.data) --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994815; cv=none; d=zohomail.com; s=zohoarc; b=gcKAYTfdgesU0/a4xwTvFhbOoSsSITvHdEzpxubkqu0hwuF6uyX9Jx6RLqAJG1Gz8dvDGogJgpnO+skizRd/DRTY0mjptS0RvepDlk4KYpqcWDuUUfKwDIt+m0XysiZB7P44pXtBo7nwbtJMt85xTu67uwjLPIAl4hYzJGe7xao= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994815; 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=js6ZeXqYvlC78pe52wF2Nbgci03lZ+ci4LcHPam64Uw=; b=YkFnKKoKWktEDIY4LV5fjIk6TrpPZZTsv0/Tdw9AxgV+d4O2+VDoZanYbWrpA+nfBfuVmdckZaox/IKEDc2w6WZ1LoRX4qMHGAQmgJslqsGpyfMQdI3Rtk1Kvb9HMdvHhu0F21obroRygFzmrNVStIjkfwHDsWxuuGiH0n2TfmA= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994815533777.4837393389371; Wed, 21 Jan 2026 03:26:55 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLN-00030N-WD; Wed, 21 Jan 2026 06:25:50 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLF-0002rU-B8 for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:42 -0500 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLA-0007n1-LA for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 5901B441FF; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 01310C2BCB2; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJu-12Fa; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=9HakeWVEe+QBCGcswgQSecFlvUPMPLx4j+YXsEi6P2w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=h1dMhTcy3+41o78TYM/JjV927E7dQ6RGGAB0m5UBVsKWf3ND8iI3dgQd8qAqBvhOz HMCaZ1dz7nlco7wQUC+Hq71mXvTpsDzPo9piDYe7lf8hCQDonOcXuC1jzNxsEUas6c /cFjCjm2rRE+0eVNg2/syNNCiBG6qQuaUbjDBfSkx5woOw8XWdVdiCBYMV/A2+8I4k pSSghbLrRM3fdX7aP9G/JkQTKuZQKFe3OTPudbv0iO8kyJNNUQhC9C30HlyoIxFmlO 2niIah0bCroSKNlnS+I/760xCs+IVWooYlc7l9Dn3hu5mQYxY9o7OuI1CX9Yg+tS2k RZfJUW6Klf/lg== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 10/13] scripts/ghes_inject: add support for fuzzy logic testing Date: Wed, 21 Jan 2026 12:25:18 +0100 Message-ID: <5404a11d5fabe0757aaf24e0b355ba16c1f19a12.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c0a:e001:78e:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994829403158500 Add a command to inject random errors for fuzzy logic testing. Signed-off-by: Mauro Carvalho Chehab --- MAINTAINERS | 1 + scripts/fuzzy_error.py | 206 +++++++++++++++++++++++++++++++++++++++++ scripts/ghes_inject.py | 2 + 3 files changed, 209 insertions(+) create mode 100644 scripts/fuzzy_error.py diff --git a/MAINTAINERS b/MAINTAINERS index 48067a618523..e553f8252f14 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2228,6 +2228,7 @@ F: qapi/acpi-hest.json F: scripts/ghes_decode.py F: scripts/ghes_inject.py F: scripts/arm_processor_error.py +F: scripts/fuzzy_error.py F: scripts/pcie_bus_error.py F: scripts/qmp_helper.py =20 diff --git a/scripts/fuzzy_error.py b/scripts/fuzzy_error.py new file mode 100644 index 000000000000..9f80abb72319 --- /dev/null +++ b/scripts/fuzzy_error.py @@ -0,0 +1,206 @@ +#!/usr/bin/env python3 +# +# pylint: disable=3DC0114,R0903,R0912 +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2024 Mauro Carvalho Chehab + +import argparse +import sys + +from time import sleep +from random import randrange +from qmp_helper import qmp, util, cper_guid + +class FuzzyError: + """ + Implements Fuzzy error injection via GHES + """ + + def __init__(self, subparsers): + """Initialize the error injection class and add subparser""" + + # as defined at UEFI spec v2.10, section N.2.2 + # Sizes here are just hints to have some default + self.types =3D { + "proc-generic": { + "guid": cper_guid.CPER_PROC_GENERIC, + "default_size": 192 + }, + "proc-x86": { + "guid": cper_guid.CPER_PROC_X86, + "default_size": 64 + }, + "proc-itanium": { + "guid": cper_guid.CPER_PROC_ITANIUM, + "default_size": 64 + }, + "proc-arm": { + "guid": cper_guid.CPER_PROC_ARM, + "default_size": 72 + }, + "platform-mem": { + "guid": cper_guid.CPER_PLATFORM_MEM, + "default_size": 80 + }, + "platform-mem2": { + "guid": cper_guid.CPER_PLATFORM_MEM2, + "default_size": 96 + }, + "pcie": { + "guid": cper_guid.CPER_PCIE, + "default_size": 208 + }, + "pci-bus": { + "guid": cper_guid.CPER_PCI_BUS, + "default_size": 72 + }, + "pci-dev": { + "guid": cper_guid.CPER_PCI_DEV, + "default_size": 56 + }, + "firmware-error": { + "guid": cper_guid.CPER_FW_ERROR, + "default_size": 32 + }, + "dma-generic": { + "guid": cper_guid.CPER_DMA_GENERIC, + "default_size": 32 + }, + "dma-vt": { + "guid": cper_guid.CPER_DMA_VT, + "default_size": 144 + }, + "dma-iommu": { + "guid": cper_guid.CPER_DMA_IOMMU, + "default_size": 144 + }, + "ccix-per": { + "guid": cper_guid.CPER_CCIX_PER, + "default_size": 36 + }, + "cxl-prot-err": { + "guid": cper_guid.CPER_CXL_PROT_ERR, + "default_size": 116 + }, + "cxl-evt-media": { + "guid": cper_guid.CPER_CXL_EVT_GEN_MEDIA, + "default_size": 32 + }, + "cxl-evt-dram": { + "guid": cper_guid.CPER_CXL_EVT_DRAM, + "default_size": 64 + }, + "cxl-evt-mem-module": { + "guid": cper_guid.CPER_CXL_EVT_MEM_MODULE, + "default_size": 64 + }, + "cxl-evt-mem-sparing": { + "guid": cper_guid.CPER_CXL_EVT_MEM_SPARING, + "default_size": 64 + }, + "cxl-evt-phy-sw": { + "guid": cper_guid.CPER_CXL_EVT_PHY_SW, + "default_size": 64 + }, + "cxl-evt-virt-sw": { + "guid": cper_guid.CPER_CXL_EVT_VIRT_SW, + "default_size": 64 + }, + "cxl-evt-mdl-port": { + "guid": cper_guid.CPER_CXL_EVT_MLD_PORT, + "default_size": 64 + }, + "cxl-evt-dyna-cap": { + "guid": cper_guid.CPER_CXL_EVT_DYNA_CAP, + "default_size": 64 + }, + "fru-mem-poison": { + "guid": cper_guid.CPER_FRU_MEM_POISON, + "default_size": 72 + }, + } + + parser =3D subparsers.add_parser("fuzzy-test", aliases=3D['fuzzy'], + description=3D"Inject a fuzzy test = CPER", + formatter_class=3Dargparse.RawTextH= elpFormatter) + g_fuzzy =3D parser.add_argument_group("Fuzz testing error inject") + + + cper_types =3D ",".join(self.types.keys()) + + g_fuzzy.add_argument("-T", "--type", + help=3Df"Type of the error: {cper_types}") + g_fuzzy.add_argument("--min-size", + type=3Dlambda x: int(x, 0), + help=3D"Minimal size of the CPER") + g_fuzzy.add_argument("--max-size", + type=3Dlambda x: int(x, 0), + help=3D"Maximal size of the CPER") + g_fuzzy.add_argument("-z", "--zero", action=3D"store_true", + help=3D"Zero all bytes of the CPER payload (de= fault: %(default)s)") + g_fuzzy.add_argument("-t", "--timeout", type=3Dfloat, + default=3D30.0, + help=3D"Specify timeout for CPER send retries (default= : %(default)s seconds)") + g_fuzzy.add_argument("-d", "--delay", type=3Dfloat, + default=3D0, + help=3D"Specify a delay between multiple CPER (default= : %(default)s)") + g_fuzzy.add_argument("-c", "--count", type=3Dint, + default=3D1, + help=3D"Specify the number of CPER records to be sent = (default: %(default)s)") + + parser.set_defaults(func=3Dself.send_cper) + + def send_cper(self, args): + """Parse subcommand arguments and send a CPER via QMP""" + + qmp_cmd =3D qmp(args.host, args.port, args.debug) + + args.count =3D max(args.count, 1) + + for i in range(0, args.count): + if i: + if args.delay > 0: + sleep(args.delay) + + # Handle global parameters + if args.type: + if not args.type in self.types: + sys.exit(f"Invalid type: {args.type}") + + inj_type =3D args.type + else: + i =3D randrange(len(self.types)) + keys =3D list(self.types.keys()) + inj_type =3D keys[i] + + inject =3D self.types[inj_type] + + guid =3D inject["guid"] + min_size =3D inject["default_size"] + max_size =3D min_size + + if args.min_size: + min_size =3D args.min_size + + if args.max_size: + max_size =3D args.max_size + + size =3D min_size + + if min_size < max_size: + size +=3D randrange(max_size - min_size) + + data =3D bytearray() + + if not args.zero: + for i in range(size): + util.data_add(data, randrange(256), 1) + else: + for i in range(size): + util.data_add(data, 0, 1) + + print(f"Injecting {inj_type} with {size} bytes") + ret =3D qmp_cmd.send_cper(guid, data, timeout=3Dargs.timeout) + if ret and ret !=3D "OK": + return ret diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 29a6a57508cd..9b0a2443fc97 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -13,6 +13,7 @@ =20 from arm_processor_error import ArmProcessorEinj from pcie_bus_error import PcieBusError +from fuzzy_error import FuzzyError =20 EINJ_DESC =3D """ Handle ACPI GHESv2 error injection logic QEMU QMP interface. @@ -42,6 +43,7 @@ def main(): =20 ArmProcessorEinj(subparsers) PcieBusError(subparsers) + FuzzyError(subparsers) =20 args =3D parser.parse_args() if "func" in args: --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994830; cv=none; d=zohomail.com; s=zohoarc; b=Kxks7enUJlyh1dkDRQyzvnlXoo8ofB/OR7Lih3L76X8lxa3ODip8xrunU4jSG2XvhkaIuLkt8g6V16wJyqVcXyUhwAY5ytHijaKara5iU7amSN04geTX9AZyv5kGwHi+9AizY36cu/qY5XgmV9/vtUdIbKibAhop23Kb0N2t6wI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994830; 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=R4SjdCprbKqCfczNA8dLnxb84jaNLHSnNuyT2cpUygg=; b=CWl19Teyj9PlphfiTQPMvaPfWb7yM57tJyrCqwkiUaQH0TWmtYCsRwKKqAnaM7RVIuLFiKn3xrlycNXBcIGuHieOVupUIhIRne6FA4FnPId0Kc0ZMTRdB6PeECzH7wDAgA7hK1M7uBkw3YCkFyufMwC5GVpCo4UETNpf9Zg6Tfw= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994830962714.9291361298428; Wed, 21 Jan 2026 03:27:10 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLN-00030M-V3; Wed, 21 Jan 2026 06:25:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLH-0002tx-Ad for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:43 -0500 Received: from tor.source.kernel.org ([172.105.4.254]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLB-0007ox-RY for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:41 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 8DA0760128; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 013C3C4AF0C; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gJy-196j; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=mRTiQT08l0TCnOryhluz+wDoZtjnsd9LqGsTC5w9rA0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LpJ/jMlViZvbGeLmF+p0PPHz9xZBF+9o7zaEvIaMD8Dghpq/xNsV+IhNnOFdOP3tE NHFlEQbMoWkNSpwxzb3TXDLkD2ty5W9UNJU+rDzUQnG+8oGyIVLocLY94F/vpysVuL qiqDYnVyCF9tZPsJlbYCno9YoNOhAHTU5kz2My+letVbolXjzCMvTzDBcdrYD26lnY z66VbwfNXFwUwcULOhH5B8f2K6O5YuCwmEqU/YfbliLnjrDsQPFB0OyGxWJGaDhbcD NreJcz/C7/yE6Lz74jwOKdTdOdulG+GeozJjpwbjoGA6RMVvNii5VnVRkg18AuOoNG rkjhvM4A98QgA== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 11/13] scripts/ghes_inject: add a raw error inject command Date: Wed, 21 Jan 2026 12:25:19 +0100 Message-ID: <9e683379c26044ff0524b0f422b9b659162f9484.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=172.105.4.254; envelope-from=mchehab+huawei@kernel.org; helo=tor.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994832722154100 Add a command to repeat a raw CPER record. This helps to reproduce some condition that happened before. The input format of the file is identical to the hexadecimal dump generated by ghes_inject tool. Signed-off-by: Mauro Carvalho Chehab --- MAINTAINERS | 1 + scripts/ghes_inject.py | 2 + scripts/raw_error.py | 175 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 scripts/raw_error.py diff --git a/MAINTAINERS b/MAINTAINERS index e553f8252f14..9d74d057048e 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2231,6 +2231,7 @@ F: scripts/arm_processor_error.py F: scripts/fuzzy_error.py F: scripts/pcie_bus_error.py F: scripts/qmp_helper.py +F: scripts/raw_error.py =20 ppc4xx L: qemu-ppc@nongnu.org diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 9b0a2443fc97..781b37cc68af 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -14,6 +14,7 @@ from arm_processor_error import ArmProcessorEinj from pcie_bus_error import PcieBusError from fuzzy_error import FuzzyError +from raw_error import RawError =20 EINJ_DESC =3D """ Handle ACPI GHESv2 error injection logic QEMU QMP interface. @@ -44,6 +45,7 @@ def main(): ArmProcessorEinj(subparsers) PcieBusError(subparsers) FuzzyError(subparsers) + RawError(subparsers) =20 args =3D parser.parse_args() if "func" in args: diff --git a/scripts/raw_error.py b/scripts/raw_error.py new file mode 100644 index 000000000000..f5e77bdfcead --- /dev/null +++ b/scripts/raw_error.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +# +# pylint: disable=3DC0114,R0903,R0912,R0914,R0915,R1732 +# SPDX-License-Identifier: GPL-2.0 +# +# Copyright (C) 2024 Mauro Carvalho Chehab + +import argparse +import os +import re +import sys + +from time import sleep + +from qmp_helper import qmp, guid + +class RawError: + """ + Injects errors from a file containing raw data + """ + + SCRIPT_NAME =3D sys.argv[0] + + HELP=3Df""" + Inject a CPER record from a previously recorded one. + + One or more CPER records can be recorded. The records to be + injected are read from an specified file or from stdin and should + have the format produced by this script when using --debug, e.g.: + + GUID: e19e3d16-bc11-11e4-9caa-c2051d5d46b0 + CPER: + 00000000 04 00 00 00 02 00 01 00 88 00 00 00 00 00 00 00 ......= .......... + 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ......= .......... + 00000020 00 00 00 00 00 00 00 00 00 20 05 00 08 02 00 03 ......= ... ...... + 00000030 ff 0f 46 d6 80 00 00 00 ef be ad de 00 00 00 00 ..F...= .......... + 00000040 ad 0b ba ab 00 00 00 00 00 20 04 00 04 01 00 03 ......= ... ...... + 00000050 7f 00 54 00 00 00 00 00 ef be ad de 00 00 00 00 ..T...= .......... + 00000060 ad 0b ba ab 00 00 00 00 00 00 05 00 18 00 00 00 ......= .......... + 00000070 ef be ad de 00 00 00 00 ab ba ba ab 00 00 00 00 ......= .......... + 00000080 00 00 00 00 00 00 00 00 ......= .. + + Multiple such records can be used. On such case, a delay will + be introduced betewen them. + + All lines that can't be parsed will be silently ignored. + As such, the output of this help can be piped to the raw-error + generator with: + + {SCRIPT_NAME} -d raw-error -h | {SCRIPT_NAME} -d raw-error + """ + + def __init__(self, subparsers): + """Initialize the error injection class and add subparser""" + + self.payload =3D bytearray() + self.inj_type =3D None + self.size =3D 0 + + parser =3D subparsers.add_parser("raw-error", aliases=3D['raw'], + description=3Dself.HELP, + formatter_class=3Dargparse.RawTextH= elpFormatter) + + parser.add_argument("-f", "--file", + help=3D"File name with the raw error data. '-'= for stdin") + parser.add_argument("-d", "--delay", type=3Dlambda x: int(x, 0), + default=3D1, + help=3D"Specify a delay between multiple CPER.= Default=3D1") + + parser.set_defaults(func=3Dself.send_cper) + + def send_cper(self, args): + """Parse subcommand arguments and send a CPER via QMP""" + + if not args.file: + args.file=3D'-' + + is_guid =3D re.compile(r"^\s*guid:\s*(\w+\-\w+\-\w+\-\w+-\w+)", re= .I) + is_gesb =3D re.compile(r"^Generic Error Status Block.*:", re.I) + is_gede =3D re.compile(r"^Generic Error Data Entry.*:", re.I) + is_raw_data =3D re.compile(r"^Raw data.*:", re.I) + is_payload =3D re.compile(r"^(Payload|CPER).*:", re.I) + is_hexdump =3D re.compile(r"^(\s*[\da-f]........\s+)(.*)\s\s+.*", = re.I) + is_hex =3D re.compile(r"\b([\da-f].)\b", re.I) + + cper =3D [] + + if args.file =3D=3D "-": + fp =3D sys.stdin + if os.isatty(0): + print("Using stdin. Press CTRL-D to finish input.") + else: + print("Reading from stdin pipe") + else: + try: + fp =3D open(args.file, encoding=3D"utf-8") + except FileNotFoundError: + sys.exit('File Not Found') + + guid_obj =3D None + gebs =3D bytearray() + gede =3D bytearray() + raw_data =3D bytearray() + payload =3D bytearray() + ln_used =3D 0 + ln =3D 0 + + cur =3D payload + + for ln, line in enumerate(fp): + if match :=3D is_guid.search(line): + if guid_obj and payload: + cper.append({"guid": guid_obj, "raw-data": payload}) + guid_obj =3D None + payload =3D bytearray() + gebs =3D bytearray() + gede =3D bytearray() + + guid_obj =3D guid.UUID(match.group(1)) + + ln_used +=3D 1 + continue + + if match :=3D is_gesb.match(line): + cur =3D gebs + continue + + if match :=3D is_gede.match(line): + cur =3D gede + continue + + if match :=3D is_payload.match(line): + cur =3D payload + continue + + if match :=3D is_raw_data.match(line): + cur =3D raw_data + continue + + new =3D is_hexdump.sub(r"\2", line) + if new !=3D line: + if match :=3D is_hex.findall(new): + for m in match: + cur.extend(bytes.fromhex(m)) + ln_used +=3D 1 + continue + continue + + if guid_obj and payload: + cper.append({"guid": guid_obj, + "payload": payload, + "gede": gede, + "gebs": gebs, + "raw-data": raw_data}) + + print(f"{ln} lines read, {ln - ln_used} lines ignored.") + + if fp is not sys.stdin: + fp.close() + + qmp_cmd =3D qmp(args.host, args.port, args.debug) + + if not cper: + sys.exit("Format of the file not recognized.") + + for i, c in enumerate(cper): + if i: + sleep(args.delay) + + ret =3D qmp_cmd.send_cper(c["guid"], c["payload"], gede=3Dc["g= ede"], + gebs=3Dc["gebs"], raw_data=3Dc["raw-da= ta"]) + if not ret: + return ret + + return True --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994831; cv=none; d=zohomail.com; s=zohoarc; b=hRc+5MpteT075QDzG/8i5aa6XJkoqktH+Yqvn37Xxl+rGCPvh3Okb/kPp4izAPa93HM7i8BrXHfj3SYIML0FCckbbOzgOUn9bj2tjKDGMRe/pEWEyMaGu0Bw4cefvM0otKLCMW+HoBse96QkMPgbIAnsantmzY44uQeTo2yPpjM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994831; 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=QZSzrChH0BukRW0ey9gntCrfDzAeRgt+bMQgbClvlaE=; b=P38Vni6BNPTPd3ftblnkNcDuf/haG7bvRjos1V9lbEvnlYbQuohknlJs2VN2VJtNCXkoPIlIF3kQnz4RZqzY0VTHc4h902cdBWiJ1GLT5uWcJAOEMoBSuzE8hIPKMvfUKTqf5f4ZVBifxpEkl1JpjjbizJOBUED6bwcMpVGP+c4= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994831761112.20738776236635; Wed, 21 Jan 2026 03:27:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLN-0002zF-DR; Wed, 21 Jan 2026 06:25:49 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLF-0002r7-8L for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:41 -0500 Received: from sea.source.kernel.org ([172.234.252.31]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLB-0007n3-Qi for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:40 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 5CF6E44224; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 05E24C2BCB3; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gK2-1Fxz; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=r0kTPf9oHY2/BMOpAILujZwM/j+LHurXvKlRwAL2zbc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JpvDwTHdRvkEFgbVaJUC9SDjxN/e6QpNzEZbBwdgwlkGL8BXH6EVgAFG927TzSPme nWRrFIzY2Do6cN/LZaY9CorTiMXU9cOY8oteKSmdhGMbpkfxWYh4oNoRYxoFoowESE ZNTMMmmff4Hm59HlRFxGhGX2nBM7iMAal7GraXimh2naVjaixFNeQOy5YgQ4Zbgxjp iS92E93adjLEobcHWVRVwORYkRaQuS5LVvFH0VYXQTVujZjiRF7XAjwUG7ejj4A2U4 Pz4ABD99XP/N5YxHGnhaNRTqOkB0UD1FYIdP9fU22tmR1NjjmmHDKMvlM77MY+t3h1 HXVt2zYvMxpxQ== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 12/13] scripts/ghes_inject: print help if no command specified Date: Wed, 21 Jan 2026 12:25:20 +0100 Message-ID: X-Mailer: git-send-email 2.52.0 In-Reply-To: References: 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=172.234.252.31; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994832335158500 The first positional argument (command) is mandatory. If not specified, instead of a simple error message, show help as well. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/ghes_inject.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 781b37cc68af..4028fdb15582 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -52,6 +52,9 @@ def main(): if not args.func(args): sys.exit(1) else: + print("Error: no command specified\n", file=3Dsys.stderr) + parser.print_help(file=3Dsys.stderr) + print(file=3Dsys.stderr) sys.exit(f"Please specify a valid command for {sys.argv[0]}") =20 if __name__ =3D=3D "__main__": --=20 2.52.0 From nobody Sat Feb 7 08:44:14 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=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1768994823; cv=none; d=zohomail.com; s=zohoarc; b=YAqR11rmAwzMQUI45Gy1N9JrZFg59BX0EKDk0n2z7TTnC7LhYfy6u4l6QBpgZYDbXnbvjNV8eP/BXRUoNw2qQPA1dD71vXiIK3eAWi2E3pHWFLJUuw0v/6g6cWDF2ZBdQE5Xg61gkbLHGtDaYnBT69m85y4s5IvEFCQGIPQjFz4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1768994823; 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=4uoojev6T9ou4JdooNRg8qK0xwzTzfH/3f/KUS+1wVI=; b=CjnUuMwkeJzjaYOX/VgGLk6CsNoJ07rIYIbIIm+c8ciaBBudWfjvUhzopdlGcdTubp7Mya7+aruUFladUNz0tWI7ylLadBW9aXzOHmk+Ih2bjb1o4n3aA9/yH0ACoRaWem+knmSOqu6vhNYwW5uuz24KrV34TdbqQXRHoKk3jyU= 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1768994823461878.7595622202336; Wed, 21 Jan 2026 03:27:03 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1viWLO-00032i-Ud; Wed, 21 Jan 2026 06:25:51 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLH-0002uW-Hf for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:44 -0500 Received: from sea.source.kernel.org ([2600:3c0a:e001:78e:0:1991:8:25]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1viWLE-0007q6-Tz for qemu-devel@nongnu.org; Wed, 21 Jan 2026 06:25:43 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 657D844288; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2EC00C2BCB7; Wed, 21 Jan 2026 11:25:25 +0000 (UTC) Received: from mchehab by mail.kernel.org with local (Exim 4.99) (envelope-from ) id 1viWKx-00000003gK6-1MoO; Wed, 21 Jan 2026 12:25:23 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1768994725; bh=mJkwk0b1J+wBP6yJ8KSn8HC69LO+4cInAVMNTa0sJSQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fdXMd6iuwS9o37AXoWFTiXUjQWSRkwlXAE2HyMskisDVeGtXoNyj/O810l2v76OO6 h++/G49w5zw43ZazQlqne6p/6aoG0Lf273D9SRsfHDtq0QY+/UmNuM5NAhBLUKbFtC Ru03AaEKbDQTNHgbX5MoR7E/64EZyrqdikYm1b8q5Sy8VSOhL7+WLUWbA1N6WUOSkY DnbKROB6eyxkHbQgSg7XYP3wq8uJLiuysHyBk4kP7X1EvKTNTeqXUUHtwYW2C6bfMF chlF625RRKh+3WrTXdXjRawhRZFLim/69mGPDoC/cFOZDa0ibTQDB8C+cT4lwathgY DWtZ5O0tTUWRg== From: Mauro Carvalho Chehab To: Michael S Tsirkin Cc: Jonathan Cameron , Shiju Jose , qemu-devel@nongnu.org, Igor Mammedov , Mauro Carvalho Chehab , Cleber Rosa , John Snow Subject: [PATCH 13/13] scripts/ghes_inject: improve help message Date: Wed, 21 Jan 2026 12:25:21 +0100 Message-ID: <5b4efacb92c898d5b345e6df1579756a79b586dc.1768993993.git.mchehab+huawei@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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=lists.gnu.org; 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=lists.gnu.org; Received-SPF: pass client-ip=2600:3c0a:e001:78e:0:1991:8:25; envelope-from=mchehab+huawei@kernel.org; helo=sea.source.kernel.org X-Spam_score_int: -21 X-Spam_score: -2.2 X-Spam_bar: -- X-Spam_report: (-2.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.087, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, SPF_HELO_NONE=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 @kernel.org) X-ZM-MESSAGEID: 1768994824421158500 Add a one-liner help message for each type of error inject command, and use raw formatter to keep line breaks. While here, use a more uniform language. With that, "ghes_inject -h" will now show: usage: ghes_inject.py [options] Handles ACPI GHESv2 error injection via the QEMU QMP interface. It uses UEFI=E2=80=AFBIOS=E2=80=AFAPEI features to generate GHES records,= which helps to test CPER and GHES drivers on the guest OS and see how user=E2=80=91space applications on that guest handle such errors. positional arguments: {arm,pcie-bus,fuzzy-test,fuzzy,raw-error,raw} arm Inject an ARM processor error CPER, compatible wi= th UEFI 2.9A Errata. pcie-bus Inject a PCIe bus error CPER fuzzy-test (fuzzy) Inject fuzzy test CPER packets raw-error (raw) Inject CPER records from previously recorded ones. options: -h, --help show this help message and exit QEMU QMP socket options: -H, --host HOST host name (default: localhost) -P, --port PORT TCP port number (default: 4445) -d, --debug enable debug output (default: False) Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/arm_processor_error.py | 6 ++++-- scripts/fuzzy_error.py | 4 +++- scripts/ghes_inject.py | 18 +++++++++--------- scripts/pcie_bus_error.py | 4 +++- scripts/raw_error.py | 6 +++--- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/scripts/arm_processor_error.py b/scripts/arm_processor_error.py index d9845adb0c0a..597382031ab8 100644 --- a/scripts/arm_processor_error.py +++ b/scripts/arm_processor_error.py @@ -122,7 +122,7 @@ class ArmProcessorEinj: """ =20 DESC =3D """ - Generates an ARM processor error CPER, compatible with + Inject an ARM processor error CPER, compatible with UEFI 2.9A Errata. """ =20 @@ -169,7 +169,9 @@ def __init__(self, subparsers): =20 self.data =3D bytearray() =20 - parser =3D subparsers.add_parser("arm", description=3Dself.DESC) + parser =3D subparsers.add_parser("arm", + help=3Dself.DESC, + description=3Dself.DESC) =20 arm_valid_bits =3D ",".join(self.arm_valid_bits.keys()) flags =3D ",".join(self.pei_flags.keys()) diff --git a/scripts/fuzzy_error.py b/scripts/fuzzy_error.py index 9f80abb72319..3ddb90f743a1 100644 --- a/scripts/fuzzy_error.py +++ b/scripts/fuzzy_error.py @@ -121,8 +121,10 @@ def __init__(self, subparsers): }, } =20 + DESC =3D "Inject fuzzy test CPER packets" + parser =3D subparsers.add_parser("fuzzy-test", aliases=3D['fuzzy'], - description=3D"Inject a fuzzy test = CPER", + help=3DDESC, description=3DDESC, formatter_class=3Dargparse.RawTextH= elpFormatter) g_fuzzy =3D parser.add_argument_group("Fuzz testing error inject") =20 diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 4028fdb15582..488d10ffcafd 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -17,28 +17,28 @@ from raw_error import RawError =20 EINJ_DESC =3D """ -Handle ACPI GHESv2 error injection logic QEMU QMP interface. +Handles ACPI GHESv2 error injection via the QEMU QMP interface. =20 -It allows using UEFI BIOS EINJ features to generate GHES records. - -It helps testing CPER and GHES drivers at the guest OS and how -userspace applications at the guest handle them. +It uses UEFI=E2=80=AFBIOS=E2=80=AFAPEI features to generate GHES records, = which helps to +test CPER and GHES drivers on the guest OS and see how user=E2=80=91space +applications on that guest handle such errors. """ =20 def main(): """Main program""" =20 # Main parser - handle generic args like QEMU QMP TCP socket options - parser =3D argparse.ArgumentParser(formatter_class=3Dargparse.Argument= DefaultsHelpFormatter, + parser =3D argparse.ArgumentParser(formatter_class=3Dargparse.RawDescr= iptionHelpFormatter, usage=3D"%(prog)s [options]", description=3DEINJ_DESC) =20 g_options =3D parser.add_argument_group("QEMU QMP socket options") g_options.add_argument("-H", "--host", default=3D"localhost", type=3Ds= tr, - help=3D"host name") + help=3D"host name (default: %(default)s)") g_options.add_argument("-P", "--port", default=3D4445, type=3Dint, - help=3D"TCP port number") - g_options.add_argument('-d', '--debug', action=3D'store_true') + help=3D"TCP port number (default: %(default)s)") + g_options.add_argument('-d', '--debug', action=3D'store_true', + help=3D"enable debug output (default: %(default= )s)") =20 subparsers =3D parser.add_subparsers() =20 diff --git a/scripts/pcie_bus_error.py b/scripts/pcie_bus_error.py index e8285b5dcc84..843ec09c7572 100644 --- a/scripts/pcie_bus_error.py +++ b/scripts/pcie_bus_error.py @@ -35,8 +35,10 @@ def __init__(self, subparsers): =20 self.data =3D bytearray() =20 + DESC =3D "Inject a PCIe bus error CPER" + parser =3D subparsers.add_parser("pcie-bus", - description=3D"Generate PCIe bus er= ror CPER") + help=3DDESC, description=3DDESC) g_pcie =3D parser.add_argument_group("PCIe bus error") =20 valid_bits =3D ",".join(self.valid_bits.keys()) diff --git a/scripts/raw_error.py b/scripts/raw_error.py index f5e77bdfcead..1e9eb1bcf15b 100644 --- a/scripts/raw_error.py +++ b/scripts/raw_error.py @@ -21,8 +21,8 @@ class RawError: =20 SCRIPT_NAME =3D sys.argv[0] =20 - HELP=3Df""" - Inject a CPER record from a previously recorded one. + HELP=3D"Inject CPER records from previously recorded ones." + DESC=3DHELP + f""" =20 One or more CPER records can be recorded. The records to be injected are read from an specified file or from stdin and should @@ -58,7 +58,7 @@ def __init__(self, subparsers): self.size =3D 0 =20 parser =3D subparsers.add_parser("raw-error", aliases=3D['raw'], - description=3Dself.HELP, + help=3Dself.HELP, description=3Dsel= f.DESC, formatter_class=3Dargparse.RawTextH= elpFormatter) =20 parser.add_argument("-f", "--file", --=20 2.52.0