From patchwork Thu Jun 17 10:40:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikko Perttunen X-Patchwork-Id: 12327427 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 98163C2B9F4 for ; Thu, 17 Jun 2021 10:45:42 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 600AB613BA for ; Thu, 17 Jun 2021 10:45:42 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 600AB613BA Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=nvidia.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:Cc :To:From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=8xbGF8ljMtyJ1cGFvNnJKKPm0kzgW5qk9e9tchTlu6Q=; b=s0QcV0p+kypxDR PAF8xJ5FzpOnDnO/00vrBpZ8OgjVXYVneJDHPGEHnC1xhFwDTdTzidBfZKlngoIdsYfVGPLPGVf5Y stix9bbsvl79uoNj/nq5SsxHZUDTX7tVfo0wwz/5scG6KoTgYJ24tmZu5zRpqVb8jBOhseJPEjNDq +nsRqhjMf/ydyQ13FVrb75qWTkLnH0+CCGeUhCW/goD5/Vn6asTOjaAk84DkTWRzpw8r0i4ZdrREi d8eq2ww7wIiwxJvFiIguapJeiaq3HZ2wPIik5S3zzSNhTv1Vo7pmoRkgUtSmfrzZneSyTyiW36VPj 20Vzgxmvt8EuB/WiaqGQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltpVT-009tkv-7K; Thu, 17 Jun 2021 10:44:19 +0000 Received: from mail.kapsi.fi ([2001:67c:1be8::25]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltpVO-009tiQ-Iw for linux-arm-kernel@lists.infradead.org; Thu, 17 Jun 2021 10:44:16 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=kapsi.fi; s=20161220; h=Content-Transfer-Encoding:MIME-Version:Message-Id:Date:Subject :Cc:To:From:Sender:Reply-To:Content-Type:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: In-Reply-To:References:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=IohCMyCwLQNiwDAEmAYJzQsgursOeE+GX9lSyPBU/Mo=; b=BLktE7PiCNGwZTg8bAJT9JCE52 e1+/luEIBf0ZS8nKmxMHeargCS49jzZ4Q2/OXsab9fKD/uGFoD1HLos7NwILTyURYdG+mJmWWXwzh cbSgrCDWydLlkxvQoN/twtU8fVz5T5dTmES+dqd1fCoshWyxYnLp3iiP//Z9GR9PcK45Wt9o+8LXv tvVULDOm+A3JBiwVi2x3G/xWnJv8H4gSfbRg93ZUykfg8vr61thKT52HaFU0HUcCetbwni7UlVW1j 4Qdc6srEWBc17mvAhspYeolFGUmSCTxZ2JOYbuvrdQwK1sMHFIsPR8bqc0CsTZmzPxBSGEBKq2PgJ I42+6qrQ==; Received: from dsl-hkibng22-54f986-236.dhcp.inet.fi ([84.249.134.236] helo=toshino.localdomain) by mail.kapsi.fi with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1ltpVH-0006tB-Kc; Thu, 17 Jun 2021 13:44:07 +0300 From: Mikko Perttunen To: catalin.marinas@arm.com, will@kernel.org, thierry.reding@gmail.com, jonathanh@nvidia.com Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org, Mikko Perttunen Subject: [PATCH 1/2] arm64: traps: Support for registering SError hooks Date: Thu, 17 Jun 2021 13:40:52 +0300 Message-Id: <20210617104053.765434-1-mperttunen@nvidia.com> X-Mailer: git-send-email 2.30.1 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 84.249.134.236 X-SA-Exim-Mail-From: mperttunen@nvidia.com X-SA-Exim-Scanned: No (on mail.kapsi.fi); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210617_034414_836775_53EAE3BA X-CRM114-Status: UNSURE ( 9.62 ) X-CRM114-Notice: Please train this message. X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add the ability for drivers to register SError hooks to be run on a fatal SError interrupt. This allows printing of system-specific error information to aid with debugging. Signed-off-by: Mikko Perttunen --- arch/arm64/include/asm/traps.h | 6 ++++++ arch/arm64/kernel/traps.c | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/arch/arm64/include/asm/traps.h b/arch/arm64/include/asm/traps.h index 54f32a0675df..054fecfa22f0 100644 --- a/arch/arm64/include/asm/traps.h +++ b/arch/arm64/include/asm/traps.h @@ -22,8 +22,14 @@ struct undef_hook { int (*fn)(struct pt_regs *regs, u32 instr); }; +struct serror_hook { + struct list_head node; + void (*fn)(void); +}; + void register_undef_hook(struct undef_hook *hook); void unregister_undef_hook(struct undef_hook *hook); +void register_serror_hook(struct serror_hook *hook); void force_signal_inject(int signal, int code, unsigned long address, unsigned int err); void arm64_notify_segfault(unsigned long addr); void arm64_force_sig_fault(int signo, int code, unsigned long far, const char *str); diff --git a/arch/arm64/kernel/traps.c b/arch/arm64/kernel/traps.c index 273066279bb5..02dbaab71ea3 100644 --- a/arch/arm64/kernel/traps.c +++ b/arch/arm64/kernel/traps.c @@ -890,8 +890,23 @@ void panic_bad_stack(struct pt_regs *regs, unsigned int esr, unsigned long far) } #endif +static LIST_HEAD(serror_hook); +static DEFINE_RAW_SPINLOCK(serror_lock); + +void register_serror_hook(struct serror_hook *hook) +{ + unsigned long flags; + + raw_spin_lock_irqsave(&serror_lock, flags); + list_add(&hook->node, &serror_hook); + raw_spin_unlock_irqrestore(&serror_lock, flags); +} + void __noreturn arm64_serror_panic(struct pt_regs *regs, u32 esr) { + struct serror_hook *hook; + unsigned long flags; + console_verbose(); pr_crit("SError Interrupt on CPU%d, code 0x%08x -- %s\n", @@ -899,6 +914,11 @@ void __noreturn arm64_serror_panic(struct pt_regs *regs, u32 esr) if (regs) __show_regs(regs); + raw_spin_lock_irqsave(&serror_lock, flags); + list_for_each_entry(hook, &serror_hook, node) + hook->fn(); + raw_spin_unlock_irqrestore(&serror_lock, flags); + nmi_panic(regs, "Asynchronous SError Interrupt"); cpu_park_loop();