From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054586; cv=none; d=zohomail.com; s=zohoarc; b=KxKdctGyhrhMPBtYcY179WmICKpzPEI9L4kIL0or4h5RSbFTr5FOcbh27sOLKJc7kM/5OhvRjQyAOcB+kVXHgwF1juM/+y96oTGa3asHQ8yAK1e4BRkY5WHjE+oPK6baLu63ohrRUou4DHYqHmrmvKofGlGE3f0SI2nAEyGchss= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054586; 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=hNUVLPii9Qe3cT4suVExLXaliwhaz3+9lgUpPXWxLiU=; b=eWw8z6J+L624vWHrCtroN/07zzHv2QE4qo8Ewb99l5Df8qHfprpEgjRLTRaWDNWCgihPDeLJsdNbG6sexdHDi9unmeJZUHiEwiiFJwiaqrnD2m57WP14tuD8QHsJZEUBjgL1g5nUuWNRKPLR5fdxDORFqms4qC0NYp121Bj2gsk= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054586866101.50030089033157; Tue, 21 Oct 2025 06:49:46 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjI-0001y6-ND; Tue, 21 Oct 2025 09:48:48 -0400 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 1vBCjE-0001wX-65; Tue, 21 Oct 2025 09:48:44 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjB-0006oM-5x; Tue, 21 Oct 2025 09:48:43 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L4iGow027377; Tue, 21 Oct 2025 13:48:38 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9v1-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:37 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LD1WOk027572; Tue, 21 Oct 2025 13:48:37 GMT Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9uy-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:37 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LCADec032099; Tue, 21 Oct 2025 13:48:36 GMT Received: from smtprelay03.fra02v.mail.ibm.com ([9.218.2.224]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vp7mtyqq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:35 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay03.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmWNa49152368 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:32 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F0EE42004D; Tue, 21 Oct 2025 13:48:31 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C47042004E; Tue, 21 Oct 2025 13:48:28 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:28 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=hNUVLP ii9Qe3cT4suVExLXaliwhaz3+9lgUpPXWxLiU=; b=KiUa3kSLF2TbUxPoE1Ewdw +gpHzNEyuzP6rlKDp40ChDkAoYlj1aSBwcfQpyiAdEKw8oXfXStbOWeTReJOyhWi L5fOkeRGEUgNufdK5lFnYYlrhrXQbOCsuo45ZYY3BZ8Ineq0QVhFF448uKAnIjXG +h3YCL4tihssAf+O+EV3/uQFbGMDVFrtLrfeLG9HnnOB0D6cuxCxEXZaiP/HWK2x koGihk2HD7T9VrWrzvJ2nnie0YoERhZDzBMdWUOHxNkpsQI3Nwzeac0TdE9Mfe6x gKTuxvRYpkXSUaMnhX5HvhFt3KPmV0m0ZXQNSflZGbfBx7hCwdF63ebh8jOjihfQ == From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 1/8] hw/ppc: Implement fadump register command Date: Tue, 21 Oct 2025 19:18:11 +0530 Message-ID: <20251021134823.1861675-2-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f78f35 cx=c_pps a=GFwsV6G8L6GxiO2Y/PsHdQ==:117 a=GFwsV6G8L6GxiO2Y/PsHdQ==:17 a=IkcTkHD0fZMA:10 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=y74iKLHVKnUro7i0tboA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX38ruD3XF26H2 8WjegChBJyboLyE8nca2kaMbuqOL9xCygzPwoykXVbYTQazooxhxkbRstY3jeVcOkzoMPOvjKwG dC8BgCHVmX3CYCzqstcwSRw9e4hlGsGlRt82sfcHMqj64vsIW2g7rzTrUSXc/1nB9FkxFgwn8mR jNN7gqOVuOqWLRkMWFI/QBoANgMkor2W/wRhcb2pgf8tRKJJJEMdNO5gWPeT3pqiB9uxskxyUGp fYGoN0EOmoJ1OA6bE6rta3ssSCSNomYaUJsnfwHOA7lNGLhHyV4N3KIvZs2c6x7l22B2l7e+mc9 TcGCKOH7DrD3r9+4Vi1kcEdgYnpu1fjlxGEAbuj8c7cE6PGUXnUJo70FXS3SF/9/kfk4J9qn70J QPY2C69aeliZJj54Vq2meoV38+AXSA== X-Proofpoint-GUID: oGQkzLuSfWSThLzTlFgLaqV4xObJNOqf X-Proofpoint-ORIG-GUID: gZuaniQAY1G8p6_gsAppRv9fVJa65rDv X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.156.1; envelope-from=adityag@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054589227158500 Add skeleton to handle "ibm,configure-kernel-dump" rtas call in QEMU, including register, unregister and invalidate commands. The register just verifies the structure of the fadump memory structure passed by kernel, and set fadump_registered in spapr state to true. Verify basic details mandated by the PAPR, such as number of inputs/output, and add handling for the three fadump commands: regiser/unregister/invalidate. The checks are based on the table in following requirement in PAPR v2.13: "R1=E2=80=937.3.30=E2=80=931. For the Configure Platform Assisted Kerne= l Dump option ..." Relevant section for the register command in PAPR is: Section 7.3.30: "ibm,configure-kernel-dump RTAS call" (PAPR v2.13) Note: Any modifications made by the kernel to the fadump memory structure after the 'ibm,configure-kernel-dump' RTAS call returns will not be reflected in QEMU, as QEMU retains the fadump memory structure that was provided during fadump registration. The kernel must unregister and re-register fadump to apply any changes to the fadump memory structure. Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/meson.build | 1 + hw/ppc/spapr_fadump.c | 123 ++++++++++++++++++++++++++++++++++ hw/ppc/spapr_rtas.c | 71 ++++++++++++++++++++ include/hw/ppc/spapr.h | 11 ++- include/hw/ppc/spapr_fadump.h | 69 +++++++++++++++++++ 5 files changed, 274 insertions(+), 1 deletion(-) create mode 100644 hw/ppc/spapr_fadump.c create mode 100644 include/hw/ppc/spapr_fadump.h diff --git a/hw/ppc/meson.build b/hw/ppc/meson.build index 170b90ae7d05..6b7c1f4f49fb 100644 --- a/hw/ppc/meson.build +++ b/hw/ppc/meson.build @@ -26,6 +26,7 @@ ppc_ss.add(when: 'CONFIG_PSERIES', if_true: files( 'spapr_nvdimm.c', 'spapr_rtas_ddw.c', 'spapr_numa.c', + 'spapr_fadump.c', 'pef.c', )) ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_TCG'], if_true: files( diff --git a/hw/ppc/spapr_fadump.c b/hw/ppc/spapr_fadump.c new file mode 100644 index 000000000000..2c9f024c2d8c --- /dev/null +++ b/hw/ppc/spapr_fadump.c @@ -0,0 +1,123 @@ +/* + * Firmware Assisted Dump in PSeries + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qemu/log.h" +#include "hw/ppc/spapr.h" + +/* + * Handle the "FADUMP_CMD_REGISTER" command in 'ibm,configure-kernel-dump' + * + * Note: Any changes made by the kernel to the fadump memory struct won't + * reflect in QEMU after the 'ibm,configure-kernel-dump' RTAS call has ret= urned, + * as we store the passed fadump memory structure passed during fadump + * registration. + * Kernel has to invalidate & re-register fadump, if it intends to make any + * changes to the fadump memory structure + * + * Returns: + * * RTAS_OUT_SUCCESS: On successful registration + * * RTAS_OUT_PARAM_ERROR: If parameters are not correct, eg. too many + * sections, invalid memory addresses that we are + * unable to read, etc + * * RTAS_OUT_DUMP_ALREADY_REGISTERED: Dump already registered + * * RTAS_OUT_HW_ERROR: Misc issue such as memory access failures + */ +uint32_t do_fadump_register(SpaprMachineState *spapr, target_ulong args) +{ + FadumpSectionHeader header; + FadumpSection regions[FADUMP_MAX_SECTIONS] =3D {0}; + target_ulong fdm_addr =3D rtas_ld(args, 1); + target_ulong fdm_size =3D rtas_ld(args, 2); + AddressSpace *default_as =3D &address_space_memory; + MemTxResult io_result; + MemTxAttrs attrs; + uint64_t next_section_addr; + uint16_t dump_num_sections; + + /* Mark the memory transaction as privileged memory access */ + attrs.user =3D 0; + attrs.memory =3D 1; + + if (spapr->fadump_registered) { + /* FADump already registered */ + return RTAS_OUT_DUMP_ALREADY_REGISTERED; + } + + if (spapr->fadump_dump_active) { + return RTAS_OUT_DUMP_ACTIVE; + } + + if (fdm_size < sizeof(FadumpSectionHeader)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Header size is invalid: " TARGET_FMT_lu "\n", fdm_siz= e); + return RTAS_OUT_PARAM_ERROR; + } + + /* Ensure fdm_addr points to a valid RMR-memory/RMA-memory buffer */ + if ((fdm_addr <=3D 0) || ((fdm_addr + fdm_size) > spapr->rma_size)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Invalid fdm address: " TARGET_FMT_lu "\n", fdm_addr); + return RTAS_OUT_PARAM_ERROR; + } + + /* Try to read the passed fadump header */ + io_result =3D address_space_read(default_as, fdm_addr, attrs, + &header, sizeof(header)); + if (io_result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Unable to read fdm: " TARGET_FMT_lu "\n", fdm_addr); + + return RTAS_OUT_HW_ERROR; + } + + /* Verify that we understand the fadump header version */ + if (header.dump_format_version !=3D cpu_to_be32(FADUMP_VERSION)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Unknown fadump header version: 0x%x\n", + header.dump_format_version); + return RTAS_OUT_PARAM_ERROR; + } + + /* Reset dump status flags */ + header.dump_status_flag =3D 0; + + dump_num_sections =3D be16_to_cpu(header.dump_num_sections); + + if (dump_num_sections > FADUMP_MAX_SECTIONS) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Too many sections: %d sections\n", dump_num_sections); + return RTAS_OUT_PARAM_ERROR; + } + + next_section_addr =3D + fdm_addr + + be32_to_cpu(header.offset_first_dump_section); + + for (int i =3D 0; i < dump_num_sections; ++i) { + /* Read the fadump section from memory */ + io_result =3D address_space_read(default_as, next_section_addr, at= trs, + ®ions[i], sizeof(regions[i])); + if (io_result !=3D MEMTX_OK) { + qemu_log_mask(LOG_UNIMP, + "FADump: Unable to read fadump %dth section\n", i); + return RTAS_OUT_PARAM_ERROR; + } + + next_section_addr +=3D sizeof(regions[i]); + } + + spapr->fadump_registered =3D true; + spapr->fadump_dump_active =3D false; + + /* Store the registered fadump memory struct */ + spapr->registered_fdm.header =3D header; + for (int i =3D 0; i < dump_num_sections; ++i) { + spapr->registered_fdm.rgn[i] =3D regions[i]; + } + + return RTAS_OUT_SUCCESS; +} diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 143bc8c37947..6042fc72e57a 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -344,6 +344,73 @@ static void rtas_ibm_set_system_parameter(PowerPCCPU *= cpu, rtas_st(rets, 0, ret); } =20 +/* Papr Section 7.4.9 ibm,configure-kernel-dump RTAS call */ +static void rtas_configure_kernel_dump(PowerPCCPU *cpu, + SpaprMachineState *spapr, + uint32_t token, uint32_t nargs, + target_ulong args, + uint32_t nret, target_ulong rets) +{ + target_ulong cmd =3D rtas_ld(args, 0); + uint32_t ret_val; + + /* Number of outputs has to be 1 */ + if (nret !=3D 1) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: ibm,configure-kernel-dump called with nret !=3D 1.\n"= ); + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + + /* Number of inputs has to be 3 */ + if (nargs !=3D 3) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: ibm,configure-kernel-dump called with nargs !=3D 3.\n= "); + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + + switch (cmd) { + case FADUMP_CMD_REGISTER: + ret_val =3D do_fadump_register(spapr, args); + if (ret_val !=3D RTAS_OUT_SUCCESS) { + rtas_st(rets, 0, ret_val); + return; + } + break; + case FADUMP_CMD_UNREGISTER: + if (spapr->fadump_dump_active) { + rtas_st(rets, 0, RTAS_OUT_DUMP_ACTIVE); + return; + } + + spapr->fadump_registered =3D false; + spapr->fadump_dump_active =3D false; + memset(&spapr->registered_fdm, 0, sizeof(spapr->registered_fdm)); + break; + case FADUMP_CMD_INVALIDATE: + if (!spapr->fadump_dump_active) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Nothing to invalidate, no dump active\n"); + + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + } + + spapr->fadump_registered =3D false; + spapr->fadump_dump_active =3D false; + memset(&spapr->registered_fdm, 0, sizeof(spapr->registered_fdm)); + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Unknown command: " TARGET_FMT_lu "\n", cmd); + + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); + return; + } + + rtas_st(rets, 0, RTAS_OUT_SUCCESS); +} + static void rtas_ibm_os_term(PowerPCCPU *cpu, SpaprMachineState *spapr, uint32_t token, uint32_t nargs, @@ -659,6 +726,10 @@ static void core_rtas_register_types(void) spapr_rtas_register(RTAS_IBM_NMI_INTERLOCK, "ibm,nmi-interlock", rtas_ibm_nmi_interlock); =20 + /* Register fadump rtas call */ + spapr_rtas_register(RTAS_CONFIGURE_KERNEL_DUMP, "ibm,configure-kernel-= dump", + rtas_configure_kernel_dump); + qtest_set_command_cb(spapr_qtest_callback); } =20 diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h index 39bd5bd5ed31..4c1636497e30 100644 --- a/include/hw/ppc/spapr.h +++ b/include/hw/ppc/spapr.h @@ -13,6 +13,7 @@ #include "hw/ppc/xics.h" /* For ICSState */ #include "hw/ppc/spapr_tpm_proxy.h" #include "hw/ppc/spapr_nested.h" /* For SpaprMachineStateNested */ +#include "hw/ppc/spapr_fadump.h" /* For FadumpMemStruct */ =20 struct SpaprVioBus; struct SpaprPhbState; @@ -283,6 +284,11 @@ struct SpaprMachineState { Error *fwnmi_migration_blocker; =20 SpaprWatchdog wds[WDT_MAX_WATCHDOGS]; + + /* Fadump State */ + bool fadump_registered; + bool fadump_dump_active; + FadumpMemStruct registered_fdm; }; =20 #define H_SUCCESS 0 @@ -708,6 +714,8 @@ void push_sregs_to_kvm_pr(SpaprMachineState *spapr); #define RTAS_OUT_PARAM_ERROR -3 #define RTAS_OUT_NOT_SUPPORTED -3 #define RTAS_OUT_NO_SUCH_INDICATOR -3 +#define RTAS_OUT_DUMP_ALREADY_REGISTERED -9 +#define RTAS_OUT_DUMP_ACTIVE -10 #define RTAS_OUT_NOT_AUTHORIZED -9002 #define RTAS_OUT_SYSPARM_PARAM_ERROR -9999 =20 @@ -770,8 +778,9 @@ void push_sregs_to_kvm_pr(SpaprMachineState *spapr); #define RTAS_IBM_SUSPEND_ME (RTAS_TOKEN_BASE + 0x2A) #define RTAS_IBM_NMI_REGISTER (RTAS_TOKEN_BASE + 0x2B) #define RTAS_IBM_NMI_INTERLOCK (RTAS_TOKEN_BASE + 0x2C) +#define RTAS_CONFIGURE_KERNEL_DUMP (RTAS_TOKEN_BASE + 0x2D) =20 -#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x2D) +#define RTAS_TOKEN_MAX (RTAS_TOKEN_BASE + 0x2E) =20 /* RTAS ibm,get-system-parameter token values */ #define RTAS_SYSPARM_SPLPAR_CHARACTERISTICS 20 diff --git a/include/hw/ppc/spapr_fadump.h b/include/hw/ppc/spapr_fadump.h new file mode 100644 index 000000000000..f64f33920496 --- /dev/null +++ b/include/hw/ppc/spapr_fadump.h @@ -0,0 +1,69 @@ +/* + * Firmware Assisted Dump in PSeries + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#ifndef PPC_SPAPR_FADUMP_H +#define PPC_SPAPR_FADUMP_H + +#include "qemu/osdep.h" +#include "cpu.h" + +/* Fadump commands */ +#define FADUMP_CMD_REGISTER 1 +#define FADUMP_CMD_UNREGISTER 2 +#define FADUMP_CMD_INVALIDATE 3 + +#define FADUMP_VERSION 1 + +/* + * The Firmware Assisted Dump Memory structure supports a maximum of 10 se= ctions + * in the dump memory structure. Presently, three sections are used for + * CPU state data, HPTE & Parameters area, while the remaining seven secti= ons + * can be used for boot memory regions. + */ +#define FADUMP_MAX_SECTIONS 10 + +typedef struct FadumpSection FadumpSection; +typedef struct FadumpSectionHeader FadumpSectionHeader; +typedef struct FadumpMemStruct FadumpMemStruct; + +struct SpaprMachineState; + +/* Kernel Dump section info */ +/* All fields are in big-endian */ +struct FadumpSection { + uint32_t request_flag; + uint16_t source_data_type; + uint16_t error_flags; + uint64_t source_address; + uint64_t source_len; + uint64_t bytes_dumped; + uint64_t destination_address; +}; + +/* ibm,configure-kernel-dump header. */ +struct FadumpSectionHeader { + uint32_t dump_format_version; + uint16_t dump_num_sections; + uint16_t dump_status_flag; + uint32_t offset_first_dump_section; + + /* Fields for disk dump option. */ + uint32_t dd_block_size; + uint64_t dd_block_offset; + uint64_t dd_num_blocks; + uint32_t dd_offset_disk_path; + + /* Maximum time allowed to prevent an automatic dump-reboot. */ + uint32_t max_time_auto; +}; + +/* Note: All the data in these structures is in big-endian */ +struct FadumpMemStruct { + FadumpSectionHeader header; + FadumpSection rgn[FADUMP_MAX_SECTIONS]; +}; + +uint32_t do_fadump_register(struct SpaprMachineState *, target_ulong); +#endif /* PPC_SPAPR_FADUMP_H */ --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054625; cv=none; d=zohomail.com; s=zohoarc; b=Eq0zQLQg3+M57MocjCxZPKsreXCZ9M2AEstYG1tjNnWt4hFeajL+du6hIyIk7RwquVINDMpjhWNyST8FGOn3m1zdWaIzJMHCv1oOjJfKLfEv7jxl/MhdwrVCVQTPKmULkeT1GUHv1iAuIiuHohYef9sWE8+zoKwiewHYG8tAId8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054625; 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=1gwrSMOxjASWqQzstKrPrgFD7kb1GYyPhl/PE8zYMG0=; b=YA3XvhXyoZUsG4NtdQzm2kZ+E6IB+Zp2vYWu8O4/SW9vR16GOfRxrrBl5MhEws7t7WVdObFQscahajxHKDOGRqO/o1m+pWxPOVVs4hWeqq7GBSigQFG++vjyjUYtC5n4eXiQyMLOVRIc3NbrS6fUbuZjTSjR9X5T/sRh6nfnOXQ= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054625668955.8180992206394; Tue, 21 Oct 2025 06:50:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjK-00023y-R0; Tue, 21 Oct 2025 09:48:50 -0400 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 1vBCjH-0001xA-1e; Tue, 21 Oct 2025 09:48:47 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjE-0006os-S2; Tue, 21 Oct 2025 09:48:46 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L8R37T009507; Tue, 21 Oct 2025 13:48:42 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9vc-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:42 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDfCqY032551; Tue, 21 Oct 2025 13:48:41 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9v9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:41 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LAqrRf014650; Tue, 21 Oct 2025 13:48:41 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vn7s375j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:40 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmb7K31260940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:37 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 189E22004B; Tue, 21 Oct 2025 13:48:37 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 062682004D; Tue, 21 Oct 2025 13:48:34 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:32 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=1gwrSM OxjASWqQzstKrPrgFD7kb1GYyPhl/PE8zYMG0=; b=lbGPd9eX15e7xcreZfVjFd B6vxn/ZZ3O7/6Am4cor+fo3o7jFKcJ1l7/BHJuJ5t3Rae1qUt6sox3JZyzcwZ6VZ Fp1joHrdZHcRJY8zhWepBIR5rXJtaBq/teue9hM+MIau3/oTHw/5tKICwUItMLrr +O8bdk1n9vUZPlm68USDgVsZhm/q69KmESVcyedl1KJ+yFioSQooxh8R3/wqtKls Sa4T0lp7yf6wfd6B97LGMYutPnvMqVMI+HMlGc5I9mHW1jDJxGXm+za5CakL3D+Y 5uNA88uFoTa32Ql+LJDJdYd/bYlqvhhlj8InvakB0Jnzl7LLuv1S1vzvE9Kx8R1w == From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 2/8] hw/ppc: Trigger Fadump boot if fadump is registered Date: Tue, 21 Oct 2025 19:18:12 +0530 Message-ID: <20251021134823.1861675-3-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f78f3a cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=0zk2mqwd87mI4NWwDEcA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX3B45DL8lOgvj gTRLXPeKRZlGCo4KsU8WiDHJm3BKyPSlxq/MfDD0kC099fXDy+eTOnQktO43kHJgI0gAIwo0U1h VddRiU10Y3+mS+f0Sb9pBoMpdIvukHGTJPGhghDxYND+DWHIMwFAjpzHGA4KEGdzrSokWVY1si3 PoLogo0YeUDwenS4YANXma+ppVVQ/gR1GuY+z1mQv4bXhUmuKkTCIsCn/frt2VfBTMMBKPh9W8U hfBIKsqeyb7NzDmyPBmPO9mUWz/A+LAylEcZ9T4qRdiuFrLSMM1Leozr4mU1pLarOYf+euPf3d+ o1tETD0U1amkwRAKVBft/ijJCmGgYQMy+uSzU3VOsjKgHpSPmtUfO3p3zO2axWAF0Az3EbtRZoC ZYpyQrWPdGb15zsx5QgnSbVsW7uJng== X-Proofpoint-GUID: 2K_pxcTSfArzHZWzyt-HcjSGBVaHx5iv X-Proofpoint-ORIG-GUID: wQEWkmsLiUOerw1pNlz_MpHM2H5R5LkE X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.156.1; envelope-from=adityag@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054628331154100 According to PAPR: R1=E2=80=937.3.30=E2=80=933. When the platform receives an ibm,os-term = RTAS call, or on a system reset without an ibm,nmi-interlock RTAS call, if the platform has a dump structure registered through the ibm,configure-kernel-dump call, the platform must process each registered kernel dump section as required and, when available, present the dump structure information to the operating system through the =E2=80=9Cibm,kernel-dump=E2=80=9D property, updated with st= atus for each dump section, until the dump has been invalidated through the ibm,configure-kernel-dump RTAS call. If Fadump has been registered, trigger an Fadump boot (memory preserving boot), if QEMU recieves a 'ibm,os-term' rtas call. Implementing the fadump boot as: * pause all vcpus (will need to save registers later) * preserve memory regions specified by fadump (will be implemented in future) * do a memory preserving reboot (GUEST_RESET in QEMU doesn't clear the memory) Memory regions registered by fadump will be handled in a later patch. Note: Preserving memory regions is not implemented yet so on an "ibm,os-term" call will just trigger a reboot in QEMU if fadump is registered, and the second kernel will boot as a normal boot (not fadump boot) Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/spapr_fadump.c | 77 +++++++++++++++++++++++++++++++++++ hw/ppc/spapr_rtas.c | 5 +++ include/hw/ppc/spapr_fadump.h | 6 +++ 3 files changed, 88 insertions(+) diff --git a/hw/ppc/spapr_fadump.c b/hw/ppc/spapr_fadump.c index 2c9f024c2d8c..53e5c12c7641 100644 --- a/hw/ppc/spapr_fadump.c +++ b/hw/ppc/spapr_fadump.c @@ -7,6 +7,7 @@ #include "qemu/osdep.h" #include "qemu/log.h" #include "hw/ppc/spapr.h" +#include "system/cpus.h" =20 /* * Handle the "FADUMP_CMD_REGISTER" command in 'ibm,configure-kernel-dump' @@ -121,3 +122,79 @@ uint32_t do_fadump_register(SpaprMachineState *spapr, = target_ulong args) =20 return RTAS_OUT_SUCCESS; } + +/* Preserve the memory locations registered for fadump */ +static bool fadump_preserve_mem(void) +{ + /* + * TODO: Implement preserving memory regions requested during fadump + * registration + */ + return false; +} + +/* + * Trigger a fadump boot, ie. next boot will be a crashkernel/fadump boot + * with fadump dump active. + * + * This is triggered by ibm,os-term RTAS call, if fadump was registered. + * + * It preserves the memory and sets 'FADUMP_STATUS_DUMP_TRIGGERED' as + * fadump status, which can be used later to add the "ibm,kernel-dump" + * device tree node as presence of 'FADUMP_STATUS_DUMP_TRIGGERED' signifies + * next boot as fadump boot in our case + */ +void trigger_fadump_boot(SpaprMachineState *spapr, target_ulong spapr_retc= ode) +{ + FadumpSectionHeader *header =3D &spapr->registered_fdm.header; + + pause_all_vcpus(); + + /* Preserve the memory locations registered for fadump */ + if (!fadump_preserve_mem()) { + /* Failed to preserve the registered memory regions */ + rtas_st(spapr_retcode, 0, RTAS_OUT_HW_ERROR); + + /* Cause a reboot */ + qemu_system_guest_panicked(NULL); + return; + } + + /* + * Mark next boot as fadump boot + * + * Note: These is some bit of assumption involved here, as PAPR doesn't + * specify any use of the dump status flags, nor does the kernel use it + * + * But from description in Table 136 in PAPR v2.13, it looks like: + * FADUMP_STATUS_DUMP_TRIGGERED + * =3D Dump was triggered by the previous system boot (PAPR says) + * =3D Next boot will be a fadump boot (Assumed) + * + * FADUMP_STATUS_DUMP_PERFORMED + * =3D Dump performed (Set to 0 by caller of the + * ibm,configure-kernel-dump call) (PAPR says) + * =3D Firmware has performed the copying/dump of requested regio= ns + * (Assumed) + * =3D Dump is active for the next boot (Assumed) + */ + header->dump_status_flag =3D cpu_to_be16( + FADUMP_STATUS_DUMP_TRIGGERED | /* Next boot will be fadump bo= ot */ + FADUMP_STATUS_DUMP_PERFORMED /* Dump is active */ + ); + + /* Reset fadump_registered for next boot */ + spapr->fadump_registered =3D false; + spapr->fadump_dump_active =3D true; + + /* + * Then do a guest reset + * + * Requirement: + * GUEST_RESET is expected to NOT clear the memory, as is the case when + * this is merged + */ + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET); + + rtas_st(spapr_retcode, 0, RTAS_OUT_SUCCESS); +} diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c index 6042fc72e57a..1f78fe406e75 100644 --- a/hw/ppc/spapr_rtas.c +++ b/hw/ppc/spapr_rtas.c @@ -420,6 +420,11 @@ static void rtas_ibm_os_term(PowerPCCPU *cpu, target_ulong msgaddr =3D rtas_ld(args, 0); char msg[512]; =20 + if (spapr->fadump_registered) { + /* If fadump boot works, control won't come back here */ + return trigger_fadump_boot(spapr, rets); + } + cpu_physical_memory_read(msgaddr, msg, sizeof(msg) - 1); msg[sizeof(msg) - 1] =3D 0; =20 diff --git a/include/hw/ppc/spapr_fadump.h b/include/hw/ppc/spapr_fadump.h index f64f33920496..1cb90c9d63af 100644 --- a/include/hw/ppc/spapr_fadump.h +++ b/include/hw/ppc/spapr_fadump.h @@ -16,6 +16,11 @@ =20 #define FADUMP_VERSION 1 =20 +/* Dump status flags */ +#define FADUMP_STATUS_DUMP_PERFORMED 0x8000 +#define FADUMP_STATUS_DUMP_TRIGGERED 0x4000 +#define FADUMP_STATUS_DUMP_ERROR 0x2000 + /* * The Firmware Assisted Dump Memory structure supports a maximum of 10 se= ctions * in the dump memory structure. Presently, three sections are used for @@ -66,4 +71,5 @@ struct FadumpMemStruct { }; =20 uint32_t do_fadump_register(struct SpaprMachineState *, target_ulong); +void trigger_fadump_boot(struct SpaprMachineState *, target_ulong); #endif /* PPC_SPAPR_FADUMP_H */ --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054585; cv=none; d=zohomail.com; s=zohoarc; b=WuSHE1mvQHlLNMWeHtLmT1vzEX/3ZXKWJb/+l/rW6KhFUfxIPOVXbTRYkzQhJygf/OKGZVwz5Vajximb5A1f6rOV7n5UvMqN3OY3571p7twIvlEgZiIyrTyZ3OgVpcU4dI8ncvxyA5O08OOZQDKeJ8KZ7A/pvlgOg10YegK82Xg= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054585; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=4CVTimBBaBqsGSURgKktDBElqVg43MfPsBJFfYgm48U=; b=dahNBBUh9ZlhMT0Q7J2kBkM2FWuLxiLP/OBmuWtS9nLWFBzm3LEHbNktpynwe83WXnJ9QXxsAz4QY26OmTvMbHq0nis5YcWoVGK6/hRLOw9nneydXZeAcOC5V7+on5vZhmqnS7A7PVx5M00tMluAzDzqVgW7BePRBUQm74L7pmM= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 176105458537717.51554344495173; Tue, 21 Oct 2025 06:49:45 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjP-000261-O5; Tue, 21 Oct 2025 09:48:55 -0400 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 1vBCjM-00024V-6P; Tue, 21 Oct 2025 09:48:52 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjJ-0006pG-Os; Tue, 21 Oct 2025 09:48:51 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59LDAUf6030017; Tue, 21 Oct 2025 13:48:46 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31ryaqn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:46 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDmNDm020547; Tue, 21 Oct 2025 13:48:46 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31ryaqj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:46 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LBT3ot017061; Tue, 21 Oct 2025 13:48:45 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vnkxu40f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:44 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmfe959048330 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:41 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id F21DC2005A; Tue, 21 Oct 2025 13:48:40 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 7C0FC20043; Tue, 21 Oct 2025 13:48:37 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:37 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=4CVTimBBaBqsGSURg KktDBElqVg43MfPsBJFfYgm48U=; b=eNTZR0ocEewOvX/OnRLRbISNbiJOFsL0K MttqSD1rcdBJ9WNqxLUuAqKS63zEVuihwT8DkZA+9ecghTrWoyfsq20fJ9Q2G5Rk Si4m8+cZAZ8JavuOwKLIValINPRstgf025BnlpHKv/5cwafVgJfX+EIqg0nxiqeA 56PNwIuQUbCHr4TyLY3cQURF4e8DjgoCptsEbS9tXU7cxfY3wAEnqpzDLDUU0+8y BXyoOi5tr6H1ih8Tyegt6jS0xh51aQlNLb04p4sNEFsQEZveAVwUNW71AifmgzlD uz1Zp9VEeXbSnRzGz8YVGuYgkIJW6d9nAC3v0nuzn9YPWbAKZD5Eg== From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 3/8] hw/ppc: Preserve memory regions registered for fadump Date: Tue, 21 Oct 2025 19:18:13 +0530 Message-ID: <20251021134823.1861675-4-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: 38jkobtTD5uhBNpqDzwiXMswiGShddmn X-Proofpoint-GUID: k3xT39QGumsX_8ovAooArjx2oBcKXVbG X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfXwoQ5zP/ALTIi Wv+oQ+I1xlWl0O9b0T4kwFdxjcKKHkJtUMfaXZbSZ3Ad7PQihofAUlXPtJ1QS2de428SDNLczJn RCNy8fO0pLOY26LhGjRFSzFH/1fISFpY9wzpsNpWWG5KbtKTbAQ8qgjUBfdRc+XGuwAmb73HKDC AmweE7+GuhOENg37ZB9x/Z1/H2HujCtwPKjsskwoiQSe7CyO0xrPb/IVudz7utaop7fclAP+n8g BpE0lbuRHS/NPa9x+BIn4HyATmDn0IOfmFn4unyKgJVxCJimqKKLndP5ITAeiG+QbUbOAZi84lB oSG5vLuH1+84PSnbBd7PCU+sJyQzVKAougPvGP9mky6MluxXZopX979CrdIRzQzMT9jT1fxrJP7 n5p6LD0iQh40Zdrw44cZRdjO9gAaog== X-Authority-Analysis: v=2.4 cv=IJYPywvG c=1 sm=1 tr=0 ts=68f78f3e cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=JVVl7mHoP3cRMiMHHAMA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.156.1; envelope-from=adityag@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054588326154100 Content-Type: text/plain; charset="utf-8" While the first kernel boots, it registers memory regions for fadump such as: * CPU state data (has to be populated by the platform) * HPTE state data (has to be populated by the platform) * Real Mode Regions (platform should copy it to requested destination addresses) * OS defined regions (such as parameter save area) Platform is also expected to modify the 'bytes_dumped' to the length of data preserved/copied by platform (ideally same as the source length passed by kernel). The kernel passes source address and length for the memory regions, and a destination address to where the memory is to be copied. Implement the preserving/copying of the Real Mode Regions and the Parameter Save Area in QEMU Pseries The regions are copied in chunks instead of copying all at once. Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/spapr_fadump.c | 183 +++++++++++++++++++++++++++++++++- include/hw/ppc/spapr_fadump.h | 18 ++++ 2 files changed, 196 insertions(+), 5 deletions(-) diff --git a/hw/ppc/spapr_fadump.c b/hw/ppc/spapr_fadump.c index 53e5c12c7641..5068a9d83dce 100644 --- a/hw/ppc/spapr_fadump.c +++ b/hw/ppc/spapr_fadump.c @@ -7,7 +7,9 @@ #include "qemu/osdep.h" #include "qemu/log.h" #include "hw/ppc/spapr.h" +#include "qemu/units.h" #include "system/cpus.h" +#include =20 /* * Handle the "FADUMP_CMD_REGISTER" command in 'ibm,configure-kernel-dump' @@ -123,14 +125,185 @@ uint32_t do_fadump_register(SpaprMachineState *spapr= , target_ulong args) return RTAS_OUT_SUCCESS; } =20 +/* + * Copy the source region of given fadump section, to the destination + * address mentioned in the region + * + * Also set the region's error flag, if the copy fails due to non-existent + * address (MEMTX_DECODE_ERROR) or permission issues (MEMTX_ACCESS_ERROR) + * + * Returns true if successful copy + * + * Returns false in case of any other error, being treated as hardware + * error for fadump purposes + */ +static bool do_preserve_region(FadumpSection *region) +{ + AddressSpace *default_as =3D &address_space_memory; + MemTxResult io_result; + MemTxAttrs attrs; + uint64_t src_addr, src_len, dest_addr; + uint64_t num_chunks; + g_autofree void *copy_buffer =3D NULL; + + src_addr =3D be64_to_cpu(region->source_address); + src_len =3D be64_to_cpu(region->source_len); + dest_addr =3D be64_to_cpu(region->destination_address); + + /* Mark the memory transaction as privileged memory access */ + attrs.user =3D 0; + attrs.memory =3D 1; + + /* + * Optimisation: Skip copy if source and destination are same + * (eg. param area) + */ + if (src_addr =3D=3D dest_addr) { + region->bytes_dumped =3D cpu_to_be64(src_len); + return true; + } + +#define FADUMP_CHUNK_SIZE ((size_t)(32 * MiB)) + copy_buffer =3D g_try_malloc(FADUMP_CHUNK_SIZE); + if (copy_buffer =3D=3D NULL) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed allocating memory (size: %zu) for copying" + " reserved memory regions\n", FADUMP_CHUNK_SIZE); + } + + num_chunks =3D ceil((src_len * 1.0f) / FADUMP_CHUNK_SIZE); + for (uint64_t chunk_id =3D 0; chunk_id < num_chunks; ++chunk_id) { + /* Take minimum of bytes left to copy, and chunk size */ + uint64_t copy_len =3D MIN( + src_len - (chunk_id * FADUMP_CHUNK_SIZE), + FADUMP_CHUNK_SIZE + ); + + /* Copy the source region to destination */ + io_result =3D address_space_read(default_as, src_addr, attrs, + copy_buffer, copy_len); + if ((io_result & MEMTX_DECODE_ERROR) || + (io_result & MEMTX_ACCESS_ERROR)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to decode/access address in section: %d\n", + region->source_data_type); + + /* + * Invalid source address is not an hardware error, instead + * wrong parameter from the kernel. + * Return true to let caller know to continue reading other + * sections + */ + region->error_flags =3D FADUMP_ERROR_INVALID_SOURCE_ADDR; + region->bytes_dumped =3D 0; + return true; + } else if (io_result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to read source region in section: %d\n", + region->source_data_type); + + return false; + } + + io_result =3D address_space_write(default_as, dest_addr, attrs, + copy_buffer, copy_len); + if ((io_result & MEMTX_DECODE_ERROR) || + (io_result & MEMTX_ACCESS_ERROR)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to decode/access address in section: %d\n", + region->source_data_type); + + /* + * Invalid destination address is not an hardware error, + * instead wrong parameter from the kernel. + * Return true to let caller know to continue reading other + * sections + */ + region->error_flags =3D FADUMP_ERROR_INVALID_DEST_ADDR; + region->bytes_dumped =3D 0; + return true; + } else if (io_result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to write destination in section: %d\n", + region->source_data_type); + + return false; + } + + src_addr +=3D FADUMP_CHUNK_SIZE; + dest_addr +=3D FADUMP_CHUNK_SIZE; + } +#undef FADUMP_CHUNK_SIZE + + /* + * Considering address_space_write would have copied the + * complete region + */ + region->bytes_dumped =3D cpu_to_be64(src_len); + return true; +} + /* Preserve the memory locations registered for fadump */ -static bool fadump_preserve_mem(void) +static bool fadump_preserve_mem(SpaprMachineState *spapr) { + FadumpMemStruct *fdm =3D &spapr->registered_fdm; + uint16_t dump_num_sections, data_type; + + assert(spapr->fadump_registered); + /* - * TODO: Implement preserving memory regions requested during fadump - * registration + * Handle all sections + * + * CPU State Data and HPTE regions are handled in their own cases + * + * RMR regions and any custom OS reserved regions such as parameter + * save area, are handled by simply copying the source region to + * destination address */ - return false; + dump_num_sections =3D be16_to_cpu(fdm->header.dump_num_sections); + for (int i =3D 0; i < dump_num_sections; ++i) { + data_type =3D be16_to_cpu(fdm->rgn[i].source_data_type); + + /* Reset error_flags & bytes_dumped for now */ + fdm->rgn[i].error_flags =3D 0; + fdm->rgn[i].bytes_dumped =3D 0; + + /* If kernel did not request for the memory region, then skip it */ + if (be32_to_cpu(fdm->rgn[i].request_flag) !=3D FADUMP_REQUEST_FLAG= ) { + qemu_log_mask(LOG_UNIMP, + "FADump: Skipping copying region as not requested\n"); + continue; + } + + switch (data_type) { + case FADUMP_CPU_STATE_DATA: + /* TODO: Add CPU state data */ + break; + case FADUMP_HPTE_REGION: + /* TODO: Add hpte state data */ + break; + case FADUMP_REAL_MODE_REGION: + case FADUMP_PARAM_AREA: + /* Copy the memory region from region's source to its destinat= ion */ + if (!do_preserve_region(&fdm->rgn[i])) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to preserve dump section: %d\n", + be16_to_cpu(fdm->rgn[i].source_data_type)); + fdm->header.dump_status_flag |=3D + cpu_to_be16(FADUMP_STATUS_DUMP_ERROR); + } + + break; + default: + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Skipping unknown source data type: %d\n", data_ty= pe); + + fdm->rgn[i].error_flags =3D + cpu_to_be16(FADUMP_ERROR_INVALID_DATA_TYPE); + } + } + + return true; } =20 /* @@ -151,7 +324,7 @@ void trigger_fadump_boot(SpaprMachineState *spapr, targ= et_ulong spapr_retcode) pause_all_vcpus(); =20 /* Preserve the memory locations registered for fadump */ - if (!fadump_preserve_mem()) { + if (!fadump_preserve_mem(spapr)) { /* Failed to preserve the registered memory regions */ rtas_st(spapr_retcode, 0, RTAS_OUT_HW_ERROR); =20 diff --git a/include/hw/ppc/spapr_fadump.h b/include/hw/ppc/spapr_fadump.h index 1cb90c9d63af..71be2ad92c11 100644 --- a/include/hw/ppc/spapr_fadump.h +++ b/include/hw/ppc/spapr_fadump.h @@ -16,11 +16,29 @@ =20 #define FADUMP_VERSION 1 =20 +/* Firmware provided dump sections */ +#define FADUMP_CPU_STATE_DATA 0x0001 +#define FADUMP_HPTE_REGION 0x0002 +#define FADUMP_REAL_MODE_REGION 0x0011 + +/* OS defined sections */ +#define FADUMP_PARAM_AREA 0x0100 + +/* Dump request flag */ +#define FADUMP_REQUEST_FLAG 0x00000001 + /* Dump status flags */ #define FADUMP_STATUS_DUMP_PERFORMED 0x8000 #define FADUMP_STATUS_DUMP_TRIGGERED 0x4000 #define FADUMP_STATUS_DUMP_ERROR 0x2000 =20 +/* Region dump error flags */ +#define FADUMP_ERROR_INVALID_DATA_TYPE 0x8000 +#define FADUMP_ERROR_INVALID_SOURCE_ADDR 0x4000 +#define FADUMP_ERROR_LENGTH_EXCEEDS_SOURCE 0x2000 +#define FADUMP_ERROR_INVALID_DEST_ADDR 0x1000 +#define FAUDMP_ERROR_DEST_TOO_SMALL 0x0800 + /* * The Firmware Assisted Dump Memory structure supports a maximum of 10 se= ctions * in the dump memory structure. Presently, three sections are used for --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054668; cv=none; d=zohomail.com; s=zohoarc; b=IxpY0AdJIpppOcn7bS4+omks/+ldpJFDzCGF5GQj0YvZXXQlNGX+5f6AMR1enVYEqTopT6jO3Tcj7cQ9+wWfFvoCZJ+yAxYIYqEdZKe+W49if6Pr9rJ0mky94D/x5ydIFHA8eymJYfSJm0kpS3cKle7Xnkw0AeiEWhGcToV44fk= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054668; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=TsQ3or4VCpWuLR9utlf3eMvSd24hxFn5R9yAm0bdx7Y=; b=S2z1bxHdoi26uwTNOvZ2PM4aw+Lzr0z1y6DJuosptE+4mfDfBFnW4O+xsOEb7ZwCuytdsLWplwJjfKbHkdTuwiVQX9iVqnSmGhDWchBUpNo33G5qpFQYC+CNj33oTKN90z+nviFu+WQVTyG55jbb4ShSr29H3oNqmNPPpnhBjnA= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054668442139.65488413791206; Tue, 21 Oct 2025 06:51:08 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjR-00026m-6X; Tue, 21 Oct 2025 09:48:57 -0400 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 1vBCjO-00025c-MY; Tue, 21 Oct 2025 09:48:54 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjL-0006pM-UU; Tue, 21 Oct 2025 09:48:54 -0400 Received: from pps.filterd (m0353725.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L97aZS010767; Tue, 21 Oct 2025 13:48:50 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v32hdwuk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:49 +0000 (GMT) Received: from m0353725.ppops.net (m0353725.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDi7NU013217; Tue, 21 Oct 2025 13:48:49 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v32hdwuf-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:49 +0000 (GMT) Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LBUDEa017072; Tue, 21 Oct 2025 13:48:48 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 49vnkxu40n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:48 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmi3o25624844 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:44 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id BE4D72004E; Tue, 21 Oct 2025 13:48:44 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 615312004B; Tue, 21 Oct 2025 13:48:41 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:41 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=TsQ3or4VCpWuLR9ut lf3eMvSd24hxFn5R9yAm0bdx7Y=; b=BOH6s3JsDCxtkaJgfRAVMrQVFr+aTcTWE ZGELprND2R5LMpAA2MMsDZIeM8fdORZ9QhoZGNNbTzyyvrGjugkNaCgpeAMMHLoz WOVMoMNHK0zwTNHjaXg2Eh/b/iyNKU3ftG8B2MDS1EZM0S9VQahh8pNXKFPgpdzA IyEYvG8YjClP/rJvKDsCCOeku3t0Apu8rHAebTPrXJ3bMWKftF8BmecTBCTniU3s 1GdNT8c1vxKZ6dVpIKHJ+1doVbeRNL6IyYtBCcF3UwzNeTD28sKb9/wwZr54+tpW ukS7L13k4u9p5XgWBegaXjNOFYr2pVULROUvUP/6cF85qWKgmoLdw== From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 4/8] hw/ppc: Implement saving CPU state in Fadump Date: Tue, 21 Oct 2025 19:18:14 +0530 Message-ID: <20251021134823.1861675-5-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX1wAAKrpR2hI9 LTXPMwXeOhAu5pyG/bFSSzV+auaEfxfMAzLGfK1UnOUd7SaSskZ2HZYYUvMoq/mlbSKyYEZkraU 9U9Qx71xXDAsmOjeXB6zwrTjEvNhJyMPrHAWUSEioWK349C+u9zfcygLOk/Eq68eAhItWtL2tJA cNoUn7qwWqX+y7AAkUHfwn1UsapFbPJJMmzE5QVuGq7OxXp789mb7W0lUNILf+3UmboPCTEpRFm LJMHg07knZlDp/YdEoNS3+98lM6FsWbL0UN2Spczn9C98zPiLer6vgUPlHSrboGRpML76tFo4xH MGnQ7RYeM7YLSSLx4WNycwl/Dpug9NZuilWaW5ex2fdysGJC1SeDwsRy0sCSLz36xxbZNKUClI3 hmFubbp88h6LQRIoGzw5bqFdWBMxow== X-Authority-Analysis: v=2.4 cv=OrVCCi/t c=1 sm=1 tr=0 ts=68f78f41 cx=c_pps a=5BHTudwdYE3Te8bg5FgnPg==:117 a=5BHTudwdYE3Te8bg5FgnPg==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=zxgWIWaIXYGjLxZ_zYYA:9 X-Proofpoint-GUID: gA2UEF6x9ewV1YyY9et2q_Z9ETJ7FEKL X-Proofpoint-ORIG-GUID: 43Q5tnRjxwseWPLqC3whPf9QfIS63lQ- X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 adultscore=0 priorityscore=1501 spamscore=0 phishscore=0 clxscore=1015 bulkscore=0 malwarescore=0 lowpriorityscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.158.5; envelope-from=adityag@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054670812154100 Content-Type: text/plain; charset="utf-8" Kernel expects CPU states/register states in the format mentioned in "Register Save Area" in PAPR. The platform (in our case, QEMU) saves each CPU register in the form of an array of "register entries", the start and end of this array is signified by "CPUSTRT" and "CPUEND" register entries respectively. The CPUSTRT and CPUEND register entry also has 4-byte logical CPU ID, thus storing the CPU ID corresponding to the array of register entries. Each register, and CPUSTRT, CPUEND has a predefined identifier. Implement calculating identifier for a given register in 'fadump_str_to_u64', which has been taken from the linux kernel Similarly GPRs also have predefined identifiers, and a corresponding 64-bit resiter value (split into two 32-bit cells). Implement calculation of GPR identifiers with 'fadump_gpr_id_to_u64' PAPR has restrictions on particular order of few registers, and is free to be in any order for other registers. Some registers mentioned in PAPR have not been exported as they are not implemented in QEMU / don't make sense in QEMU. Implement saving of CPU state according to the PAPR document Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/spapr_fadump.c | 361 +++++++++++++++++++++++++++++++++- include/hw/ppc/spapr_fadump.h | 31 +++ 2 files changed, 390 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr_fadump.c b/hw/ppc/spapr_fadump.c index 5068a9d83dce..fdd49291483e 100644 --- a/hw/ppc/spapr_fadump.c +++ b/hw/ppc/spapr_fadump.c @@ -9,8 +9,73 @@ #include "hw/ppc/spapr.h" #include "qemu/units.h" #include "system/cpus.h" +#include "system/hw_accel.h" #include =20 +/* + * Copy the ascii values for first 8 characters from a string into u64 + * variable at their respective indexes. + * e.g. + * The string "FADMPINF" will be converted into 0x4641444d50494e46 + */ +static uint64_t fadump_str_to_u64(const char *str) +{ + uint64_t val =3D 0; + int i; + + for (i =3D 0; i < sizeof(val); i++) { + val =3D (*str) ? (val << 8) | *str++ : val << 8; + } + return val; +} + +/** + * Get the identifier id for register entries of GPRs + * + * It gives the same id as 'fadump_str_to_u64' when the complete string id + * of the GPR is given, ie. + * + * fadump_str_to_u64("GPR05") =3D=3D fadump_gpr_id_to_u64(5); + * fadump_str_to_u64("GPR12") =3D=3D fadump_gpr_id_to_u64(12); + * + * And so on. Hence this can be implemented by creating a dynamic + * string for each GPR, such as "GPR00", "GPR01", ... "GPR31" + * Instead of allocating a string, an observation from the math of + * 'fadump_str_to_u64' or from PAPR tells us that there's a pattern + * in the identifier IDs, such that the first 4 bytes are affected only by + * whether it is GPR0*, GPR1*, GPR2*, GPR3*. + * Upper half of 5th byte is always 0x3. Lower half (nibble) of 5th byte + * is the tens digit of the GPR id, ie. GPR ID / 10. + * Upper half of 6th byte is always 0x3. Lower half (nibble) of 5th byte + * is the ones digit of the GPR id, ie. GPR ID % 10 + * + * For example, for GPR 29, the 5th and 6th byte will be 0x32 and 0x39 + */ +static uint64_t fadump_gpr_id_to_u64(uint32_t gpr_id) +{ + uint64_t val =3D 0; + + /* Valid range of GPR id is only GPR0 to GPR31 */ + assert(gpr_id < 32); + + /* Below calculations set the 0th to 5th byte */ + if (gpr_id <=3D 9) { + val =3D fadump_str_to_u64("GPR0"); + } else if (gpr_id <=3D 19) { + val =3D fadump_str_to_u64("GPR1"); + } else if (gpr_id <=3D 29) { + val =3D fadump_str_to_u64("GPR2"); + } else { + val =3D fadump_str_to_u64("GPR3"); + } + + /* Set the 6th byte */ + val |=3D 0x30000000; + val |=3D ((gpr_id % 10) << 24); + + return val; +} + /* * Handle the "FADUMP_CMD_REGISTER" command in 'ibm,configure-kernel-dump' * @@ -243,7 +308,291 @@ static bool do_preserve_region(FadumpSection *region) return true; } =20 -/* Preserve the memory locations registered for fadump */ +/* + * Populate the passed CPUs register entries, in the buffer starting at + * the argument 'curr_reg_entry' + * + * The register entries is an array of pair of register id and register + * value, as described in Table 591/592 in section "H.1 Register Save Area" + * in PAPR v2.13 + * + * Returns pointer just past this CPU's register entries, which can be used + * as the start address for next CPU's register entries + */ +static FadumpRegEntry *populate_cpu_reg_entries(CPUState *cpu, + FadumpRegEntry *curr_reg_entry) +{ + CPUPPCState *env; + PowerPCCPU *ppc_cpu; + uint32_t num_regs_per_cpu =3D 0; + + ppc_cpu =3D POWERPC_CPU(cpu); + env =3D cpu_env(cpu); + num_regs_per_cpu =3D 0; + + /* + * CPUSTRT and CPUEND register entries follow this format: + * + * 8 Bytes Reg ID (BE) | 4 Bytes (0x0) | 4 Bytes Logical CPU ID (BE) + */ + curr_reg_entry->reg_id =3D + cpu_to_be64(fadump_str_to_u64("CPUSTRT")); + curr_reg_entry->reg_value =3D cpu_to_be64( + ppc_cpu->vcpu_id & FADUMP_CPU_ID_MASK); + ++curr_reg_entry; + +#define REG_ENTRY(id, val) \ + do { \ + curr_reg_entry->reg_id =3D \ + cpu_to_be64(fadump_str_to_u64(#id)); \ + curr_reg_entry->reg_value =3D cpu_to_be64(val); \ + ++curr_reg_entry; \ + ++num_regs_per_cpu; \ + } while (0) + + REG_ENTRY(ACOP, env->spr[SPR_ACOP]); + REG_ENTRY(AMR, env->spr[SPR_AMR]); + REG_ENTRY(BESCR, env->spr[SPR_BESCR]); + REG_ENTRY(CFAR, env->spr[SPR_CFAR]); + REG_ENTRY(CIABR, env->spr[SPR_CIABR]); + + /* Save the condition register */ + REG_ENTRY(CR, ppc_get_cr(env)); + + REG_ENTRY(CTR, env->spr[SPR_CTR]); + REG_ENTRY(CTRL, env->spr[SPR_CTRL]); + REG_ENTRY(DABR, env->spr[SPR_DABR]); + REG_ENTRY(DABRX, env->spr[SPR_DABRX]); + REG_ENTRY(DAR, env->spr[SPR_DAR]); + REG_ENTRY(DAWR0, env->spr[SPR_DAWR0]); + REG_ENTRY(DAWR1, env->spr[SPR_DAWR1]); + REG_ENTRY(DAWRX0, env->spr[SPR_DAWRX0]); + REG_ENTRY(DAWRX1, env->spr[SPR_DAWRX1]); + REG_ENTRY(DPDES, env->spr[SPR_DPDES]); + REG_ENTRY(DSCR, env->spr[SPR_DSCR]); + REG_ENTRY(DSISR, env->spr[SPR_DSISR]); + REG_ENTRY(EBBHR, env->spr[SPR_EBBHR]); + REG_ENTRY(EBBRR, env->spr[SPR_EBBRR]); + + REG_ENTRY(FPSCR, env->fpscr); + REG_ENTRY(FSCR, env->spr[SPR_FSCR]); + + /* Save the GPRs */ + for (int gpr_id =3D 0; gpr_id < 32; ++gpr_id) { + curr_reg_entry->reg_id =3D + cpu_to_be64(fadump_gpr_id_to_u64(gpr_id)); + curr_reg_entry->reg_value =3D + cpu_to_be64(env->gpr[gpr_id]); + ++curr_reg_entry; + ++num_regs_per_cpu; + } + + REG_ENTRY(IAMR, env->spr[SPR_IAMR]); + REG_ENTRY(IC, env->spr[SPR_IC]); + REG_ENTRY(LR, env->spr[SPR_LR]); + + REG_ENTRY(MSR, env->msr); + REG_ENTRY(NIA, env->nip); /* NIA */ + REG_ENTRY(PIR, env->spr[SPR_PIR]); + REG_ENTRY(PSPB, env->spr[SPR_PSPB]); + REG_ENTRY(PVR, env->spr[SPR_PVR]); + REG_ENTRY(RPR, env->spr[SPR_RPR]); + REG_ENTRY(SPURR, env->spr[SPR_SPURR]); + REG_ENTRY(SRR0, env->spr[SPR_SRR0]); + REG_ENTRY(SRR1, env->spr[SPR_SRR1]); + REG_ENTRY(TAR, env->spr[SPR_TAR]); + REG_ENTRY(TEXASR, env->spr[SPR_TEXASR]); + REG_ENTRY(TFHAR, env->spr[SPR_TFHAR]); + REG_ENTRY(TFIAR, env->spr[SPR_TFIAR]); + REG_ENTRY(TIR, env->spr[SPR_TIR]); + REG_ENTRY(UAMOR, env->spr[SPR_UAMOR]); + REG_ENTRY(VRSAVE, env->spr[SPR_VRSAVE]); + REG_ENTRY(VSCR, env->vscr); + REG_ENTRY(VTB, env->spr[SPR_VTB]); + REG_ENTRY(WORT, env->spr[SPR_WORT]); + REG_ENTRY(XER, env->spr[SPR_XER]); + + /* + * Ignoring transaction checkpoint and few other registers + * mentioned in PAPR as not supported in QEMU + */ +#undef REG_ENTRY + + /* End the registers for this CPU with "CPUEND" reg entry */ + curr_reg_entry->reg_id =3D + cpu_to_be64(fadump_str_to_u64("CPUEND")); + curr_reg_entry->reg_value =3D cpu_to_be64( + ppc_cpu->vcpu_id & FADUMP_CPU_ID_MASK); + + /* + * Ensure number of register entries saved matches the expected + * 'FADUMP_PER_CPU_REG_ENTRIES' count + * + * This will help catch an error if in future a new register entry + * is added/removed while not modifying FADUMP_PER_CPU_REG_ENTRIES + */ + assert(FADUMP_PER_CPU_REG_ENTRIES =3D=3D num_regs_per_cpu + 2 /*CPUSTR= T+CPUEND*/); + + ++curr_reg_entry; + + return curr_reg_entry; +} + +/* + * Populate the "Register Save Area"/CPU State as mentioned in section "H.1 + * Register Save Area" in PAPR v2.13 + * + * It allocates the buffer for this region, then populates the register + * entries + * + * Returns the pointer to the buffer (which should be deallocated by the + * callers), and sets the size of this buffer in the argument + * 'cpu_state_len' + */ +static void *get_cpu_state_data(uint64_t *cpu_state_len) +{ + FadumpRegSaveAreaHeader reg_save_hdr; + FadumpRegEntry *reg_entries; + FadumpRegEntry *curr_reg_entry; + CPUState *cpu; + + uint32_t num_reg_entries; + uint32_t reg_entries_size; + uint32_t num_cpus =3D 0; + + void *cpu_state_buffer =3D NULL; + uint64_t offset =3D 0; + + CPU_FOREACH(cpu) { + ++num_cpus; + } + + reg_save_hdr.version =3D cpu_to_be32(0); + reg_save_hdr.magic_number =3D + cpu_to_be64(fadump_str_to_u64("REGSAVE")); + + /* Reg save area header is immediately followed by num cpus */ + reg_save_hdr.num_cpu_offset =3D + cpu_to_be32(sizeof(FadumpRegSaveAreaHeader)); + + num_reg_entries =3D num_cpus * FADUMP_PER_CPU_REG_ENTRIES; + reg_entries_size =3D num_reg_entries * sizeof(FadumpRegEntry); + + reg_entries =3D g_new(FadumpRegEntry, num_reg_entries); + + /* Pointer to current CPU's registers */ + curr_reg_entry =3D reg_entries; + + /* Populate register entries for all CPUs */ + CPU_FOREACH(cpu) { + cpu_synchronize_state(cpu); + curr_reg_entry =3D populate_cpu_reg_entries(cpu, curr_reg_entry); + } + + *cpu_state_len =3D 0; + *cpu_state_len +=3D sizeof(reg_save_hdr); /* reg save header */ + *cpu_state_len +=3D 0xc; /* padding as in PAPR */ + *cpu_state_len +=3D sizeof(__be32); /* num_cpus */ + *cpu_state_len +=3D reg_entries_size; /* reg entries */ + + cpu_state_buffer =3D g_malloc(*cpu_state_len); + + memcpy(cpu_state_buffer + offset, + ®_save_hdr, sizeof(reg_save_hdr)); + offset +=3D sizeof(reg_save_hdr); + + /* Write num_cpus */ + num_cpus =3D cpu_to_be32(num_cpus); + memcpy(cpu_state_buffer + offset, &num_cpus, sizeof(__be32)); + offset +=3D sizeof(__be32); + + /* Write the register entries */ + memcpy(cpu_state_buffer + offset, reg_entries, reg_entries_size); + offset +=3D reg_entries_size; + + return cpu_state_buffer; +} + +/* + * Save the CPU State Data (aka "Register Save Area") in given region + * + * Region argument is expected to be of CPU_STATE_DATA type + * + * Returns false only in case of Hardware Error, such as failure to + * read/write a valid address. + * + * Otherwise, even in case of unsuccessful copy of CPU state data for reas= ons + * such as invalid destination address or non-fatal error errors likely + * caused due to invalid parameters, return true and set region->error_fla= gs + */ +static bool do_populate_cpu_state(FadumpSection *region) +{ + uint64_t dest_addr =3D be64_to_cpu(region->destination_address); + uint64_t cpu_state_len =3D 0; + g_autofree void *cpu_state_buffer =3D NULL; + AddressSpace *default_as =3D &address_space_memory; + MemTxResult io_result; + MemTxAttrs attrs; + + assert(region->source_data_type =3D=3D cpu_to_be16(FADUMP_CPU_STATE_DA= TA)); + + /* Mark the memory transaction as privileged memory access */ + attrs.user =3D 0; + attrs.memory =3D 1; + + cpu_state_buffer =3D get_cpu_state_data(&cpu_state_len); + + io_result =3D address_space_write(default_as, dest_addr, attrs, + cpu_state_buffer, cpu_state_len); + if ((io_result & MEMTX_DECODE_ERROR) || + (io_result & MEMTX_ACCESS_ERROR)) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to decode/access address in CPU State Region's" + " destination address: 0x%016" PRIx64 "\n", dest_addr); + + /* + * Invalid source address is not an hardware error, instead + * wrong parameter from the kernel. + * Return true to let caller know to continue reading other + * sections + */ + region->error_flags =3D FADUMP_ERROR_INVALID_SOURCE_ADDR; + region->bytes_dumped =3D 0; + return true; + } else if (io_result !=3D MEMTX_OK) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to write CPU state region.\n"); + + return false; + } + + /* + * Set bytes_dumped in cpu state region, so kernel knows platform have + * exported it + */ + region->bytes_dumped =3D cpu_to_be64(cpu_state_len); + + if (region->source_len !=3D region->bytes_dumped) { + /* + * Log the error, but don't fail the dump collection here, let + * kernel handle the mismatch + */ + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Mismatch in CPU State region's length exported:" + " Kernel expected: 0x%" PRIx64 " bytes," + " QEMU exported: 0x%" PRIx64 " bytes\n", + be64_to_cpu(region->source_len), + be64_to_cpu(region->bytes_dumped)); + } + + return true; +} + +/* + * Preserve the memory locations registered for fadump + * + * Returns false only in case of RTAS_OUT_HW_ERROR, otherwise true + */ static bool fadump_preserve_mem(SpaprMachineState *spapr) { FadumpMemStruct *fdm =3D &spapr->registered_fdm; @@ -277,7 +626,15 @@ static bool fadump_preserve_mem(SpaprMachineState *spa= pr) =20 switch (data_type) { case FADUMP_CPU_STATE_DATA: - /* TODO: Add CPU state data */ + if (!do_populate_cpu_state(&fdm->rgn[i])) { + qemu_log_mask(LOG_GUEST_ERROR, + "FADump: Failed to store CPU State Data"); + fdm->header.dump_status_flag |=3D + cpu_to_be16(FADUMP_STATUS_DUMP_ERROR); + + return false; + } + break; case FADUMP_HPTE_REGION: /* TODO: Add hpte state data */ diff --git a/include/hw/ppc/spapr_fadump.h b/include/hw/ppc/spapr_fadump.h index 71be2ad92c11..fde2830e9411 100644 --- a/include/hw/ppc/spapr_fadump.h +++ b/include/hw/ppc/spapr_fadump.h @@ -47,9 +47,17 @@ */ #define FADUMP_MAX_SECTIONS 10 =20 +/* Number of register entries stored per cpu */ +#define FADUMP_PER_CPU_REG_ENTRIES (32 /*GPR*/ + 45 /*others*/ + 2 /*STRT = & END*/) + +/* Mask of CPU ID in CPUSTRT and CPUEND entries */ +#define FADUMP_CPU_ID_MASK ((1ULL << 32) - 1) + typedef struct FadumpSection FadumpSection; typedef struct FadumpSectionHeader FadumpSectionHeader; typedef struct FadumpMemStruct FadumpMemStruct; +typedef struct FadumpRegSaveAreaHeader FadumpRegSaveAreaHeader; +typedef struct FadumpRegEntry FadumpRegEntry; =20 struct SpaprMachineState; =20 @@ -88,6 +96,29 @@ struct FadumpMemStruct { FadumpSection rgn[FADUMP_MAX_SECTIONS]; }; =20 +/* + * The firmware-assisted dump format. + * + * The register save area is an area in the partition's memory used to pre= serve + * the register contents (CPU state data) for the active CPUs during a fir= mware + * assisted dump. The dump format contains register save area header follo= wed + * by register entries. Each list of registers for a CPU starts with "CPUS= TRT" + * and ends with "CPUEND". + */ + +/* Register save area header. */ +struct FadumpRegSaveAreaHeader { + uint64_t magic_number; + uint32_t version; + uint32_t num_cpu_offset; +}; + +/* Register entry. */ +struct FadumpRegEntry { + uint64_t reg_id; + uint64_t reg_value; +}; + uint32_t do_fadump_register(struct SpaprMachineState *, target_ulong); void trigger_fadump_boot(struct SpaprMachineState *, target_ulong); #endif /* PPC_SPAPR_FADUMP_H */ --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054635; cv=none; d=zohomail.com; s=zohoarc; b=NR0GguZwBkUl7GCl7Pkn1vtjW51vzlqPFgBe6z7gJG52Lu8EvpaQcZJzGCqOTtYG1VpUfH3ZtTnHzs+9c9JuG+9f4ioJNbA7RM9sfHFH92OI6/ok3t/+2oMtTjptocIZyAhcYQeTb5yvvNYTXtVRLzyP3NluklQZRKyB5Dycd1k= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054635; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=ulOpTvTsBjLYGJDHUaXtWnx4/7REEYR7kCTY5v+4j2w=; b=l4meI7+wq4BGYoQWbzyZhPhft+eaXXz6c2FOaq9Jv9jhgnZdUVTOKtyRvIjyGQmhfwQ4H80mBBLiFupGKZgxNN2kciOMzA3qgrdqvym7/gXcXBpKLAErgY6WPDzDTpHhnP3/Q3QcNBSwEV9QPj+ndsP4ijxVfSJmI98f3rVZHIs= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054635648703.5360300896584; Tue, 21 Oct 2025 06:50:35 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjT-000299-T8; Tue, 21 Oct 2025 09:48:59 -0400 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 1vBCjR-00027d-TY; Tue, 21 Oct 2025 09:48:57 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjP-0006ph-OM; Tue, 21 Oct 2025 09:48:57 -0400 Received: from pps.filterd (m0356517.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L8ZNxQ030688; Tue, 21 Oct 2025 13:48:53 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31ryar0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:53 +0000 (GMT) Received: from m0356517.ppops.net (m0356517.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDmqFG022534; Tue, 21 Oct 2025 13:48:52 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v31ryaqx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:52 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LBOY9J014676; Tue, 21 Oct 2025 13:48:51 GMT Received: from smtprelay01.fra02v.mail.ibm.com ([9.218.2.227]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vn7s3767-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:51 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay01.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmmND51184048 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:48 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 0DE152004E; Tue, 21 Oct 2025 13:48:48 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2DB4320043; Tue, 21 Oct 2025 13:48:45 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:44 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=ulOpTvTsBjLYGJDHU aXtWnx4/7REEYR7kCTY5v+4j2w=; b=UbMqPucB4aGpQHm4REeWouFZvuG1tc4Eh IeqoqNTC5sfKNWHwCLbsS6/UOFGbXey0C6BE4ulcZ/4Idy4kzmii9TkQOy7/FlMJ RUxnuVtwb7u2gcyA+s4k1fM2Zbkiy4+tJPh0m7U/BwcFi5v2TM+Nb0Br4TTVWnk8 ClxlZEL/b3TMrBdBQyAjNxtFlYzTbdLkra/EptjDpHeHl18EOwPHlGwkEaulGr/0 ZF/O++vlbvMVi613pCwlD3KUtLV7LheSb2Tk24K5EegBwRNbO0nCzMbfFOsbfv1K ftbZ3W+bMnC0ebvZjWbtVxe3CP0uftAtYcKx9ZKDBhPi9tIjCtl8Q== From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 5/8] hw/ppc: Pass dump-sizes property for fadump in device tree Date: Tue, 21 Oct 2025 19:18:15 +0530 Message-ID: <20251021134823.1861675-6-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: cuKwMAZ758wLr7fxo6QlGiaICqGWcOWS X-Proofpoint-GUID: oh1zgMwsP4b8qFbZuH8kKTTnfqcg4KgC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX7hUvcvOfQ4P4 XT11pNa9ZfMDEYOoXQtnaDfygZtnYVAFjlstiB1leNMwWtCQFoY4SNg4Min1PrRgkVBk4fcEhwS vxc8FT51O4+8wkI3S0ZQUzJOYFc0EWP5CI8EQsbZVD/EpPKWtxmSf/PQXQYc4A+g7i4Nm1NyI1g eHX8FKyK+IJe3RrOK3bWMzzdVMeYNnCZ0oT2cpWnhE8HJzrGoi6qgo8xDmaRiPhN6pkmwVJQa6D 7SzVYz9snzQa+e7W9hLQA48brvEtBQyTK6D2IM2cQt0EX9bNIAaDKqUirjbfQPVXKXwplejklIN BW0TuDepp94bLKmX1psrqsDgayD81E4/2A8k5ZVcydxz71rajrqnswxo3SG1VVuv47UwDOZNBRW gEVizDYrLs0PSGYNsU236meSpNEmXw== X-Authority-Analysis: v=2.4 cv=IJYPywvG c=1 sm=1 tr=0 ts=68f78f45 cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=fff_gh8wo2OfEAVniKgA:9 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 lowpriorityscore=0 clxscore=1015 suspectscore=0 spamscore=0 bulkscore=0 adultscore=0 impostorscore=0 malwarescore=0 priorityscore=1501 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.156.1; envelope-from=adityag@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054639664158500 Content-Type: text/plain; charset="utf-8" Platform (ie. QEMU) is expected to pass few device tree properties for details for fadump: * "ibm,configure-kernel-dump-sizes": Space required to store dump data for firmware provided dump sections (ie. CPU & HPTE regions) * "ibm,configure-kernel-dump-version": Versions of fadump supported Pass the above device tree nodes so that kernel can reserve sufficient space for preserving the CPU state data Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/spapr.c | 57 +++++++++++++++++++++++++++++++++++++++++++ hw/ppc/spapr_fadump.c | 6 ++--- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index 97ab6bebd25c..d40d5a9dcde5 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -900,6 +900,61 @@ static int spapr_dt_rng(void *fdt) return ret ? -1 : 0; } =20 +static void spapr_dt_rtas_fadump(SpaprMachineState *spapr, void *fdt, int = rtas) +{ + MachineState *ms =3D MACHINE(spapr); + MachineClass *mc =3D MACHINE_GET_CLASS(ms); + + uint32_t max_possible_cpus =3D mc->possible_cpu_arch_ids(ms)->len; + uint64_t fadump_cpu_state_size =3D 0; + uint16_t fadump_versions[2] =3D { + FADUMP_VERSION /* min supported version */, + FADUMP_VERSION /* max supported version */ + }; + uint32_t fadump_rgn_sizes[2][3] =3D { + { + cpu_to_be32(FADUMP_CPU_STATE_DATA), + 0, 0 /* Calculated later */ + }, + { + cpu_to_be32(FADUMP_HPTE_REGION), + 0, 0 /* HPTE region not implemented */ + } + }; + + /* + * CPU State Data contains multiple fields such as header, num_cpus and + * register entries + * + * Calculate the maximum CPU State Data size, according to maximum + * possible CPUs the QEMU VM can have + * + * This calculation must match the 'cpu_state_len' calculation done in + * 'populate_cpu_state_data' in spapr_fadump.c + */ + fadump_cpu_state_size +=3D sizeof(struct FadumpRegSaveAreaHeader); + fadump_cpu_state_size +=3D 0xc; /* padding as in = PAPR */ + fadump_cpu_state_size +=3D sizeof(uint32_t); /* num_cpus */ + fadump_cpu_state_size +=3D max_possible_cpus * /* reg entries */ + FADUMP_PER_CPU_REG_ENTRIES * + sizeof(struct FadumpRegEntry); + + /* Set maximum size for CPU state data region */ + assert(fadump_rgn_sizes[0][0] =3D=3D cpu_to_be32(FADUMP_CPU_STATE_DATA= )); + + /* Upper 32 bits of size, usually 0 */ + fadump_rgn_sizes[0][1] =3D cpu_to_be32(fadump_cpu_state_size >> 32); + + /* Lower 32 bits of size */ + fadump_rgn_sizes[0][2] =3D cpu_to_be32(fadump_cpu_state_size & 0xfffff= fff); + + /* Add device tree properties required from platform for fadump */ + _FDT((fdt_setprop(fdt, rtas, "ibm,configure-kernel-dump-version", + fadump_versions, sizeof(fadump_versions)))); + _FDT((fdt_setprop(fdt, rtas, "ibm,configure-kernel-dump-sizes", + fadump_rgn_sizes, sizeof(fadump_rgn_sizes)))); +} + static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) { MachineState *ms =3D MACHINE(spapr); @@ -1015,6 +1070,8 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, v= oid *fdt) _FDT(fdt_setprop(fdt, rtas, "ibm,lrdr-capacity", lrdr_capacity, sizeof(lrdr_capacity))); =20 + spapr_dt_rtas_fadump(spapr, fdt, rtas); + spapr_dt_rtas_tokens(fdt, rtas); } =20 diff --git a/hw/ppc/spapr_fadump.c b/hw/ppc/spapr_fadump.c index fdd49291483e..fa3aeac94cb7 100644 --- a/hw/ppc/spapr_fadump.c +++ b/hw/ppc/spapr_fadump.c @@ -492,7 +492,7 @@ static void *get_cpu_state_data(uint64_t *cpu_state_len) *cpu_state_len =3D 0; *cpu_state_len +=3D sizeof(reg_save_hdr); /* reg save header */ *cpu_state_len +=3D 0xc; /* padding as in PAPR */ - *cpu_state_len +=3D sizeof(__be32); /* num_cpus */ + *cpu_state_len +=3D sizeof(num_cpus); /* num_cpus */ *cpu_state_len +=3D reg_entries_size; /* reg entries */ =20 cpu_state_buffer =3D g_malloc(*cpu_state_len); @@ -503,8 +503,8 @@ static void *get_cpu_state_data(uint64_t *cpu_state_len) =20 /* Write num_cpus */ num_cpus =3D cpu_to_be32(num_cpus); - memcpy(cpu_state_buffer + offset, &num_cpus, sizeof(__be32)); - offset +=3D sizeof(__be32); + memcpy(cpu_state_buffer + offset, &num_cpus, sizeof(num_cpus)); + offset +=3D sizeof(num_cpus); =20 /* Write the register entries */ memcpy(cpu_state_buffer + offset, reg_entries, reg_entries_size); --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054694; cv=none; d=zohomail.com; s=zohoarc; b=I6noISfZzT1V3HjQNpQUmooZtL4mfD75nAIXW26NeNp4qTt+LEOTnID/fFC9cBPBwVx/F5Jf5YLGgiLf2QiA+6O2OcERXK2kfqW8ggClB9K1fZG7+d9JieGMwuHpI/Y02sQIsLp4tnZipiDqVKmj0RVXNDVcKiuxIeuGFmbtYSY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054694; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=dvuOvQ/G4kRwIdzue65rg25T9o5h4YkXezeMhpf5fwk=; b=jm8RvglLhb042oujJbR19H2M6ZFwpktkqyzNL2wMsH7JlLLS8fZKi2jVeQ1bTj44oPa4R0Lg4/ekx0R90oZRz3WQvbqB6JGP8pJrMh2zKFvLiunOwhvYgeMkVhpKo2i2uWQRML0m/gAgyWoFf7yadZbrrEiyA7KUXWLEpryQtTM= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054694604631.172795515118; Tue, 21 Oct 2025 06:51:34 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjW-0002DI-Gz; Tue, 21 Oct 2025 09:49:02 -0400 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 1vBCjU-00029f-7a; Tue, 21 Oct 2025 09:49:00 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjS-0006pu-98; Tue, 21 Oct 2025 09:48:59 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L63tU3023364; Tue, 21 Oct 2025 13:48:56 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v30vnym0-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:56 +0000 (GMT) Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDi5XL004530; Tue, 21 Oct 2025 13:48:56 GMT Received: from ppma11.dal12v.mail.ibm.com (db.9e.1632.ip4.static.sl-reverse.com [50.22.158.219]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v30vnykw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:55 +0000 (GMT) Received: from pps.filterd (ppma11.dal12v.mail.ibm.com [127.0.0.1]) by ppma11.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LCvcow011075; Tue, 21 Oct 2025 13:48:55 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma11.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vqx12r10-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:55 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmp0813697534 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:51 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 517F72005A; Tue, 21 Oct 2025 13:48:51 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 5E5032004D; Tue, 21 Oct 2025 13:48:48 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:48 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=dvuOvQ/G4kRwIdzue 65rg25T9o5h4YkXezeMhpf5fwk=; b=dsrrL/YJLTw5A3efNEjIFTkg6Jr7NrxVR zc5pRDiVo6zUQrwF4ormr6k45DGgmVFHRjL6q2uuPQpNtoVn7pCDVsDZzEVUsMV4 JoMbNl+p4xc6goyO2P3yU33atA5Z0AojNGkllLwzKQfhX7X2YlILqFhXR1wPl1bi MZTvWvVJe7H68ifpmdJMCpNdaWbEpZOzEolm4oM8ivKejepfVKJSQEmks67WOwQK W3CwxYiXGldnthZEwkum0u9HNVHTl5blbdp5zbmTqkyOe9cxctXreUe8sb4jZbKz teT521M5SpKZSw52tmt9r6f6BgdEe/PKtkus4IGDybaJq/A/6IURQ== From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 6/8] hw/ppc: Enable fadump for PSeries Date: Tue, 21 Oct 2025 19:18:16 +0530 Message-ID: <20251021134823.1861675-7-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: XxUICkWswyErCRxZb8_DeyIiWN3xbuBx X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX+37sygYKK5i7 2Sipzr6u5qGEDdL9X2kqx/thdG0xFjgVV1DdqU6roAE1rbqAZzkGhyaFJ0GfXPo5cfuKc8T+mdF QwKdeBSy5l5WhyTbDNJdHgbI48mE8NoeQnDp2if8Z2wZnaJiTWoqA4ZkEXppZVMjN1PWDNJmflg ASQWMiumnU9Y2BRgf6PLdsj8jPqZz85w5SD/KkRbMADacSs6jtcGw6oo3xe0gZcuPjrKzZguiNV V4fue3SDoJ6yjOjP2f8S8cIjCIP8nDKtfyUFkK+vYbxopYj/ci9bKy/ejgrUfoTW/H1iIwyyMEd 9ZnRdNCQuRty3/7m4/8xRG1PBbmW6bIsszqotoEpc7YrMURomWxzsuf+rWdcJxOtUzOvaQQFtBc PXpxclpJ0pFKFXV0dqU3jmjJbYJlzw== X-Authority-Analysis: v=2.4 cv=MIJtWcZl c=1 sm=1 tr=0 ts=68f78f48 cx=c_pps a=aDMHemPKRhS1OARIsFnwRA==:117 a=aDMHemPKRhS1OARIsFnwRA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=8CxyIfRdMog4hT9rIj0A:9 X-Proofpoint-ORIG-GUID: YBBq9OfG_mDOoicZvVqVZ_SM0dKawCPu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 phishscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 impostorscore=0 bulkscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.158.5; envelope-from=adityag@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054697104154100 Content-Type: text/plain; charset="utf-8" With all support in place for preserving memory regions, enable fadump by exporting the "ibm,kernel-dump" property in the device tree, representing the fadump dump information, in case of a crash. Currently "ibm,configure-kernel-dump" RTAS call is already registered, which tells the kernel that the platform (QEMU) supports fadump. Now, in case of a crash, if fadump was registered, we also pass "ibm,kernel-dump" in device tree, which tells the kernel that the fadump dump is active. Pass "fadump=3Don" to enable Linux to use firmware assisted dump. Logs of a linux boot with firmware assisted dump: $ ./build/qemu-system-ppc64 -M pseries,x-vof=3Don --cpu power10 --smp 4= -m 4G -kernel some-vmlinux -initrd some-initrd -append "debug fadump=3Don = crashkernel=3D1G" -nographic [ 0.000000] fadump: Reserved 1024MB of memory at 0x00000040000000 (S= ystem RAM: 4096MB) [ 0.000000] fadump: Initialized 0x40000000 bytes cma area at 1024MB = from 0x400102a8 bytes of memory reserved for firmware-assisted dump ... [ 1.084686] rtas fadump: Registration is successful! ... # cat /sys/kernel/debug/powerpc/fadump_region CPU :[0x00000040000000-0x000000400013df] 0x13e0 bytes, Dumped: 0x0 HPTE:[0x000000400013e0-0x000000400013df] 0x0 bytes, Dumped: 0x0 DUMP: Src: 0x00000000000000, Dest: 0x00000040010000, Size: 0x40000000, = Dumped: 0x0 bytes [0x0000000921a000-0x0000000921a7ff]: cmdline append: '' # echo c > /proc/sysrq-trigger The fadump boot after crash: [ 0.000000] rtas fadump: Firmware-assisted dump is active. [ 0.000000] fadump: Updated cmdline: debug fadump=3Don crashkernel= =3D1G [ 0.000000] fadump: Firmware-assisted dump is active. [ 0.000000] fadump: Reserving 3072MB of memory at 0x00000040000000 f= or preserving crash data .... # file /proc/vmcore /proc/vmcore: ELF 64-bit LSB core file, 64-bit PowerPC or cisco 7500, O= penPOWER ELF V2 ABI, version 1 (SYSV), SVR4-style Analysing the vmcore with crash-utility: KERNEL: vmlinux-6.14-rc2 DUMPFILE: vmcore-fc92fb373aa0 CPUS: 4 DATE: Wed Mar 12 23:39:23 CDT 2025 UPTIME: 00:00:22 LOAD AVERAGE: 0.13, 0.03, 0.01 TASKS: 95 NODENAME: buildroot RELEASE: 6.12.0-rc4+ VERSION: #1 SMP Fri Jan 3 00:15:17 IST 2025 MACHINE: ppc64le (1000 Mhz) MEMORY: 4 GB PANIC: "Kernel panic - not syncing: sysrq triggered crash" PID: 269 COMMAND: "sh" TASK: c00000000a050b00 [THREAD_INFO: c00000000a050b00] CPU: 0 STATE: TASK_RUNNING (PANIC) Signed-off-by: Aditya Gupta Reviewed-by: Sourabh Jain Tested-by:Shivang Upadhyay --- hw/ppc/spapr.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c index d40d5a9dcde5..77da8c1b02f5 100644 --- a/hw/ppc/spapr.c +++ b/hw/ppc/spapr.c @@ -904,6 +904,8 @@ static void spapr_dt_rtas_fadump(SpaprMachineState *spa= pr, void *fdt, int rtas) { MachineState *ms =3D MACHINE(spapr); MachineClass *mc =3D MACHINE_GET_CLASS(ms); + FadumpMemStruct *fdm =3D &spapr->registered_fdm; + uint16_t dump_status_flag; =20 uint32_t max_possible_cpus =3D mc->possible_cpu_arch_ids(ms)->len; uint64_t fadump_cpu_state_size =3D 0; @@ -953,6 +955,16 @@ static void spapr_dt_rtas_fadump(SpaprMachineState *sp= apr, void *fdt, int rtas) fadump_versions, sizeof(fadump_versions)))); _FDT((fdt_setprop(fdt, rtas, "ibm,configure-kernel-dump-sizes", fadump_rgn_sizes, sizeof(fadump_rgn_sizes)))); + + dump_status_flag =3D be16_to_cpu(fdm->header.dump_status_flag); + if (dump_status_flag & FADUMP_STATUS_DUMP_TRIGGERED) { + uint64_t fdm_size =3D + sizeof(struct FadumpSectionHeader) + + (be16_to_cpu(fdm->header.dump_num_sections) * + sizeof(struct FadumpSection)); + + _FDT((fdt_setprop(fdt, rtas, "ibm,kernel-dump", fdm, fdm_size))); + } } =20 static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt) --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054686; cv=none; d=zohomail.com; s=zohoarc; b=QdCmi0Jve8VrqQVQVhT9p562c0CzaPFFt8S2kuUIGQ60rY61DvtnVCkPZEwriXnKQ8gQ41Hkt5Yms5EVHbbrA0ufcjzhgmzJBub2YJMODdapsSXGj/PTo0n4VCkBCz+jwPdut0E0J/4C9AXv5XtdSMCC8GR5xCD/5wqB7e9oz/I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054686; h=Content-Transfer-Encoding:Cc:Cc:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:Subject:To:To:Message-Id:Reply-To; bh=yz9ZkpUNAwEB9OjZoCbrPegu+3lYt5AKKmCiXg5eIJ4=; b=PiFU0mAY3Pr/fnTKeqdh1WHLEVmgVj8z6qXr5kH5FGgHJ90kQLh0yjNYvr0G15rZYIut/s+SWoH42mgq1Shl/mwprHUYBXTFJc04MXzoBw70gROBrFe/XALcTiv2N3eQDeoITUlM+MpGn7f33niI25uZEhbTL4d1dzpVKKiqags= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054685871306.374178730346; Tue, 21 Oct 2025 06:51:25 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjb-0002F7-J0; Tue, 21 Oct 2025 09:49:07 -0400 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 1vBCjZ-0002ET-GC; Tue, 21 Oct 2025 09:49:05 -0400 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjW-0006qz-NK; Tue, 21 Oct 2025 09:49:05 -0400 Received: from pps.filterd (m0360083.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L5OxCE015516; Tue, 21 Oct 2025 13:49:00 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9w9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:49:00 +0000 (GMT) Received: from m0360083.ppops.net (m0360083.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDmxMu018377; Tue, 21 Oct 2025 13:48:59 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v326q9w5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:59 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LAtb7A014663; Tue, 21 Oct 2025 13:48:58 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vn7s376p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:48:58 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmsb022414030 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:55 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id C6F432004E; Tue, 21 Oct 2025 13:48:54 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B62FC2004D; Tue, 21 Oct 2025 13:48:51 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:51 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:date:from:in-reply-to:message-id :mime-version:references:subject:to; s=pp1; bh=yz9ZkpUNAwEB9OjZo CbrPegu+3lYt5AKKmCiXg5eIJ4=; b=QFK60+Qt/6kejTSAOSabwIUfSLeE0Br16 1RpZKwxlm2PvY1mi45MHc75XOjpSCi7TAuvZh55lx3DzneqMV19lX1gOR8e3YKol T2JAfcY71qsHqLZ7XLA2p0NN90R/8tTAL8QLrz17j3sXpu64n2hkyYBDUZZYggzp tU1YOKNSTQ3Dn+VQx6NfR91/B34gvKNRxk5eyJEYSvipABaufgDSmO/qgVbZAQxi 2wTw9MozccdEVhqwQQ+QkG/qa2QK6BMlzPw6iEukcvf1zeY8Uz1L8sMCm/zbhFfn aic/6U2RM7aCjSAwppq2cl2D6kxQ8EAZH4lu7yIJM2+qUiBmRGOuw== From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 7/8] tests/functional: Add test for fadump in PSeries Date: Tue, 21 Oct 2025 19:18:17 +0530 Message-ID: <20251021134823.1861675-8-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Authority-Analysis: v=2.4 cv=EJELElZC c=1 sm=1 tr=0 ts=68f78f4c cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=NEAV23lmAAAA:8 a=vTr9H3xdAAAA:8 a=VnNF1IyMAAAA:8 a=Gr56plS7bk8yA4v_bscA:9 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfXw3rrUNB8nLvr niVwK5JQjyruMFcG1QxgeAYi4juuaBvKNCzcsS8a+9UcUkzanA1zxYESe7Yl/GBevQrLDj92UWg EgBow4rI+KtAspMiSXOZwZJ7YUy2XWDm914mff6XQJeEUSZtH4aLEWou0HoWmRBvOmxvOgLZJ9g g+tj0QtnJnSMOcI8XVswPZXzYBKbtpLENmciUDYS44YCWhvNs7gXvq5H0EJQSEsic+hGTwkoykc FdZDujYD4WxLm66nSAHpLg5dfhjxTYK11Bn4QhOI3Hk06OcRrQdjjIIluICFRphdI8s44/8VIVd NHrJRdFdtZUWw+Qcb/8Mk0MTQnYv2KJTQhhikJq5pjmy3wJ+3B4+hS7hHhORMWbkECmJ8zj8L0R zo1zAcki5Y9HE4963RnU67dJ98IanA== X-Proofpoint-GUID: lvn__1TFMZ0dHAypB6zzXa3iE2Z-9Z8k X-Proofpoint-ORIG-GUID: pD9ab2BeggR1hvwJpZebc0FKNj9uh0DK X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 priorityscore=1501 suspectscore=0 bulkscore=0 spamscore=0 malwarescore=0 phishscore=0 adultscore=0 lowpriorityscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.156.1; envelope-from=adityag@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054688681158500 Content-Type: text/plain; charset="utf-8" Add testcases for testing fadump with PSeries and PSeries+KVM combinations It tests if fadump is successfully detected and registered in the first kernel boot. Then crashes the kernel, and verifies whether we have a /proc/vmcore in the 2nd boot Also introduce 'wait_for_regex_console_pattern' to check for cases where there is a single success message, but can have multiple failure messages. This is particularly useful for cases such as fadump, where the success message is "Reserved 1024MB ... successfully" But at the same point, it can fail with multiple errors such as "Not supported" or "Allocation failed" 'wait_for_regex_console_pattern' also has a timeout, for cases when we know the success/failure should appear in a short amount of time, instead of waiting for the much longer test timeout, such as kernels with support of fadump will print the success/failure in earlyboot of the kernel, while kernel without support of fadump won't print anything for long time, and without a timeout the testcase keeps waiting till longer test timeout Signed-off-by: Aditya Gupta Tested-by:Shivang Upadhyay --- PowerNV also can be tested with this, will enable PowerNV tests after MPIPL patches go in --- --- tests/functional/ppc64/meson.build | 2 + tests/functional/ppc64/test_fadump.py | 182 ++++++++++++++++++++++ tests/functional/qemu_test/linuxkernel.py | 59 +++++++ 3 files changed, 243 insertions(+) create mode 100755 tests/functional/ppc64/test_fadump.py diff --git a/tests/functional/ppc64/meson.build b/tests/functional/ppc64/me= son.build index 1fa0a70f7ed8..f0f8ab8f6172 100644 --- a/tests/functional/ppc64/meson.build +++ b/tests/functional/ppc64/meson.build @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later =20 test_ppc64_timeouts =3D { + 'fadump' : 480, 'hv' : 1000, 'mac99' : 120, 'powernv' : 480, @@ -16,6 +17,7 @@ tests_ppc64_system_quick =3D [ =20 tests_ppc64_system_thorough =3D [ 'e500', + 'fadump', 'hv', 'mac99', 'powernv', diff --git a/tests/functional/ppc64/test_fadump.py b/tests/functional/ppc64= /test_fadump.py new file mode 100755 index 000000000000..2d6b8017e8f0 --- /dev/null +++ b/tests/functional/ppc64/test_fadump.py @@ -0,0 +1,182 @@ +#!/usr/bin/env python3 +# +# SPDX-License-Identifier: GPL-2.0-or-later + +from unittest import skip +from qemu_test import Asset +from qemu_test import wait_for_console_pattern +from qemu_test import LinuxKernelTest +from qemu_test import exec_command, exec_command_and_wait_for_pattern + +class QEMUFadump(LinuxKernelTest): + """ + Functional test to verify Fadump is working in following scenarios: + + 1. test_fadump_pseries: PSeries + 2. test_fadump_pseries_kvm: PSeries + KVM + """ + + timeout =3D 90 + KERNEL_COMMON_COMMAND_LINE =3D 'console=3Dhvc0 fadump=3Don ' + msg_panic =3D 'Kernel panic - not syncing' + msg_not_supported =3D 'Firmware-Assisted Dump is not supported on this= hardware' + msg_registered_success =3D '' + msg_registered_failed =3D '' + msg_dump_active =3D '' + + ASSET_EPAPR_KERNEL =3D Asset( + ('https://github.com/open-power/op-build/releases/download/v2.7/' + 'zImage.epapr'), + '0ab237df661727e5392cee97460e8674057a883c5f74381a128fa772588d45cd') + + ASSET_VMLINUZ_KERNEL =3D Asset( + ('https://archives.fedoraproject.org/pub/archive/fedora-secondary/' + 'releases/39/Everything/ppc64le/os/ppc/ppc64/vmlinuz'), + ('81e5541d243b50c8f9568906c6918dda22239744d637bb9a7b22d23c3d661226' + '8d5302beb2ca5c06f93bdbc9736c414ef5120756c8bf496ff488ad07d116d67f= ') + ) + + ASSET_FEDORA_INITRD =3D Asset( + ('https://archives.fedoraproject.org/pub/archive/fedora-secondary/' + 'releases/39/Everything/ppc64le/os/ppc/ppc64/initrd.img'), + 'e7f24b44cb2aaa67d30e551db6ac8d29cc57c934b158dabca6b7f885f2cfdd9b') + + def do_test_fadump(self, is_kvm=3DFalse, is_powernv=3DFalse): + """ + Helper Function for Fadump tests below + + It boots the VM with fadump enabled, checks if fadump is correctly + registered. + Then crashes the system causing a QEMU_SYSTEM_RESET, after which + dump should be available in the kernel. + Finally it checks the filesize of the exported /proc/vmcore in 2nd + kernel to verify it's same as the VM's memory size + """ + if is_kvm: + self.require_accelerator("kvm") + self.vm.add_args("-accel", "kvm") + else: + self.require_accelerator("tcg") + + if is_powernv: + self.set_machine("powernv10") + else: + # SLOF takes upto >20s in startup time, use VOF + self.set_machine("pseries") + self.vm.add_args("-machine", "x-vof=3Don") + self.vm.add_args("-m", "6G") + + self.vm.set_console() + + kernel_path =3D None + + if is_powernv: + kernel_path =3D self.ASSET_EPAPR_KERNEL.fetch() + else: + kernel_path =3D self.ASSET_VMLINUZ_KERNEL.fetch() + + initrd_path =3D self.ASSET_FEDORA_INITRD.fetch() + + self.vm.add_args('-kernel', kernel_path) + self.vm.add_args('-initrd', initrd_path) + self.vm.add_args('-append', "fadump=3Don"\ + " -nodefaults -serial mon:stdio crashkernel=3D2G"\ + " rdinit=3D/bin/sh ") + + self.vm.launch() + + # If kernel detects fadump support, and "fadump=3Don" is in command + # line which we add above, it will print something like: + # + # fadump: Reserved 1024MB of memory at 0x00000040000000 ... + # + # Else, if the kernel doesn't detect fadump support, it prints: + # + # fadump: Firmware-Assisted Dump is not supported on this hard= ware + # + # Timeout after 20s if kernel doesn't print any fadump logs, this + # can happen due to fadump being disabled in the kernel + self.wait_for_regex_console_pattern( + success_pattern=3D"fadump: Reserved ", + failure_pattern=3Dr"fadump: (Firmware-Assisted Dump is not"\ + " supported on this hardware|Failed to find memory chunk for"\ + " reservation!)", + timeout=3D20 + ) + + # Ensure fadump is registered successfully, if registration + # succeeds, we get a log from rtas fadump: + # + # rtas fadump: Registration is successful! + self.wait_for_console_pattern( + "rtas fadump: Registration is successful!" + ) + + # Wait for the shell + self.wait_for_console_pattern("#") + + # Mount /proc since not available in the initrd used + exec_command(self, command=3D"mount -t proc proc /proc") + + # Crash the kernel + exec_command(self, command=3D"echo c > /proc/sysrq-trigger") + + # Check for the kernel panic message, setting timeout to 20s as it + # should occur almost immediately after previous echo c + self.wait_for_regex_console_pattern( + success_pattern=3D"Kernel panic - not syncing: sysrq" \ + " triggered crash", + timeout=3D20 + ) + + # Check if fadump is active + # If the kernel shows that fadump is active, that implies it's a + # crashkernel boot + # Else if the kernel shows "fadump: Reserved ..." then it's + # treating this as the first kernel boot, this is likely the case + # that qemu didn't pass the 'ibm,kernel-dump' device tree node + wait_for_console_pattern( + test=3Dself, + success_message=3D"rtas fadump: Firmware-assisted dump is acti= ve", + failure_message=3D"fadump: Reserved " + ) + + # In a successful fadump boot, we get these logs: + # + # [ 0.000000] fadump: Firmware-assisted dump is active. + # [ 0.000000] fadump: Reserving <>MB of memory at <> for preser= ving crash data + # + # Check if these logs are present in the fadump boot + self.wait_for_console_pattern("preserving crash data") + + # Wait for prompt + self.wait_for_console_pattern("sh-5.2#") + + # Mount /proc since not available in the initrd used + exec_command_and_wait_for_pattern(self, + command=3D"mount -t proc proc /proc", + success_message=3D"#" + ) + + # Check if vmcore exists + exec_command_and_wait_for_pattern(self, + command=3D"stat /proc/vmcore", + success_message=3D"File: /proc/vmcore", + failure_message=3D"No such file or directory" + ) + + def test_fadump_pseries(self): + return self.do_test_fadump(is_kvm=3DFalse, is_powernv=3DFalse) + + @skip("PowerNV Fadump not supported yet") + def test_fadump_powernv(self): + return + + def test_fadump_pseries_kvm(self): + """ + Test Fadump in PSeries with KVM accel + """ + self.do_test_fadump(is_kvm=3DTrue, is_powernv=3DFalse) + +if __name__ =3D=3D '__main__': + QEMUFadump.main() diff --git a/tests/functional/qemu_test/linuxkernel.py b/tests/functional/q= emu_test/linuxkernel.py index 2aca0ee3cd03..c4767527daf6 100644 --- a/tests/functional/qemu_test/linuxkernel.py +++ b/tests/functional/qemu_test/linuxkernel.py @@ -5,6 +5,9 @@ =20 import hashlib import urllib.request +import logging +import re +import time =20 from .cmd import wait_for_console_pattern, exec_command_and_wait_for_patte= rn from .testcase import QemuSystemTest @@ -19,6 +22,62 @@ def wait_for_console_pattern(self, success_message, vm= =3DNone): failure_message=3D'Kernel panic - not syn= cing', vm=3Dvm) =20 + def wait_for_regex_console_pattern(self, success_pattern, + failure_pattern=3DNone, + timeout=3DNone): + """ + Similar to 'wait_for_console_pattern', but supports regex patterns, + hence multiple failure/success patterns can be detected at a time. + + Args: + success_pattern (str | re.Pattern): A regex pattern that indic= ates + a successful event. If found, the method exits normally. + failure_pattern (str | re.Pattern, optional): A regex pattern = that + indicates a failure event. If found, the test fails + timeout (int, optional): The maximum time (in seconds) to wait= for + a match. + If exceeded, the test fails. + """ + + console =3D self.vm.console_file + console_logger =3D logging.getLogger('console') + + self.log.debug( + f"Console interaction: success_msg=3D'{success_pattern}' " + + f"failure_msg=3D'{failure_pattern}' timeout=3D'{timeout}s'") + + # Only consume console output if waiting for something + if success_pattern is None and failure_pattern is None: + return + + start_time =3D time.time() + + while time.time() - start_time < timeout: + try: + msg =3D console.readline().decode().strip() + except UnicodeDecodeError: + msg =3D None + if not msg: + continue + console_logger.debug(msg) + if success_pattern is None or re.search(success_pattern, msg): + break + if failure_pattern: + # Find the matching error to print in log + match =3D re.search(failure_pattern, msg) + if not match: + continue + + console.close() + fail =3D 'Failure message found in console: "%s".' \ + ' Expected: "%s"' % \ + (match.group(), success_pattern) + self.fail(fail) + + if time.time() - start_time >=3D timeout: + fail =3D f"Timeout ({timeout}s) while trying to search pattern" + self.fail(fail) + def launch_kernel(self, kernel, initrd=3DNone, dtb=3DNone, console_ind= ex=3D0, wait_for=3DNone): self.vm.set_console(console_index=3Dconsole_index) --=20 2.51.0 From nobody Fri Nov 14 16:40:29 2025 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=reject dis=none) header.from=linux.ibm.com ARC-Seal: i=1; a=rsa-sha256; t=1761054631; cv=none; d=zohomail.com; s=zohoarc; b=TaElInRY7u7isz+tFrRBarZZUpVByybyGBkFwobfvYydrVn8RoOLwIg8yys8ECATfKQNKPeDbVwB4upXYorBNrx8LxPsjZGKxkGTclRLTOmPJKnQR281MQC2WU2cR1rUHwz3bAS3SVKF/PV+Vb1fbgF1eLUgvq+FQoO2E/qYcXU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1761054631; 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=9h3VvnGZ8OLoaTVuyoC+Z/mhm5FI0cTT4sjt3vfC8/I=; b=axwns/ZTjDaemrpH4q6fWQWwDrkZW8zA8mnPBrzUfTEi3d5Z1JhqBAATiKBO5vA7R5uP0pzr9kApxFZ5O0RWeg6r4DZTo7UOYL272HoZcYPcVfzbS/+oUEAQ9mQbMLQNQ+ql1kvx4j7Zf8BXKbm0L2g98MBy2Urw4o1XCXot6Kc= 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=reject dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1761054631445538.5150544826265; Tue, 21 Oct 2025 06:50:31 -0700 (PDT) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1vBCjc-0002GX-LJ; Tue, 21 Oct 2025 09:49:08 -0400 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 1vBCjb-0002F6-5A; Tue, 21 Oct 2025 09:49:07 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1vBCjZ-0006rG-DM; Tue, 21 Oct 2025 09:49:06 -0400 Received: from pps.filterd (m0356516.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 59L33ekb031143; Tue, 21 Oct 2025 13:49:03 GMT Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v30vnyme-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:49:03 +0000 (GMT) Received: from m0356516.ppops.net (m0356516.ppops.net [127.0.0.1]) by pps.reinject (8.18.1.12/8.18.0.8) with ESMTP id 59LDXE3I010426; Tue, 21 Oct 2025 13:49:03 GMT Received: from ppma12.dal12v.mail.ibm.com (dc.9e.1632.ip4.static.sl-reverse.com [50.22.158.220]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 49v30vnyma-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:49:03 +0000 (GMT) Received: from pps.filterd (ppma12.dal12v.mail.ibm.com [127.0.0.1]) by ppma12.dal12v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 59LAqrRi014650; Tue, 21 Oct 2025 13:49:02 GMT Received: from smtprelay06.fra02v.mail.ibm.com ([9.218.2.230]) by ppma12.dal12v.mail.ibm.com (PPS) with ESMTPS id 49vn7s376r-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 21 Oct 2025 13:49:02 +0000 Received: from smtpav04.fra02v.mail.ibm.com (smtpav04.fra02v.mail.ibm.com [10.20.54.103]) by smtprelay06.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 59LDmw8729294892 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 21 Oct 2025 13:48:58 GMT Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 95DFE2004E; Tue, 21 Oct 2025 13:48:58 +0000 (GMT) Received: from smtpav04.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 36BB02004D; Tue, 21 Oct 2025 13:48:55 +0000 (GMT) Received: from li-3c92a0cc-27cf-11b2-a85c-b804d9ca68fa.ibm.com.com (unknown [9.124.222.96]) by smtpav04.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 21 Oct 2025 13:48:54 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=9h3Vvn GZ8OLoaTVuyoC+Z/mhm5FI0cTT4sjt3vfC8/I=; b=eqw36apJD6TPEBmUGgKAfz ++jNB1iro+miFxAlOjM4QsRiR8P+ZqMDeCtr9p4HP9QNuf71L7c/aJWQ6FsyYpUO ln88/ZnOELWW0ciw8W0hvWp6ecaHgbZgpGuVIvgqLhOeRhh+eY6FueQNZ7TTxYGI w9FkqKV1jTtFz1coqK8Gk2Z3fM0qJWq9m0AFdL8x+h3AYjDUDjU4FlbK+kmnf/eq hfH6nBq9XBwgSx5Gaxw0ylisR706I2dCtX/upliLsA9XZWIDTMJ/g0zUZumkiazC d7mrATOaR3UxZZ1UTQTZ0PJhcjC3e2AVQnG/NyExsrnjA5E1FZIOH0pcFc4TvRYw == From: Aditya Gupta To: Cc: , Nicholas Piggin , Daniel Henrique Barboza , Harsh Prateek Bora , Sourabh Jain , Mahesh J Salgaonkar , Hari Bathini , Chinmay Rath , Thomas Huth , Shivang Upadhyay , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Subject: [PATCH v5 8/8] MAINTAINERS: Add entry for FADump (pSeries) Date: Tue, 21 Oct 2025 19:18:18 +0530 Message-ID: <20251021134823.1861675-9-adityag@linux.ibm.com> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20251021134823.1861675-1-adityag@linux.ibm.com> References: <20251021134823.1861675-1-adityag@linux.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 3xG7bqptrsQ7izL49-vIfwkB_FgdYuP4 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjUxMDE4MDAyMiBTYWx0ZWRfX0bKdjiOQsqrj OoaJ5gyzKVzekHmLGR3gVtNnmco93ksdjr12ZSt2RoEDMev9DCtsJPIaMDGi5+bMdqtpGgfzg9W xMjp7t0cjbldc/anSh9QRhnhBa02dUIkX/9ozAWTHokwaHtFTMPDS9K6/Q64KAPso6eJWCOB+l7 QDCjHjvaS/BLDWs/Hop62w+ks3FQpuDJ/AAaX6cBb5V6T1G0xWCtT2HvX+7kqu9/3pxh/ftn2Hc x8smokluuLwSIsPFbULhN2zyEcc+WfFe0xUVSGHG1YT7y1QqAF9bzJ3aw+VujnwVmLvzLIf+HbK YzOegvwSl9KMKtf5Dvtx0dOmpozHIVeHMYPT47Nm+48r90AZ1G0RWhwXDB6Z/6PWKgUM5/OHJwd BYhmpTFp/k6MxAEWZx0DOg27357p/Q== X-Authority-Analysis: v=2.4 cv=MIJtWcZl c=1 sm=1 tr=0 ts=68f78f4f cx=c_pps a=bLidbwmWQ0KltjZqbj+ezA==:117 a=bLidbwmWQ0KltjZqbj+ezA==:17 a=IkcTkHD0fZMA:10 a=x6icFKpwvdMA:10 a=VkNPw1HP01LnGYTKEx00:22 a=VnNF1IyMAAAA:8 a=KKAkSRfTAAAA:8 a=mbnq6HtSZEenJqVaWLAA:9 a=3ZKOabzyN94A:10 a=QEXdDO2ut3YA:10 a=cvBusfyB2V15izCimMoJ:22 X-Proofpoint-ORIG-GUID: JS_TfmVSpN4E3XY9bMpoUe8Orb6tnEHn X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.80.40 definitions=2025-10-21_02,2025-10-13_01,2025-03-28_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 spamscore=0 phishscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 impostorscore=0 bulkscore=0 priorityscore=1501 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.19.0-2510020000 definitions=main-2510180022 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=148.163.158.5; envelope-from=adityag@linux.ibm.com; helo=mx0b-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, 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: 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 @ibm.com) X-ZM-MESSAGEID: 1761054634359154100 Add maintainer and reviewer for fadump subsystem. Signed-off-by: Aditya Gupta Acked-by: Sourabh Jain Tested-by:Shivang Upadhyay --- MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/MAINTAINERS b/MAINTAINERS index 667acd933c7f..5dcea23bfd3d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3213,6 +3213,14 @@ F: scripts/coccinelle/remove_local_err.cocci F: scripts/coccinelle/use-error_fatal.cocci F: scripts/coccinelle/errp-guard.cocci =20 +Firmware Assisted Dump (fadump) for sPAPR (pseries) +M: Aditya Gupta +R: Sourabh Jain +S: Maintained +F: include/hw/ppc/spapr_fadump.h +F: hw/ppc/spapr_fadump.c +F: tests/functional/ppc64/test_fadump.py + GDB stub M: Alex Benn=C3=A9e R: Philippe Mathieu-Daud=C3=A9 --=20 2.51.0