From patchwork Sat Sep 16 13:03:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shuai Xue X-Patchwork-Id: 141044 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp1648218vqi; Sat, 16 Sep 2023 06:05:52 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH+RqfDs34AxsJAFlX281s7+1YENs/NKp2JXhIgJcoShG9n6lwsXO7q/8P43cnNFerXq6VD X-Received: by 2002:a05:6e02:b22:b0:34d:ec00:2ce8 with SMTP id e2-20020a056e020b2200b0034dec002ce8mr6332285ilu.21.1694869552069; Sat, 16 Sep 2023 06:05:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694869552; cv=none; d=google.com; s=arc-20160816; b=IakACgRG3EkBxdZuhzW5JPmf8pZZw5wR8fggvD0wl2TnckneElMVOOPCriK9rYi1Yp TWOqoILT0gOAg8tNZ72OlgkuqJVAlLNzuCIR4MRX3ceczbT9I1q3qv8JS/N2lEL2Mj8v pvXTjt6g7zVzTd8ekuiMBgPJywtxjZOqR9c9xdnuSH61QL72TXaY2NOr5neR8X3RiMeo gFeyuomvFvd+vIFmeN4Pe14km+8DFqwK1BlIettEcKjkXXTZNFsbP+LV+V2DBzDH/7zS MgQ79Yvo/O7EyyjF8ZWGfsk8Ttih73X3RllaZ+0xtT8AbSGMaN61tLnf+X0/rS0oPncY /JGA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=19++vR8OerylIUBCdkXPucDjEPQq7qHru1d4PS1ijhY=; fh=FxxuQyV5zt5uOZlISi71Gibj4pONM7+jzC8ls2GxgWY=; b=hvge34I3i95sPEkaiR3rY4QtoctCJu8P4yLCWCRRAbMAXMl0quhAYtB8dOHAtywV1/ /MTTCjAYIfrqDctU4RGC4iMGg8kbjQrcoSdPxT7KYXyItTjnrIc54u/2mB3ZQ6dm5WIt vU4dGPUHVNy2Jd1KTDggBzj4oPVuu7LV+c65WBXmRjJapjNP8/KojB4lOpaKPjGz1PVT Hkd6nJzYApFKzYmtbg8SHV+L5ayefCqQnoXn81FCcHBPJmzAG9sW0AWWbivnW3Qomi1a Ncm9iSNwHZYIP260Eh9Q8DZ8G5jo1QhrIGkJ+VoiS778M8MMn2hZ9hMFNB81HRBWGLc0 5o8Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: from lipwig.vger.email (lipwig.vger.email. [2620:137:e000::3:3]) by mx.google.com with ESMTPS id z185-20020a6333c2000000b00577dd005706si4547559pgz.779.2023.09.16.06.05.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 16 Sep 2023 06:05:52 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) client-ip=2620:137:e000::3:3; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:3 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=alibaba.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id CBF6A8323BC9; Sat, 16 Sep 2023 06:05:38 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239333AbjIPND5 (ORCPT + 29 others); Sat, 16 Sep 2023 09:03:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38204 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233025AbjIPNDj (ORCPT ); Sat, 16 Sep 2023 09:03:39 -0400 Received: from out30-111.freemail.mail.aliyun.com (out30-111.freemail.mail.aliyun.com [115.124.30.111]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95FC1CC2; Sat, 16 Sep 2023 06:03:31 -0700 (PDT) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R111e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018045170;MF=xueshuai@linux.alibaba.com;NM=1;PH=DS;RN=22;SR=0;TI=SMTPD_---0VsA36vM_1694869406; Received: from localhost.localdomain(mailfrom:xueshuai@linux.alibaba.com fp:SMTPD_---0VsA36vM_1694869406) by smtp.aliyun-inc.com; Sat, 16 Sep 2023 21:03:28 +0800 From: Shuai Xue To: keescook@chromium.org, tony.luck@intel.com, gpiccoli@igalia.com, rafael@kernel.org, lenb@kernel.org, james.morse@arm.com, bp@alien8.de, tglx@linutronix.de, mingo@redhat.com, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, ardb@kernel.org, robert.moore@intel.com Cc: linux-hardening@vger.kernel.org, linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-edac@vger.kernel.org, linux-efi@vger.kernel.org, acpica-devel@lists.linuxfoundation.org, xueshuai@linux.alibaba.com, baolin.wang@linux.alibaba.com Subject: [RFC PATCH 5/9] ACPI: APEI: GHES: Use ERST to serialize APEI generic error before panic Date: Sat, 16 Sep 2023 21:03:12 +0800 Message-Id: <20230916130316.65815-6-xueshuai@linux.alibaba.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230916130316.65815-1-xueshuai@linux.alibaba.com> References: <20230916130316.65815-1-xueshuai@linux.alibaba.com> MIME-Version: 1.0 X-Spam-Status: No, score=-0.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Sat, 16 Sep 2023 06:05:38 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777199535105829653 X-GMAIL-MSGID: 1777199535105829653 In certain scenarios (ie. hosts/guests with root filesystems on NFS/iSCSI where networking software and/or hardware fails, and thus kdump fails), it is necessary to serialize hardware error information available for post-mortem debugging. Save the hardware error log into flash via ERST before go panic, the hardware error log can be gotten from the flash after system boot successful again, which is very useful in production. Signed-off-by: Shuai Xue --- drivers/acpi/apei/ghes.c | 44 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c index d14e00751161..16701f889b73 100644 --- a/drivers/acpi/apei/ghes.c +++ b/drivers/acpi/apei/ghes.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include @@ -636,6 +637,43 @@ static void ghes_defer_non_standard_event(struct acpi_hest_generic_data *gdata, schedule_work(&entry->work); } +static int ghes_serialize_estatus(struct acpi_hest_generic_data *gdata, u8 notify_type) +{ + void *err = acpi_hest_get_payload(gdata); + int data_len = gdata->error_data_length; + struct cper_pstore_record *rcd; + int record_len = data_len + sizeof(*rcd); + + rcd = kmalloc(record_len, GFP_KERNEL); + memset(rcd, 0, sizeof(rcd)); + + memcpy(rcd->hdr.signature, CPER_SIG_RECORD, CPER_SIG_SIZE); + rcd->hdr.revision = CPER_RECORD_REV; + rcd->hdr.signature_end = CPER_SIG_END; + rcd->hdr.section_count = 1; + rcd->hdr.error_severity = CPER_SEV_FATAL; + /* timestamp, platform_id, partition_id are all invalid */ + rcd->hdr.validation_bits = 0; + rcd->hdr.record_length = record_len; + rcd->hdr.creator_id = CPER_CREATOR_PSTORE; + rcd->hdr.notification_type = CPER_NOTIFY_MCE; + rcd->hdr.record_id = cper_next_record_id(); + rcd->hdr.flags = CPER_HW_ERROR_FLAGS_PREVERR; + + rcd->sec_hdr.section_offset = (void *)&rcd->data - (void *)&rcd; + rcd->sec_hdr.section_length = data_len; + rcd->sec_hdr.revision = CPER_SEC_REV; + /* ->ru_id and fru_text is invalid */ + rcd->sec_hdr.validation_bits = 0; + rcd->sec_hdr.flags = CPER_SEC_PRIMARY; + rcd->sec_hdr.section_type = gdata->section_type; + rcd->sec_hdr.section_severity = gdata->error_severity; + + memcpy(&rcd->data, err, data_len); + + return erst_write(&rcd->hdr); +} + static bool ghes_do_proc(struct ghes *ghes, const struct acpi_hest_generic_status *estatus) { @@ -861,10 +899,16 @@ static void __ghes_panic(struct ghes *ghes, struct acpi_hest_generic_status *estatus, u64 buf_paddr, enum fixed_addresses fixmap_idx) { + struct acpi_hest_generic_data *gdata; + u8 notify_type = ghes->generic->notify.type; + __ghes_print_estatus(KERN_EMERG, ghes->generic, estatus); ghes_clear_estatus(ghes, estatus, buf_paddr, fixmap_idx); + apei_estatus_for_each_section(estatus, gdata) + ghes_serialize_estatus(gdata, notify_type); + /* reboot to log the error! */ if (!panic_timeout) panic_timeout = ghes_panic_timeout;