Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753034AbdI0MsD (ORCPT ); Wed, 27 Sep 2017 08:48:03 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:7051 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752695AbdI0Mrb (ORCPT ); Wed, 27 Sep 2017 08:47:31 -0400 From: Xie XiuQi To: , , , , , , , , , , , , , CC: , , , , , , , , , , , , Subject: [PATCH v4 4/4] arm64/ras: save error address from memory section for recovery Date: Wed, 27 Sep 2017 20:50:20 +0800 Message-ID: <1506516620-20033-5-git-send-email-xiexiuqi@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1506516620-20033-1-git-send-email-xiexiuqi@huawei.com> References: <1506516620-20033-1-git-send-email-xiexiuqi@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.113.25] X-CFilter-Loop: Reflected X-Mirapoint-Virus-RAPID-Raw: score=unknown(0), refid=str=0001.0A020206.59CB9DB8.0113,ss=1,re=0.000,recu=0.000,reip=0.000,cl=1,cld=1,fgs=0, ip=0.0.0.0, so=2014-11-16 11:51:01, dmn=2013-03-21 17:37:32 X-Mirapoint-Loop-Id: 64ce914c2fd4d37c79177fb6268e2cac Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1415 Lines: 49 In some platform, when SEA triggerred, physical address might be reported by memory section, so we save it for error recovery later. Signed-off-by: Xie XiuQi --- arch/arm64/kernel/ras.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/arch/arm64/kernel/ras.c b/arch/arm64/kernel/ras.c index c48503c..ff24181 100644 --- a/arch/arm64/kernel/ras.c +++ b/arch/arm64/kernel/ras.c @@ -140,3 +140,34 @@ void ghes_arm_process_error(struct ghes *ghes, struct cper_sec_proc_arm *err) if (info_saved) set_thread_flag(TIF_SEA_NOTIFY); } + +int ghes_mem_err_callback(struct notifier_block *nb, unsigned long val, void *data) +{ + bool info_saved = false; + struct ghes_mem_err *ghes_mem = (struct ghes_mem_err *)data; + struct cper_sec_mem_err *mem_err = ghes_mem->mem_err; + + if ((ghes_mem->notify_type != ACPI_HEST_NOTIFY_SEA) || + (ghes_mem->severity != CPER_SEV_RECOVERABLE)) + return 0; + + if (mem_err->validation_bits & CPER_MEM_VALID_PA) + info_saved = sea_save_info(mem_err->physical_addr); + + if (info_saved) + set_thread_flag(TIF_SEA_NOTIFY); + + return 0; +} + +static struct notifier_block ghes_mem_err_nb = { + .notifier_call = ghes_mem_err_callback, +}; + +static int arm64_err_recov_init(void) +{ + atomic_notifier_chain_register(&ghes_mem_err_chain, &ghes_mem_err_nb); + return 0; +} + +late_initcall(arm64_err_recov_init); -- 1.8.3.1