Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp5585470img; Wed, 27 Mar 2019 11:10:24 -0700 (PDT) X-Google-Smtp-Source: APXvYqxgidqpIokDbKivftD5sow549+czbkDL+NayT84dE5i8R1Yc1t8Pw5lF6IoXM2tEYnFazRm X-Received: by 2002:a63:4144:: with SMTP id o65mr35874976pga.241.1553710224577; Wed, 27 Mar 2019 11:10:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553710224; cv=none; d=google.com; s=arc-20160816; b=q1cd3nC2diFVu6pNzULCydyFqznjGmjTyj7774P8sOm30V60uSV8uU2jJOPJzyeJ0z ohPdt3VZz5VrnGz5brC6Eta6R/pJEywBETOySm0VbNRkGD3gfu7v0tWpXJn7zu8nvpyl pVaA2hQWbkTzkTWN8fOwd4FtQP+NhxeyiVuwlEhGevUG7TP+Or7We8k5EMOSwpoUfM3l 23FUJ5+OWwz3tJeKvAyGrwaIjDyf+fdB8rxVUmMk7BDKRgRiaDn75b5pD8yvSFB06OHM OkBz+Qc4DkVscpPOqNtXI48eALiE9rVA9eXKj/dcWaCvUQkVA5jmEt4TiPDhJFGXxqQO bgDA== 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=aUkZQtcELgvqEUzQQ/WP+f2PA+4Ityv1B64JMbnYuq8=; b=FuVNX6PORsrXefiOGKhcPhbp87UHtihID8q/yx0hkBWKFu9hhCvrk9Cd9CGbKwaUaT lxhbB/ONjirUNYRZci3tqqDAPEJ88z88s0SLfM0u3aqXXE+Lsyw10VE4UI9Oxl1ON64q /F3DhqkdbK8Sy+aEkZttecri8LL33aquNyKpgWs0kvYOjQFAy27SDaZOA/xJycDvmqMT nbr08Q3OlCo2T4OWdiic467ElYQgKs9UIg08D31/t2Af03s/Hyw74kKN4k2Si8dXDoCC BC+UV7b6uAgii64/6IUWEPjbTXTJH7kKy+mSEKczJ7GHX7rKdHknB0ubTYtNbEnGegqz zUhA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=nsxeekbQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d18si5302621pgo.525.2019.03.27.11.10.08; Wed, 27 Mar 2019 11:10:24 -0700 (PDT) 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=nsxeekbQ; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388384AbfC0SIm (ORCPT + 99 others); Wed, 27 Mar 2019 14:08:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:50408 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2388356AbfC0SIf (ORCPT ); Wed, 27 Mar 2019 14:08:35 -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 7BF812183F; Wed, 27 Mar 2019 18:08:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1553710114; bh=wiBNtt7w3Hcq7fxB52lMT81otl/nnJhqu4dHJTQJCSA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nsxeekbQdryYNBtZp031yBL48SFlDrlP7ncJND6Z9H3dwI/rjIA1NtmtYxLC4KFtZ ctoD3wHISodPlD65RgZUM7VXsOxNHh4mnhdbxxcJEdoIqU6I7X011SZueHAU4DB7xF 0LlEyXCCeEs3glkGqqyf3jfkYvIpKEhoc0Q0G7ew= From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Nicolai Stange , Joe Lawrence , Michael Ellerman , Sasha Levin , linuxppc-dev@lists.ozlabs.org Subject: [PATCH AUTOSEL 5.0 202/262] powerpc/64s: Clear on-stack exception marker upon exception return Date: Wed, 27 Mar 2019 14:00:57 -0400 Message-Id: <20190327180158.10245-202-sashal@kernel.org> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190327180158.10245-1-sashal@kernel.org> References: <20190327180158.10245-1-sashal@kernel.org> MIME-Version: 1.0 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: Nicolai Stange [ Upstream commit eddd0b332304d554ad6243942f87c2fcea98c56b ] The ppc64 specific implementation of the reliable stacktracer, save_stack_trace_tsk_reliable(), bails out and reports an "unreliable trace" whenever it finds an exception frame on the stack. Stack frames are classified as exception frames if the STACK_FRAME_REGS_MARKER magic, as written by exception prologues, is found at a particular location. However, as observed by Joe Lawrence, it is possible in practice that non-exception stack frames can alias with prior exception frames and thus, that the reliable stacktracer can find a stale STACK_FRAME_REGS_MARKER on the stack. It in turn falsely reports an unreliable stacktrace and blocks any live patching transition to finish. Said condition lasts until the stack frame is overwritten/initialized by function call or other means. In principle, we could mitigate this by making the exception frame classification condition in save_stack_trace_tsk_reliable() stronger: in addition to testing for STACK_FRAME_REGS_MARKER, we could also take into account that for all exceptions executing on the kernel stack - their stack frames's backlink pointers always match what is saved in their pt_regs instance's ->gpr[1] slot and that - their exception frame size equals STACK_INT_FRAME_SIZE, a value uncommonly large for non-exception frames. However, while these are currently true, relying on them would make the reliable stacktrace implementation more sensitive towards future changes in the exception entry code. Note that false negatives, i.e. not detecting exception frames, would silently break the live patching consistency model. Furthermore, certain other places (diagnostic stacktraces, perf, xmon) rely on STACK_FRAME_REGS_MARKER as well. Make the exception exit code clear the on-stack STACK_FRAME_REGS_MARKER for those exceptions running on the "normal" kernel stack and returning to kernelspace: because the topmost frame is ignored by the reliable stack tracer anyway, returns to userspace don't need to take care of clearing the marker. Furthermore, as I don't have the ability to test this on Book 3E or 32 bits, limit the change to Book 3S and 64 bits. Fixes: df78d3f61480 ("powerpc/livepatch: Implement reliable stack tracing for the consistency model") Reported-by: Joe Lawrence Signed-off-by: Nicolai Stange Signed-off-by: Joe Lawrence Signed-off-by: Michael Ellerman Signed-off-by: Sasha Levin --- arch/powerpc/kernel/entry_64.S | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index 435927f549c4..a2c168b395d2 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S @@ -1002,6 +1002,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) ld r2,_NIP(r1) mtspr SPRN_SRR0,r2 + /* + * Leaving a stale exception_marker on the stack can confuse + * the reliable stack unwinder later on. Clear it. + */ + li r2,0 + std r2,STACK_FRAME_OVERHEAD-16(r1) + ld r0,GPR0(r1) ld r2,GPR2(r1) ld r3,GPR3(r1) -- 2.19.1