Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp975333ybt; Wed, 17 Jun 2020 19:38:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwX4A+TTCoRox0qS9P74RvmNiao0opc5VKHMdt+cHa/iSMXq8T+MhG/QS6dWshPgm5dtabX X-Received: by 2002:aa7:d359:: with SMTP id m25mr1889517edr.365.1592447893849; Wed, 17 Jun 2020 19:38:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592447893; cv=none; d=google.com; s=arc-20160816; b=dCufrw4/jtEI0CCpLMYJPQnqM81RPbIIdyvDdg9Wy/gu4WbKecyfXTf/itZYIk8dB1 /9d7Tp+XMdVwv39NL4qTmGrhui6Qlk5rTYpTe/f6mJne3pr3kKd80M4PpKUHp4imyCEu +g9m3osR1O5d5TXraAoMCpG/+XutBnROcUsOgjGJQnyOs6e5g9dXShfjMBnKH5LNVt/J eXVgzihsXnboxGBR9wepru9xgQtZ4TIqIaTKAgjk4qiVmE8MvDqV6ODkUWCE4V39qWBA wo5gEobLg1tBw709rUrR81iHN6LMIBFvLuzygf4l1TCrZE7XZlBHulb+HyXU/muihXXc BukQ== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Gapr4GATNNdKXSLUMpYS+VGkyj4ctvCdUkWdBiG3E+8=; b=Y7bHbXqYnsHLpMM4QTYm+sYeHpDLHa2BQInN7UHNeLx8R6OHaeFf6BzRBpQHnW23rp L+AJ0JygPHYizG9rruTxEdOuxWiRrx+8cp1oapl+rkO80ZDMdHQX7i4MxerCvRVLM0Cq Rb/FzEre3HkV9DklVLBpz1ERMfdkj8OvYiHbBc+UXsVM/x8gutxubz3y3BMU4ing7JkV r60cg1JQWT/S8GSrPWI/aZfwCSIhHa/CgEieb6T4LB9iETd8inTPQaXoEn0d0nyd+eWQ 2k0Kh+sl5T2S7UlM3lJU5Cq29cZM+xn4NXpcbhkf91iLJjx8OYOg0uaRalQAPvYEHL5x 0WlA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UmTCdbv8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m11si1036490edl.424.2020.06.17.19.37.51; Wed, 17 Jun 2020 19:38:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=UmTCdbv8; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729249AbgFRBOA (ORCPT + 99 others); Wed, 17 Jun 2020 21:14:00 -0400 Received: from mail.kernel.org ([198.145.29.99]:41674 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728998AbgFRBMv (ORCPT ); Wed, 17 Jun 2020 21:12:51 -0400 Received: from sasha-vm.mshome.net (c-73-47-72-35.hsd1.nh.comcast.net [73.47.72.35]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id B90032193E; Thu, 18 Jun 2020 01:12:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1592442770; bh=hBTlY0hryKkINKQB2+qJdriuPpF+q/j4i6AwqxUADrc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UmTCdbv807QDp90jCkEWDToCBUZdtGzJCUCp4BwgQla9iBvcgJzcJ/LLURN5vglwP sWQ1k0TuzqFc4aJzQjkoGLM6ufwe4T1ZZvn55ACQ9iPO8Z2PizKXDhV54V4Hy1UZgU Zae3My8jPH4OfeLt/K6JXQob5xGFwByGP+NsKwuo= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Nicholas Piggin , Michael Ellerman , Sasha Levin , linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 5.7 218/388] powerpc/64s/exception: Fix machine check no-loss idle wakeup Date: Wed, 17 Jun 2020 21:05:15 -0400 Message-Id: <20200618010805.600873-218-sashal@kernel.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200618010805.600873-1-sashal@kernel.org> References: <20200618010805.600873-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nicholas Piggin [ Upstream commit 8a5054d8cbbe03c68dcb0957c291c942132e4101 ] The architecture allows for machine check exceptions to cause idle wakeups which resume at the 0x200 address which has to return via the idle wakeup code, but the early machine check handler is run first. The case of a no state-loss sleep is broken because the early handler uses non-volatile register r1 , which is needed for the wakeup protocol, but it is not restored. Fix this by loading r1 from the MCE exception frame before returning to the idle wakeup code. Also update the comment which has become stale since the idle rewrite in C. This crash was found and fix confirmed with a machine check injection test in qemu powernv model (which is not upstream in qemu yet). Fixes: 10d91611f426d ("powerpc/64s: Reimplement book3s idle code in C") Signed-off-by: Nicholas Piggin Signed-off-by: Michael Ellerman Link: https://lore.kernel.org/r/20200508043408.886394-2-npiggin@gmail.com Signed-off-by: Sasha Levin --- arch/powerpc/kernel/exceptions-64s.S | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index ebeebab74b56..463372046169 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -1225,17 +1225,19 @@ EXC_COMMON_BEGIN(machine_check_idle_common) bl machine_check_queue_event /* - * We have not used any non-volatile GPRs here, and as a rule - * most exception code including machine check does not. - * Therefore PACA_NAPSTATELOST does not need to be set. Idle - * wakeup will restore volatile registers. + * GPR-loss wakeups are relatively straightforward, because the + * idle sleep code has saved all non-volatile registers on its + * own stack, and r1 in PACAR1. * - * Load the original SRR1 into r3 for pnv_powersave_wakeup_mce. + * For no-loss wakeups the r1 and lr registers used by the + * early machine check handler have to be restored first. r2 is + * the kernel TOC, so no need to restore it. * * Then decrement MCE nesting after finishing with the stack. */ ld r3,_MSR(r1) ld r4,_LINK(r1) + ld r1,GPR1(r1) lhz r11,PACA_IN_MCE(r13) subi r11,r11,1 @@ -1244,7 +1246,7 @@ EXC_COMMON_BEGIN(machine_check_idle_common) mtlr r4 rlwinm r10,r3,47-31,30,31 cmpwi cr1,r10,2 - bltlr cr1 /* no state loss, return to idle caller */ + bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */ b idle_return_gpr_loss #endif -- 2.25.1