From nobody Sun Jan 25 10:13:58 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=1769175386; cv=none; d=zohomail.com; s=zohoarc; b=gh1TwKkrUCtKF2qyvytlRNg22ab1eK6sW+zPFGSbw30w/P79Vq2zsY8KFI1ypt3mV+NV8/6ki8Z/9pu3827+Fem+vlIsy+3P46vGY3K7sQxkOpuVM50XSuuWG8kzdAgsQRvfPiWGE/wT1FS5PiiCKBlLAk6XirBjkIRRlL/rdhE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175386; 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=SvHs0UpcyzftCfZ0hrRcNfJ8q/2RHEL253xLhwbah6w=; b=KRVC1dgaTj1BG+JJm32TXVKwSG/K/9A5M3g9CmYS0SEzpuebQO+HygilvlYmxTE1SrDG36EkExmCKGebIHL4tREiOfzyTf+L+l3153RukKc3YRTyZ2ISqeI5Z0VIZj8FjwTRoE8GD7ZjZaTP0rJIIfyFol009HLUldQGZJ/g8HI= 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 1769175386070441.5997334528969; Fri, 23 Jan 2026 05:36:26 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKB-0007Pr-21; Fri, 23 Jan 2026 08:35: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 1vjHK9-0007P6-Kl for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:41 -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 1vjHK7-0004bj-W6 for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:41 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id D6DCD60130; Fri, 23 Jan 2026 13:35:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8A770C4CEF1; Fri, 23 Jan 2026 13:35:38 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHK4-000000063JZ-2Np5; Fri, 23 Jan 2026 14:35:36 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175338; bh=643xKLsq2X7KOI3w05ra+sdLFRG1gzNEXoNPGWF0L68=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QW/qKwIEJCwU/4yqLO+jVfoCA2E50RvZaV9XkD2al/7y/MTbb49PdEUz1Lq/MJm7T NrlTPvSBNCy7TaYS7gmydijg1EGJfrXO76MonT5Gf9L8W8ZNmx38GQG0chH6wzH5xn a45gMOzQXURISCOSmz13Flz+GZmdoeeo4Aaj4HlOxv12cBG4zidqnuKQhHFsZqVAOd Jrx2x4MSsdHWl8NDZBxJ9xoEjvfymD6Hz7fa9HOyqQAHtcAyTK2RBqQf05sZCaY3Fr 60I7FW0FT/oOcCSCp4skzk7ZN0ThZ9DzZDqSc/gyPQ2tdtHJ5n4zTWxSoZAy9gPyuF ve7xguu1Vtu3g== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 01/13] scripts/qmp_helper: add a return code to send_cper Date: Fri, 23 Jan 2026 14:35:15 +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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175388857154101 When used inside a loop, it is useful to have a return code to indicate whether 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 Sun Jan 25 10:13:58 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=1769175426; cv=none; d=zohomail.com; s=zohoarc; b=BYZB9+cLnrSmQpgsgoN+l92+Pr3QlooxiWfmRwQbypltFSRRzYM5905+L2Tvwmu0+JWm7W5UJMxTalC4VRBDzhEzKmryGfUAISnSkDlB073SCarZUrBdKbmtn+DIqjv1DIt7C80nCKvCt0fprbmZHHC/NMHJMNfO9kFaIpO74dA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175426; 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=aaucj6dkCGjk78Z0jRDlvBO7jxlp2XuTLoCyaBKvjdU=; b=QJrFRG5IBPeyYooeZDD+SUnoBskn9b9ahGxU/M9s/VBsY2YAS2B/C+B/ernoHINJgLu0VjWJ1jZMzFqANbMjuOHjeWR+H8LmdQz1hm9vglhKY7bM9ssbuuToV4Zf0ZrGCHCbiBZU5vJQP7djgMevk5CVi6zEUCMflreBS3miLRc= 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 176917542614696.12710074316306; Fri, 23 Jan 2026 05:37:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKF-0007Rm-63; Fri, 23 Jan 2026 08:35: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 1vjHKA-0007Pk-Rn for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:42 -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 1vjHK9-0004bq-5o for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:42 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 625EA439B0; Fri, 23 Jan 2026 13:35:39 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3CBF9C4CEF1; Fri, 23 Jan 2026 13:35:39 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHK5-000000063Jc-0f8V; Fri, 23 Jan 2026 14:35:37 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175339; bh=sd653Y2rU5G+bYEE/aPjX1oO73LmrPWtAi5iMJ7NkWg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=onV0A+kfCPRbkw39BzPJQTl44HmOKoJsxxOq9TLmjxSu+oSsZsqY+YZ8E0iIkwj27 jbRNTMerLvIlZTMtXFko9dnf26uUXcio7EQfFTEkeI7tUh15v3eVYiD8KpB+O08mNi hHjknTDDW3OlSMxEEBPx8Na3psVd9BPf8x6KZdHE1VjF2+l1B3kYdZspfKSrBDzUHy Boj+wBd1UxAMDN+6lal9y/Zf+ljz6rK1j1y6qgOhn8+8VibVuJgDG+F/4YZ7z+gbjL NVwQ8Nm8p6TZlYotvxMbX5yOMs7Gf5beeFiPajfCi15nFgZC9sh/q+ZpUEvSaUFH2q b5L3pQXd/EIbA== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 02/13] scripts/qmp_helper: add missing CXL UEFI GUID Date: Fri, 23 Jan 2026 14:35:16 +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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175428393158500 The UEFI 2.11 - N.2.14. CXL Component Events Section states that CXL events are described at CXL specification 3.2: 8.2.10.2.1 Event Records Table 8-55. Common Event Record Format Add the GUIDs defined here to fuzzy logic error injection code. It should be noticed that, while the section states that: "This section defines the standard event record format that all CXL devices shall use when reporting events to the host." And the field at byte offset 0 has all the GUIDs below, in practice, not all those events will reach the OSPM, as some are fabric management events and OS management flows for dynamic capacity. Yet, it is easier to keep the table in sync with the specs than to filter them out and justify why they won't need within CPER scope. Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- scripts/qmp_helper.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py index 249a8c7187d1..46b85d68b793 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -711,3 +711,33 @@ class cper_guid: CPER_CXL_PROT_ERR =3D guid(0x80B9EFB4, 0x52B5, 0x4DE3, [0xA7, 0x77, 0x68, 0x78, 0x4B, 0x77, 0x10, 0x48]) + + # CXL GUIDs, as defined at CXL specification 3.2: 8.2.10.2.1 Event Rec= ords + # on Table 8-55. Common Event Record Format + # + # Please notice that, in practice, not all those events will be passed + # to OSPM. Some may be consumed internally + 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 Sun Jan 25 10:13:58 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=1769175360; cv=none; d=zohomail.com; s=zohoarc; b=BmjukLzdvUiCAubkTqN0wdv9L305P+9JtPccYeHG9p0rrqtR6jsVVEkMzn3bot465r7Yosy6odB74OpYFgs1S6Gf2egQhGU5Sx9KNRLDIDwDl7xzh+Fg0nA8znEAvpkmkXJNiiAIEU0d+FuwkqynXNEGIpYyg+XZ5zgCJvCVQyc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175360; 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=/thJSGAP6xmESNrLrdFTnsVoiAdMQG5QXXWoTgcIU6Q=; b=Pavv4t6EzkHsIT48SwuMs8nogPfjEfZ2L1fZBblaEAAZM0J71e6eU6ZCbt/+yULr0icfhXslJFGDZwCzpCfQI31BEXaWO6ijFp2QVvmFzaKGX23TxQnzY12XrwKiI/yVzyiWZe0n1v2ygQoeXjAKIS3tkrQvNzGvAOhqhgfEeUk= 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 1769175360484774.5987257577697; Fri, 23 Jan 2026 05:36:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKC-0007Qm-So; Fri, 23 Jan 2026 08:35:44 -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 1vjHKA-0007Pe-PV for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:42 -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 1vjHK9-0004br-8X for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:42 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id C642143ADE; Fri, 23 Jan 2026 13:35:39 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id A6CAAC4CEF1; Fri, 23 Jan 2026 13:35:39 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHK5-000000063Jf-3OSj; Fri, 23 Jan 2026 14:35:37 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175339; bh=WozSB70hw7l0eF2mGi4LJ5e4z/TSg/23OXqKtZSZe/4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sAxZBm1LnfThR4wpC1XcIG1osVjYzQYtn5NZOBF3os796VaTEr3LD8MmcBQxcgtEB saVjgVYG3KUf8g1YJN5qmXmFLUz4CnQ6YKdOnNKdoQEuuALtU4XNjWpyP4t3FIit11 TSceiaqp8iL1sIVZRSn5Ib2CQaYF+G2sSH72IxV+o+bNsCSbzbAe69ppRdxtfaLYaI WZQFdZ0QI2X9gXQKr+VizAhjzlvhD3l02CneIGsROosAZJvZtjGjZoNzPVITC7ckPS NAZlKBKyjAcGZ1heBLaP/TMd1TupAhKC5WVusVFuYPE2PjGxjWTfdLiMz8z3N/yPus bIdDSckAfQoYg== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 03/13] scripts/qmp_helper: add support for FRU Memory Poison Date: Fri, 23 Jan 2026 14:35: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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175362515154100 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 46b85d68b793..d37fb0ae11cc 100755 --- a/scripts/qmp_helper.py +++ b/scripts/qmp_helper.py @@ -741,3 +741,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 Sun Jan 25 10:13:58 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=1769175362; cv=none; d=zohomail.com; s=zohoarc; b=G5Vm41AuuiDyKTT5b8pJY/qg1PSSmqNCyaY3eXHpt2S8U2Ulb5TFjKOXdSWmGOpvgS/K1KNufzT/7N6laRPbs1MAg60OBwoqQZIV9emgvHV2hz18k3HC2aE4TIfqnsdbVPE/EirZijuBxRCD3558RczIPXsdToBW09nLTJS2H9I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175362; 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=TNfykULAYugK5y7/EgGpcRMmiorfVRc4IdQIghGhNe4=; b=OQahK5++osW/JRgjzM/Yt1QXhXwygJEOWKaPNOiFSwJLAzUMDxtWUzdmnokHi8Wouqs7lN5d2s0qIzyBV5HSQ7b5SkIPfm65E2qKNv/dGimnVB6dThKL5dErW0JSkS0wZGxVhRHp1YXJoUQpaDfpLdCHx8+lvbqMARC+ONDWGwU= 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 1769175362807579.7021667507687; Fri, 23 Jan 2026 05:36:02 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKD-0007RC-IK; Fri, 23 Jan 2026 08:35: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 1vjHKB-0007QS-RG for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35: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 1vjHKA-0004cA-79 for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:43 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 19AA460010; Fri, 23 Jan 2026 13:35:41 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C5775C4CEF1; Fri, 23 Jan 2026 13:35:40 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHK6-000000063Jj-21yc; Fri, 23 Jan 2026 14:35:39 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175340; bh=cAn/uow26i6rYfHjiGm3Vhb9DNFN5wMSz3b13l7uzdQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=kvElkiPUnr6+LR3Fb/ljJOGNP6LYTeB6gDV61M4Jw1mb+SBrXPuGJWjSfVsWxvU/0 tymWzVLjfeb5mvf1KG08VOONtugMqNKb6m8nqaVakmQZM9o5NRJe34V/AAiI63OH/X rhQW4ihS+XiMnG7/jtjxD9r4rApfzPI05wO4mL6l56DymMG1rCAJ/kSrUxnqk6HsE4 0jU8xrWm34VZXNb83yAIKnb5aTlAWaqPWlJq1yNWISCvRO8rN5w+BFIGgL4FOEtdsr 6mZIQ1+yieqThbz//o/c/zlwZFuFyASOQPl8RHh5OcdYZGsxTM2pVx6AwUAJP82aFX 3iacmu5K2J/Ag== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 04/13] scripts/qmp_helper: make send_cper() more generic Date: Fri, 23 Jan 2026 14:35:18 +0100 Message-ID: <6fe142b90bea9a8c8be43dc86f7750212be05809.1769175069.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 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.079, 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: 1769175364574154100 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 d37fb0ae11cc..ac3abc794c69 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 Sun Jan 25 10:13:58 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=1769175390; cv=none; d=zohomail.com; s=zohoarc; b=g4i6ug1SNVKiHlFafSK9EBUshKNKMxdKytKRvWO6wihg3hk10b0o0+QWGSkErylXHdOQdAfF6WFCBHk0uQWAu8V/b+HBNYk/UBXiEnaHMdMQrqeMiGoQgkJtQ5uwaim8yeO2fx1aqUCbN2JCmIWmz3lQks0KUtq2c25TqbU1LIs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175390; 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=VY+A1EoEGaD40dYKxnZRElZyYCfi+wEglmC3qZ45ZFQ=; b=FYLGVn61U3RFKbn20198pWBf0aGP4fTGRAEia8JuC/JtKYWoaFQJhMCaJ8UHT4XUQWhvx2mlZmfBra339TLPt6JP3xPDLAzdhgg90y0MFfMIj3Q0GBVslXcO4XmPOLt/hjKk6qzSpmaFQ0bqe6H02+QBOT2tSpc7cbGFRXmOMVg= 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 1769175390543778.5649997222697; Fri, 23 Jan 2026 05:36:30 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKI-0007TL-BW; Fri, 23 Jan 2026 08:35: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 1vjHKG-0007Sa-OX for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:48 -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 1vjHKF-0004cr-4E for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:48 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 65BEE60010; Fri, 23 Jan 2026 13:35:46 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1C77CC4CEF1; Fri, 23 Jan 2026 13:35:46 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKC-000000063Jq-00lE; Fri, 23 Jan 2026 14:35:44 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175346; bh=NSF4+GKR0V5cB7F6q50hhNhNi8+rvzQwctVgiwbj0n8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lw+XpFyfAm9NmkFJ4sLFhb5Yr4qsQqgRT2cgF6e+cD64TjXSv+00DQyHUsLW6bI9w 708x5LvLJNDrxlNrRxWKBWEHlDfB6IuqZyf7XyKa2Wr78Iy7K24E1XlyhffEfsn25L hqa61UiBy/+/7BC4o3RESFkk5wKo0K57PbmRFD9svr67YfC/ZYpo7WnXGIHBmBtpVR /3Es2EYAmZzVi2+j4vPEoCuiLg01+FDOvEOveSCIu6dzqOZ+IJ8L4Dd/7lHS9kPty4 FgvLJA2uZ220tJZcbiG5KZ9It/0aXlr826DEtOzmh7vn/f3mNlNx9BwCNpqf+jrZp6 Ya7C9AgRNenpw== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 05/13] scripts/qmp_helper: fix raw_data logic Date: Fri, 23 Jan 2026 14:35:19 +0100 Message-ID: <20b027d157808867689d1f9a8ecc6f10559d90c6.1769175069.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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175392961154100 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. The previous code was not calculating it right, as it was filling it with the size of GEBS and placing raw data before payload. This is not a problem with default values, as they set raw data length to zero, but, at the moment raw data is filled, the generated CPERs becomes invalid. Fix the code to calculate the offset according with the specs. 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 ac3abc794c69..1587492807fe 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 Sun Jan 25 10:13:58 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=1769175360; cv=none; d=zohomail.com; s=zohoarc; b=INI7PoUkoZUE7o2q2ULzWUDnoBxTWVtmzXsaqGIFA8LOBNsi2LbUFdLZwlZmvv5U1Q7ldY8ZmunQnW2oHFE+/OOjLXn2JY3cEQHjCxqTozOwQH5HrJ0u4jTcgYJqRw6IbRdV4P/jR7Yf7VA2ZUX2hlzP1mT66SqxquNr3BeTiVg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175360; 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=IDsY+53ym8RTShOjfT/4VvKLP3eWhIDRBlQhQbrO39k=; b=WMIkRLb3HFz2jnwmzDwunFTMvkwEXDja7ryfa6IvGfw4nCWaP2LlULoarrpGx4nfNEb0c4yJn8QfwROq3RGBhIn7PhpsBzjXhpsbcpWuSCiyWjsI5HugFtGyKzjBwPJP+ZEyDbhxiQBkSgVCnemL5Kf2t6d3CWYk/Tp7Pxebclo= 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 1769175360422523.4023207428696; Fri, 23 Jan 2026 05:36:00 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKJ-0007Tr-0M; Fri, 23 Jan 2026 08:35: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 1vjHKH-0007Sn-At for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:49 -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 1vjHKF-0004cy-RM for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:49 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 3F5D360135; Fri, 23 Jan 2026 13:35:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E890BC4CEF1; Fri, 23 Jan 2026 13:35:46 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKC-000000063Jt-2soT; Fri, 23 Jan 2026 14:35:45 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175346; bh=rKSrF85OxrtAnXi0vbTWc5mB5I2n992k0TGKaluhwVQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UJsrezdYIAJazp4E8Lja1sLcL/A93noEiab3saYC2KNk2/Iy9uYGq6CGVXbYdl8wu 2JM3jt0sauPaFL6firABjRs8QMsStou1fwZI7HsEj1t4TkL7DvORAB/PgELsK4StPF ahysdcMw5nJ1zsQtGg70HHCEtGAfK9eglbTLFQxEksVqNdL9wEOfyjvf1EkxTGLd68 CGsU2hxemzB3e/fl12kJrLq2TFmFcitpeM0DrxNVMJB5GQCQxtg+3fkYrCNFiXoRrf WVbmD7+9U5yvFC9R19gfzb3TXSjhdu6W+CWvJKPxjSXjLnDwkhFlxcgLQLxqeFf4VD AdgXdbvWQKuxA== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 06/13] scripts/qmp_helper: add support for a timeout logic Date: Fri, 23 Jan 2026 14:35:20 +0100 Message-ID: <3633cf168519ef0ad02c7e493865b0a20257b695.1769175069.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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175362580154100 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 1587492807fe..d5ffd51f161e 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 Sun Jan 25 10:13:58 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=1769175426; cv=none; d=zohomail.com; s=zohoarc; b=RjagKJq8BmfvuaaPuXf/rLSxGCo8DZcZOrO8koGzenT+EIhnn3mv7NxzaS8FodPhlDTpPt8kALykR6/2vi+VpnvJVnn+x3Sq0Uizs+lx/EwtVADoQg9LIiAKmY3Kw1kxkBMC4OPYEDogfi4KEXzFFTU0fZsRwSnGjzwk4eliEEA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175426; 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=fjcEHmxpMRAM0nfbng9/M10kBGxwFf7zbRTakLb0IDc=; b=IpbXGQ3ze639LWzYtMlBIey3Yn7qQ+1VjEYUTiYBBSh8/TIIEdG329tvu6mdvqFBHra2Xo+CM0U01mvzAlHb4zXaQsA1AQLBipJ+5QhvC1e0v9TfYxpsPWmetYzuUL6PpZ+ERIwqojhgRz9CnjrsXnnaaS19G36w5qN55NexJxo= 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 1769175426896538.804569750314; Fri, 23 Jan 2026 05:37:06 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKO-0007Wa-2K; Fri, 23 Jan 2026 08:35:56 -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 1vjHKM-0007Ve-Fx for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:54 -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 1vjHKI-0004dG-S1 for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:54 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 3E7FF438CD; Fri, 23 Jan 2026 13:35:49 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF8B2C4CEF1; Fri, 23 Jan 2026 13:35:48 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKD-000000063Jw-2Abh; Fri, 23 Jan 2026 14:35:47 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175349; bh=FjXLoTljb7jHfnGiE9bpnJOGrlPQxtNEvooayZm3bKk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WfTp8sI4AxDMylassoZWqpcBCqsTZhAOL4zxsuwwXTQ5P0m7kFQQ9a5NSIY4rgx94 Qkh88Bh/uaOLj1FJ24XDSva3xOou2uO7b3Xu2rH3PwgEQFFeKg9TGORFWapov1n8dY WzqCW/3Tt4w02meLxC1qTZpfgY2896JbyRki26ev5kSJ3ljWHedu249PwtZevI0O8p q7Mydv8ywkgEe60kh/mBroR+rjEdesd5w6gklmpY8Z8Wx1nHGSHnOUSPR8jdcRm6UV zNYvmZI2ixt5mkLhxnJ6yjR+AfQzbT++UDtGE/7mVruY8yZm12kzisE5XtfrGu7cpU zhYEcB2cjUoiA== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 07/13] scripts/ghes_inject: add a logic to decode CPER Date: Fri, 23 Jan 2026 14:35:21 +0100 Message-ID: <0e10844427780ee95484addaff439a014df36948.1769175070.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 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.079, 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: 1769175428444158500 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 GUID type (except for a fuzzy logic test, which is pretty much independent of the records meaning). Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- MAINTAINERS | 1 + scripts/ghes_decode.py | 1158 ++++++++++++++++++++++++++++++++++++++++ scripts/qmp_helper.py | 3 + 3 files changed, 1162 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..6f6446c95e58 --- /dev/null +++ b/scripts/ghes_decode.py @@ -0,0 +1,1158 @@ +#!/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 on 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 + # on Table 8-55. Common Event Record Format + # + # Please notice that, in practice, not all those events will be passed + # to OSPM. Some may be handled internally. + 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"), + ("Multi-Logical Device 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"), + ("Raw Data Offset", 4, "int"), + ("Raw Data Length", 4, "int"), + ("Data Length", 4, "int"), + ("Error Severity", 4, "int"), + + # Generic Error Data Entry + ("Section Type", 16, "guid"), + ("Error Severity", 4, "int"), + ("Revision", 2, "int"), + ("Validation Bits", 1, "int"), + ("Flags", 1, "int"), + ("Error Data Length", 4, "int"), + ("FRU Id", 16, "guid"), + ("FRU Text", 20, "str"), + ("Timestamp", 8, "bcd"), + ] + + 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 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 + + fields[name] =3D val + + if fields.get("Raw Data Length"): + cper.decode("Raw Data", fields.get("Raw Data Length", 0), + "int", pos=3Dfields.get("Raw Data Offset", 0)) + + if not fields.get("Section Type"): + return + + print() + + # Now, decode the rest of the record for known decoders + for guid, cls in decode_list: + if fields.get("Section 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.get('Section 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 d5ffd51f161e..3e5b7a6853cf 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 Sun Jan 25 10:13:58 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=1769175400; cv=none; d=zohomail.com; s=zohoarc; b=e42NMS5MxF7ltl514EKYO7/np1NSZ1yGL+77hEioeRXaCuSe2MUmgHtP0xkAU4m1Zu7/18Of4NSZHaYFXiauIWzq3LrgAnYMgV5a7QuwvxVAb9+He7vnZdIMctyy08shc3eH1rwuMP3PNle6bW2v/xXXyr981FbozVYUj7qAmVg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175400; 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=09Nfm56h2hct4IVBR1/wdoTz3iV5/JYWR9Xy1nr9Jis=; b=Pfy6kheHJJQ+5qu7j4sFbxjFXRrWFErwvDS6dj+OBVJw02pidn9AL2LvaL5e+lcC+YREONrnOaQ74irvQMFdnzaHCUJTnMyBRh+FpDKjOUlDIduLbSOw43bJSYeAaCmurVzGb/5S9f5W29cjqqrB9jP2v9iqUQdBYvhGEPw3SWU= 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 1769175400244985.1623812261505; Fri, 23 Jan 2026 05:36:40 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKL-0007V1-Cu; Fri, 23 Jan 2026 08:35:53 -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 1vjHKK-0007UR-8o for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:52 -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 1vjHKI-0004dI-Sg for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:35:52 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 07955419B6; Fri, 23 Jan 2026 13:35:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DC574C4CEF1; Fri, 23 Jan 2026 13:35:49 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKF-000000063K1-2tqd; Fri, 23 Jan 2026 14:35:48 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175349; bh=df1SQyLPe1AgLmzuzWGgw1GL4THVwDBvScVE5vk9mvo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=gQRksBFKHXQNbBkP7ZMbZOZYb96eJ/gIPhrkyLMeqlrYuuEHi3MBsWkk1Y90jYiuu EXOiaB3Wz06aAKXnIvy4ZV9ESXA/lFWS/gLP2Ky79Yo+M5+L2A+6FemLGHREvoayXA Y/hqSMM7oYWRnbzcnNApqvKaiVKVuJn36ITdOD+AeDJA5NSAyk0CX6L2eomyKy0meR YlJCJdecrA26FixckDufwYwzn1X1FBfZ5Jy6bo7x8vG4MDuTZTXce9CqnrQwtVT3gU jNMkOVtBUi+Raoe0/v7hf8/fGQf09r+oWBmJmCJnqiX8qg4oFMqciLqoMn2jjx9BTR xN679LODWV0Jw== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 08/13] scripts/ghes_inject: exit 1 if command was not sent Date: Fri, 23 Jan 2026 14:35:22 +0100 Message-ID: <33f73ccf18dd1cf7cb7dbf54e72c81581eb7c84c.1769175070.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 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.079, 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: 1769175402212158500 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 Sun Jan 25 10:13:58 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=1769175481; cv=none; d=zohomail.com; s=zohoarc; b=bZGL4fzt7uNz9fGqDLrBoMstBCdvQXQramKp3+R801ecrWIBjd95M+9heLAxZLfmOEGFM1iBJS1hkvFyygLY2OY+3ecADOQh7vno54V5zYfOVLbbOi+1+sBGPls30YdKyGIMbWwcXNNjyboOXOMUOzM/YpNtyYOZm88bZ0K8b00= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175481; 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=BAtm62fhLx1uG7vveB8VtaURJIMP510EtTUSPkSvI/E=; b=lCcS2ZCrOjKtKk5UsAOpCw3gDRGBofOkFW62aWx/WcvlHqFw59nUcYthsl9hpvXDqhBA6Jq+oKHhmsA6uaPm7nCIqcR64/KsBDoi1F9W53y8UiZQdPGaIau4S7tp9Z+xAiY/2/bN4UGFyMBTOjy2sINCMrE/5n+BAWcX1pNK7nQ= 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 1769175481475424.3423622139609; Fri, 23 Jan 2026 05:38:01 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKl-0007q3-Uk; Fri, 23 Jan 2026 08:36:19 -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 1vjHKV-0007fM-3b for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:06 -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 1vjHKR-0004eG-43 for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:02 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id E1C5960010; Fri, 23 Jan 2026 13:35:57 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 760F9C4CEF1; Fri, 23 Jan 2026 13:35:57 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKK-000000063K7-0NUl; Fri, 23 Jan 2026 14:35:55 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175357; bh=EmQeFY0Ph0iY+ei/fVP2lTzsVgetZHcMU/ameqRXywY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FknLJb34Jfz6cXQYDQPhyJTsZmbkWaPmqWu0TfwxOO7NNHx0h0vsiSBVeNagIIUft e6XyhmJCLGI+mIUI8Zvt+3OTioCI9lCeAJ3zhNDO5qg9PMSpZJS9OV4ze0VfJAIRNj l34hy84iwSn5JE6mwVLbJdsk/b3qG7r7gvOf8VAhaBeGqTMNqntTJ44qlOtwpDUHG/ kGXiBshnfnmCebRYGxZuQYZ6OFXbH46bBRowyqyyMwAtYUMbVs9A257jc3l1WwflE2 7ksa12GCya3Rvjr0mtsHjxhhGziyGIEUeiJy0X2BykQRvMj1FpD/cgiyMB9BoLorne MDBE1rVEOIfGw== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 09/13] scripts/ghes_inject: add a handler for PCI/PCI-X bus error Date: Fri, 23 Jan 2026 14:35:23 +0100 Message-ID: <35c61dd959e8d2687fa282c44471a9de5ef50ad5.1769175070.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 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.079, 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: 1769175482486158500 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/pci_bus_error.py | 146 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 scripts/pci_bus_error.py diff --git a/MAINTAINERS b/MAINTAINERS index a970c47dd089..1e62064a8672 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/pci_bus_error.py F: scripts/qmp_helper.py =20 ppc4xx diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 6ac917d0b5db..be2384a59b3e 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 pci_bus_error import PciBusError =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) + PciBusError(subparsers) =20 args =3D parser.parse_args() if "func" in args: diff --git a/scripts/pci_bus_error.py b/scripts/pci_bus_error.py new file mode 100644 index 000000000000..5abfdf11c868 --- /dev/null +++ b/scripts/pci_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 PciBusError: + """ + 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("pci-bus", + description=3D"Generate PCI/PCI-X b= us error CPER") + g_pci =3D parser.add_argument_group("PCI/PCI-X bus error") + + valid_bits =3D ",".join(self.valid_bits.keys()) + bus_command_bits =3D ",".join(self.bus_command_bits.keys()) + + g_pci.add_argument("-v", "--valid", + help=3Df"Valid bits: {valid_bits}") + g_pci.add_argument("-s", "--error-status", + type=3Dlambda x: int(x, 0), + help=3D"Error Status") + g_pci.add_argument("-t", "--error-type", + type=3Dlambda x: int(x, 0), + help=3D"Error type") + g_pci.add_argument("-b", "--bus-number", + type=3Dlambda x: int(x, 0), + help=3D"Bus number") + g_pci.add_argument("-S", "--segment-number", + type=3Dlambda x: int(x, 0), + help=3D"Segment number") + g_pci.add_argument("-a", "--bus-address", + type=3Dlambda x: int(x, 0), + help=3D"Bus address") + g_pci.add_argument("-d", "--bus-data", + type=3Dlambda x: int(x, 0), + help=3D"Bus data") + g_pci.add_argument("-c", "--bus-command", + help=3Df"bus-command: {bus_command_bits}") + g_pci.add_argument("-r", "--bus-requestor", + type=3Dlambda x: int(x, 0), + help=3D"Bus requestor ID") + g_pci.add_argument("-C", "--bus-completer", + type=3Dlambda x: int(x, 0), + help=3D"Bus completer ID") + g_pci.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 Sun Jan 25 10:13:58 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=1769175382; cv=none; d=zohomail.com; s=zohoarc; b=dduZ+maBMWe3M7CdeW+o8ntL5j29S7V4OWJ0S7SH4L791K0Mgk2MtOlfCjH4rgtNds+D7IhM3qVDXHRFX4yOIxGRH6VZSzculXpQPh14u+NjI7RnJ2+2dtzDas+av6fQIh+vJvXWCJv9WAakqXqQiueIrxiPfjV7hJw6UwuIjB4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175382; 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=SmEkZCfmLFmvduzq8+X4/qelB18CQ+Z9lumNkl6cWMs=; b=apd9VUQ1xzT8euoN7hRaGGE7g3/IQNrzINwQvg29YYRZxZAXqMgHbDae5VCZHGDgPGLTq/dRcV+ucgIlMD4TUkvVmcnwOA+6MJzjOsUsOxBkwLgfBoadgaU47Sz2Zm+UyGLUbmGvG3uFUdyRlJlmQV7aYEUmNzPUw8TDrBWMAmU= 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 1769175382824820.5735782119191; Fri, 23 Jan 2026 05:36:22 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKh-0007lF-5f; Fri, 23 Jan 2026 08:36:16 -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 1vjHKV-0007fJ-2O for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:04 -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 1vjHKS-0004eK-Rc for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:02 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id AA594600C3; Fri, 23 Jan 2026 13:35:58 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3E4FBC4CEF1; Fri, 23 Jan 2026 13:35:58 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKO-000000063KU-0Qaq; Fri, 23 Jan 2026 14:35:56 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175358; bh=HVXl3Wpl7fLTvcky1zUA5qnO5oRuivfB4qeJv6RWhfs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=JzbNFfRmBx1OF2NmkhqP1iorUbtXLMKtSuU9qGm3JH+Dk0prSJ3XIGJkE1aDg+J3g CxOO1ozmFGdFaEaE9BQ3x0SI8stpQ5FPJQw3EIDZQlfng9UqZH8wZUuYePQpHtfom0 N7Bt5w78eN4uwAl1eZwrcjwM+vzB2nJvArjeSayU6kIWQwSpVGXALIKtTsXBf7YS3C /8jLIjEbE1gUxvhFKDuWO9cCuFlSHATbCnd5s7X6HJ6FpNc8v2WOVt2sijrGYsvf8M 1PjLpGdp9P4MFOOH987JvEQfyOfSHrQ6ML3BuES8nXM+3vTuOcmaJ5fnDulIA+wK9O r5/kzzg3WBl+g== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 10/13] scripts/ghes_inject: add support for fuzzy logic testing Date: Fri, 23 Jan 2026 14:35:24 +0100 Message-ID: <9df9ac7f31295c0d7f9866e8ee5d55a925985d5f.1769175070.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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175384114158500 Add a command to inject random errors for fuzzy logic testing. By default, it will generate a single test for a random valid GUID with random bytes inside the CPER payload. The command allows specifying: - a single type of CPER; - a range of minimum/maximum payload size; - change its default to fill with zero instead of random; - multiple CPERs with an specified count; - ensure a delay between them; - setup a timeout to retry if an attempt fails (useful when count > 1). Signed-off-by: Mauro Carvalho Chehab Reviewed-by: Jonathan Cameron --- 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 1e62064a8672..967aafc35a92 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/pci_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 be2384a59b3e..bcbfffc586e1 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -13,6 +13,7 @@ =20 from arm_processor_error import ArmProcessorEinj from pci_bus_error import PciBusError +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) PciBusError(subparsers) + FuzzyError(subparsers) =20 args =3D parser.parse_args() if "func" in args: --=20 2.52.0 From nobody Sun Jan 25 10:13:58 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=1769175459; cv=none; d=zohomail.com; s=zohoarc; b=MLGld+VoNU8D+ZKmAsYoErea/AiLAQO6c2WvvbstEVlbJNgjPIv6bOOSA24LKYytpRhIzDyCdowRAje9q6hqrnADpeddDYGP2psmoPPdvha5EUnYj0ToMwIq6jLqyELDSiB1u6H/nNZpMInipW/+SMixIgGv2x4LJxg1Lkb4bNs= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175459; 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=CI8MlYY/xBWZvm9fO7KRdNt9JepBlVHdaoALTzi/alU=; b=W7d7+UDRcR9NjX1qqL1g50WsImLg9ui6gRFsYy8znjUJe4BTDnE20Sf9Elmjlv8XKzdeLFgIV3NccG/ZCfSKVKnR8oScdkn6pn2O8rSthvsVsUfRU54p/qp5IgtY0KmL11GTR90ux0XAyZtn77/Gek3DioCJ8CBp5AzupuJg91E= 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 1769175459053520.4289574093277; Fri, 23 Jan 2026 05:37:39 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKl-0007nj-5C; Fri, 23 Jan 2026 08:36:19 -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 1vjHKY-0007gI-NW for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:08 -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 1vjHKT-0004fw-Kw for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:04 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id E76B260135; Fri, 23 Jan 2026 13:36:00 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 75928C4CEF1; Fri, 23 Jan 2026 13:36:00 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKP-000000063KX-1l7q; Fri, 23 Jan 2026 14:35:58 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175360; bh=Hq0k9nQ+3YTLX7MeUDpF/YKj4jUzRbJabQ9UNor/cDk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j9ME++wJvVqNwfjVKaQLl8aGAM6scEfZf/Xeg6QeSuI//eZQOvfs5TnrJ7sBl/9NL YXqjBADk3ClWPygk2pfsflXoPb5Ml8v8cZD8Q2E7/YfzQlO7YUGJCyKhkJf0+kZz9N 4JU1zj47XeZELPCv8u0iUuoJuDL3iDujSoDSOUZ0ZkJTRDT3F5Sm4thQHPQTxTRVxJ 2vFQR/QIcS1f/w64FRWbdqbBYwGm5mVc8qHOPqb4V6KraDWkmGdAeD8QVvI0M3H4BF RN8B8EGsaW83KV+qfi35tB9kQLlQWQxpfNBwFnGUq0vZ9ax7GnkHebEAFnbqVPTG2w u/q4KFxYKDX8A== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 11/13] scripts/ghes_inject: add a raw error inject command Date: Fri, 23 Jan 2026 14:35:25 +0100 Message-ID: <8a8d1f55bc592c8f367fe948d4954dfefe59253d.1769175070.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 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.079, 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: 1769175460822154100 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 Reviewed-by: Jonathan Cameron --- 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 967aafc35a92..2e48df7abfb5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2231,6 +2231,7 @@ F: scripts/arm_processor_error.py F: scripts/fuzzy_error.py F: scripts/pci_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 bcbfffc586e1..63a8b28002e7 100755 --- a/scripts/ghes_inject.py +++ b/scripts/ghes_inject.py @@ -14,6 +14,7 @@ from arm_processor_error import ArmProcessorEinj from pci_bus_error import PciBusError 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) PciBusError(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 Sun Jan 25 10:13:59 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=1769175457; cv=none; d=zohomail.com; s=zohoarc; b=mlI/qWKyYy/Ef4Pu6olMvVZy8yrgt3gc1rYCXBDutUeThIg9Y3bYwG4yqJJx+7zWbxWPGNVE51Nn5XvH2uc3jNlxK4oznbwk94bsW0mpzvztx1gmqX5sawjwPLiXeN+WPWCCc82YfJK51hsFnDbUymqHyMjT41gEmM4MrosYt48= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175457; 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=MbaoQojGNXRiXiniynH0GMn2DHwW2PI7tEhzGjyeeYc=; b=UjyKbCf6Au3nouAueiY9+tWbJyKCVLS8vgWQaY6pYcbMrGp92JH3lhsiC9FJ7AXy5Ky0dAB/4uhrkFe4bhhLmuqLupBSOqIQY2I+QMk44mM+IRweW89+wYLg4h6UrXyxtk9zBDcDkb2wydlYygCuo2SvHjZ6lhEMZL7NjcAlEHY= 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 1769175457110653.102607959438; Fri, 23 Jan 2026 05:37:37 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKl-0007p8-Is; Fri, 23 Jan 2026 08:36:19 -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 1vjHKa-0007hL-Og for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:10 -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 1vjHKV-0004hg-N7 for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:07 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id AA80D43ADE; Fri, 23 Jan 2026 13:36:02 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 8B282C19421; Fri, 23 Jan 2026 13:36:02 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKS-000000063Kl-2F08; Fri, 23 Jan 2026 14:36:00 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175362; bh=9qrS69E/giGmWJ2vuuG1B6GTk/90s8aSx2L1n/goH/0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=U4UpwD2xrPVKew0W8dxBUYqRGkGir4hSnxx1qfqnyfU1fzDBsDXynDh15r2gg6uPz aeUkmkogAArZfBjaXPfpiFujWvQUApdF7019GMc7FgoRKOge6Dcw64w/KlM8HSjF7B Fpx76j/8APAU8kYpBWavrSY2zquueYWjQaZs6iAtZOmdGPhVJGswIqfRTnk+Z1oS1C QMRvVAz90MnelrtVEN1fsPPY9C0WgHlgk4FEHMxqlTsRwKhUUD9PORy3Zo89DDkKQK 5/SCa87yG76r6A90SnQNwkXhm2F8mlV3hq2A7gqRsaZ6xGE9l9CNGR8Zz27l3IquU8 Og84igIh1toyw== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 12/13] scripts/ghes_inject: print help if no command specified Date: Fri, 23 Jan 2026 14:35:26 +0100 Message-ID: <0e2aed0a0f04a9a575731aee95d373b0b54ab38b.1769175070.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 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.079, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_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: 1769175458434158500 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 --- scripts/ghes_inject.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/ghes_inject.py b/scripts/ghes_inject.py index 63a8b28002e7..dd2b34a64f15 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 Sun Jan 25 10:13:59 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=1769175465; cv=none; d=zohomail.com; s=zohoarc; b=b+TzelzER9kSQPP3UExc6X9SUeKy8i22h2leR2h9ClrD/ntsvynfeOHhMxVPPPXt/z73XJDAaDsWa8R1amN56chWzc9aeFRGOid5SWVBmlFkU0EKjru6LZZK/zkb1KwVbTl/D8YAa8ZVsXqE0X5eHmGtD92QQRk/j2Tpu0yv2ZY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1769175465; 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=76owvlo0WqmUZv2nou+97DNHUd9qt6l006thFwPhK/M=; b=b/4XS4HHF4XpeBUQcdL/D4Yyt4l+jqkfiCBYlsIaStB3CODoBHJMEApcyB7nY7ao/qbrhDZhW+sFI8QMqXqK8r/+IdHkzYuXvq4tkHXNANTWV4fH5Gc+uhvxkFDGbxqNTXBUFffo19dUbu+xIyJWm/uoZ+TqC8w6cYAluYUv7DI= 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 1769175465017608.4317658795036; Fri, 23 Jan 2026 05:37:45 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vjHKm-0007rY-NT; Fri, 23 Jan 2026 08:36:20 -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 1vjHKc-0007jV-Ni for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:11 -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 1vjHKa-0004iM-Cc for qemu-devel@nongnu.org; Fri, 23 Jan 2026 08:36:10 -0500 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sea.source.kernel.org (Postfix) with ESMTP id 9D6B3438D8; Fri, 23 Jan 2026 13:36:06 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 7D6A3C19423; Fri, 23 Jan 2026 13:36:06 +0000 (UTC) Received: from localhost ([::1]) by mail.kernel.org with esmtp (Exim 4.99.1) (envelope-from ) id 1vjHKV-000000063Kt-2Ax1; Fri, 23 Jan 2026 14:36:04 +0100 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1769175366; bh=lxhwQKIzlrcBI4tFlx1FpaWq7baQO6Do2qGzPtxkNXc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BP5DRs0IFROwchpOHK53AIvkYFlUugHqFfqJLpi4JcpO0doq0IoCqEeJZC8iknWWZ dxhI8m48qRw6hCabzV2bAk9U7rqoF6MP2pG/LAfEFtUn43XTXLiDPTAZbBkv0TQgyt 9ssnZgTFCLCgRpzGVWD8W1xdKRIIEHs+ciHhIM8qfOEohE+w8CAdeOPvYbjcxNvc3X sgFg3OOsl+Or2d6pdE+9YfRauI5Uh3Mo+0C9oFacuu1/xtWl82+A2zWvmPtWPIo74Q HPTSCsWHPNs9m7nYGz7bEhJF+ruSbM8bwAnyXM3nyhrz7oA5IOblq5oSIU67AUKM0A iQfIBfTRxzTQA== From: Mauro Carvalho Chehab To: "Michael S. Tsirkin" Cc: Mauro Carvalho Chehab , qemu-devel@nongnu.org, Cleber Rosa , John Snow , Jonathan Cameron Subject: [PATCH v2 13/13] scripts/ghes_inject: improve help message Date: Fri, 23 Jan 2026 14:35:27 +0100 Message-ID: <56c9b3c8010ecc446d2ed2fd9fd5b5337c1f89c3.1769175070.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 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.079, 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: 1769175466353158500 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,pci-bus,fuzzy-test,fuzzy,raw-error,raw} arm Inject an ARM processor error CPER, compatible wi= th UEFI 2.9A Errata. pci-bus Inject a PCI/PCI-X 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/pci_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 dd2b34a64f15..21cdea774f17 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/pci_bus_error.py b/scripts/pci_bus_error.py index 5abfdf11c868..87d1f7c95dd2 100644 --- a/scripts/pci_bus_error.py +++ b/scripts/pci_bus_error.py @@ -35,8 +35,10 @@ def __init__(self, subparsers): =20 self.data =3D bytearray() =20 + DESC =3D "Inject a PCI/PCI-X bus error CPER" + parser =3D subparsers.add_parser("pci-bus", - description=3D"Generate PCI/PCI-X b= us error CPER") + help=3DDESC, description=3DDESC) g_pci =3D parser.add_argument_group("PCI/PCI-X 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