Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp839964ybl; Wed, 4 Dec 2019 11:46:57 -0800 (PST) X-Google-Smtp-Source: APXvYqxuLjkuZUWs3qofiAC6UMszvLy1ZRl2jt4lKQxHHgtxP+NwMIrw6zkipHZAsE+B4PVXJugj X-Received: by 2002:aca:1e11:: with SMTP id m17mr4155503oic.100.1575488817000; Wed, 04 Dec 2019 11:46:57 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1575488816; cv=none; d=google.com; s=arc-20160816; b=jXefwzld0IlaBU0pePvCTNaftLDurfA6An6xBHKQugQuxfRIHNK2X6YFzlxyAW3hLB vmx6R4gzxiGGEX6CqMlBuC6qlH6VSyGtP+SVpL6FxyMkxuV6cURoxkP/1LMhITL/44eD wwYXzkp8d1KvL/SwZmdEIdylMie5VfmY5ovbNtqbPl5y4iftF04SfALNgZ0EsOs1UWdy aA3dxWY9G0Rhz2LjSuC7ZQ3PzkbDYnQGpxzck1ExUuLvl6thr2VFLFUHB90SuBegbPq7 WQecCKcmQfOU3oXzLXN1TNsifmUDq/d2YjcCOLQnWaJnaDhhAPFVyjAJbLxTxwX/nkHv iIIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=HlaK+NoU2j7KMRNkWkqpW/Qhh/fYVH9OC4FaVjsgV1c=; b=XVk5tV2QZ7lNO83Y/0c3/F1DGzyaVUrb50yAoQwj5sE3cVzzDpeGtDUPU9VL8/COH0 /OX9n1moDzwTtvk74hk1LCzqkPvG/VBOAHHaavMJUEunKW8Tb82l88LfhmUtzvhvMJkJ 5ZXLsFed6H9TtB+tGNYNIaFb9WePJiC/o6qJ5owP9wuG/u8T1rtNFRoKzIvySKv0Yejj /6T4SEoqMwGOB3IYyHeA1BakqkXWck/APq59wH2DYyQ0YttU63ng47TYxV2hOevermjq VDkRQW7HBcxL6YpPhy5hiS65xZpfHBGB6TzbvfDTdU5Vq78llOU4ougKFaVgdfnX5r2i 7+Zg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=msdSQYKd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 50si3894361otv.177.2019.12.04.11.46.44; Wed, 04 Dec 2019 11:46:56 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=msdSQYKd; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731976AbfLDSRB (ORCPT + 99 others); Wed, 4 Dec 2019 13:17:01 -0500 Received: from mail.kernel.org ([198.145.29.99]:41110 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731599AbfLDSM2 (ORCPT ); Wed, 4 Dec 2019 13:12:28 -0500 Received: from localhost (unknown [217.68.49.72]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id EA9D620674; Wed, 4 Dec 2019 18:12:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1575483147; bh=IRIFf4jSVFyly0lxBpHg7bfrDIjAbhsrihdGmuphs/k=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=msdSQYKdB+ev43WpPfYVEXKtdTCMxqUZeEl/bCx9sY5Wre/gxu92dmz6jHn3/XgXE r25TuA8P53m4UjMFREiWQzxxgpECGH7RWmWbr97HhptBQ78fk1xl5LlD5u3bP2XuPL //vMgRKstON6hBaG5/l2iBW8fKS6jZi2H7g9FN9A= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Christophe Leroy , Scott Wood , Sasha Levin Subject: [PATCH 4.9 070/125] powerpc/83xx: handle machine check caused by watchdog timer Date: Wed, 4 Dec 2019 18:56:15 +0100 Message-Id: <20191204175323.254996483@linuxfoundation.org> X-Mailer: git-send-email 2.24.0 In-Reply-To: <20191204175308.377746305@linuxfoundation.org> References: <20191204175308.377746305@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Christophe Leroy [ Upstream commit 0deae39cec6dab3a66794f3e9e83ca4dc30080f1 ] When the watchdog timer is set in interrupt mode, it causes a machine check when it times out. The purpose of this mode is to ease debugging, not to crash the kernel and reboot the machine. This patch implements a special handling for that, in order to not crash the kernel if the watchdog times out while in interrupt or within the idle task. Signed-off-by: Christophe Leroy [scottwood: added missing #include] Signed-off-by: Scott Wood Signed-off-by: Sasha Levin --- arch/powerpc/include/asm/cputable.h | 1 + arch/powerpc/include/asm/reg.h | 2 ++ arch/powerpc/kernel/cputable.c | 10 ++++++---- arch/powerpc/platforms/83xx/misc.c | 17 +++++++++++++++++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h index 4e54282c29b44..cf51aea47510c 100644 --- a/arch/powerpc/include/asm/cputable.h +++ b/arch/powerpc/include/asm/cputable.h @@ -44,6 +44,7 @@ extern int machine_check_e500(struct pt_regs *regs); extern int machine_check_e200(struct pt_regs *regs); extern int machine_check_47x(struct pt_regs *regs); int machine_check_8xx(struct pt_regs *regs); +int machine_check_83xx(struct pt_regs *regs); extern void cpu_down_flush_e500v2(void); extern void cpu_down_flush_e500mc(void); diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index ceb168cd3b814..26aeeaad32678 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h @@ -663,6 +663,8 @@ #define SRR1_PROGTRAP 0x00020000 /* Trap */ #define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */ +#define SRR1_MCE_MCP 0x00080000 /* Machine check signal caused interrupt */ + #define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ #define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ #define HSRR1_DENORM 0x00100000 /* Denorm exception */ diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 6a82ef039c509..7471ed48f41fa 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c @@ -1162,6 +1162,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .machine_check = machine_check_generic, .platform = "ppc603", }, +#ifdef CONFIG_PPC_83xx { /* e300c1 (a 603e core, plus some) on 83xx */ .pvr_mask = 0x7fff0000, .pvr_value = 0x00830000, @@ -1172,7 +1173,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .platform = "ppc603", }, { /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */ @@ -1186,7 +1187,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .platform = "ppc603", }, { /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */ @@ -1200,7 +1201,7 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .num_pmcs = 4, .oprofile_cpu_type = "ppc/e300", .oprofile_type = PPC_OPROFILE_FSL_EMB, @@ -1217,12 +1218,13 @@ static struct cpu_spec __initdata cpu_specs[] = { .icache_bsize = 32, .dcache_bsize = 32, .cpu_setup = __setup_cpu_603, - .machine_check = machine_check_generic, + .machine_check = machine_check_83xx, .num_pmcs = 4, .oprofile_cpu_type = "ppc/e300", .oprofile_type = PPC_OPROFILE_FSL_EMB, .platform = "ppc603", }, +#endif { /* default match, we assume split I/D cache & TB (non-601)... */ .pvr_mask = 0x00000000, .pvr_value = 0x00000000, diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c index d75c9816a5c92..2b6589fe812dd 100644 --- a/arch/powerpc/platforms/83xx/misc.c +++ b/arch/powerpc/platforms/83xx/misc.c @@ -14,6 +14,7 @@ #include #include +#include #include #include #include @@ -150,3 +151,19 @@ void __init mpc83xx_setup_arch(void) mpc83xx_setup_pci(); } + +int machine_check_83xx(struct pt_regs *regs) +{ + u32 mask = 1 << (31 - IPIC_MCP_WDT); + + if (!(regs->msr & SRR1_MCE_MCP) || !(ipic_get_mcp_status() & mask)) + return machine_check_generic(regs); + ipic_clear_mcp_status(mask); + + if (debugger_fault_handler(regs)) + return 1; + + die("Watchdog NMI Reset", regs, 0); + + return 1; +} -- 2.20.1