Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp3704290pxv; Mon, 28 Jun 2021 10:42:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxFfVUJHGtK3AB7aMmJdfWYTRMJBDIsQkfYE9xHROxBj7Huw7DKxrAJrk4teRBvai7YIsZK X-Received: by 2002:a05:6638:279:: with SMTP id x25mr672832jaq.33.1624902148985; Mon, 28 Jun 2021 10:42:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1624902148; cv=none; d=google.com; s=arc-20160816; b=LmUC2W5nnYFU81avv6eN+I817c/z+ekHBsdDvF56ZDWvTU1bGg5DQa0IGhR1JhKown ovb+qd4cY4Hp0ChrtUFn0/40w7QPz3befVDDV6hkbE2w31SXI5VC6a8ULlr5Ntx1/90U 5oeVeXmbI86lPAaahZ9kV3hQfVfYONW40sFdYVLcVYGtMVfUUpq6GcmvDaLR3DIvE6G/ Pcq8zIGYVKLQOIuDs3GI5TDORt0l4dwPjxUNA05ipdt0zjEyz6W8hm3m4X1h8ebrRHoO AQYyo5ykPEOXVXRdLn9j0fK8I8IDB0Mk0cGQzCxs1O2i0NnSerfcZ+whwJV/QjbU5eyk 4r4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=EpPyJ8QijCyb0nf5/ldxyOx9fkVZfevoOLdf+NZXVh0=; b=lTo7J0iQaIIc9ToiztKHZ1MGR9x0sy2KjvQYCVSoL70934kbhg6ocsHPs/lgskMFZ+ j1eZkd7okpjfK53PjPhKTRQF1wUy/MxYHLFPYbkzZ+/PSis0/we2bjpPqcM0ykKG2QtY xcMg2ocY52sn1MS7WoXwoiElmVIoC2CpbbPCvAVlS91JBrZZ6dflRbiEYFK0izh0ksIr MjblAXYuWzjpf/oGS8zFddK3x6k9ZfS69A4uFSglxe2HigxZfNSQ3EVrv47MpFCar4Mn SI35Cu2hGz0eDLyNBsa4WC5/ghJ2sWIUOvwwmKsN3UkeUixa4GdbXJqJjx2+9ULR2yuH WOPQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=lBN1LJMO; 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 u15si233106ill.15.2021.06.28.10.42.16; Mon, 28 Jun 2021 10:42:28 -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=k20201202 header.b=lBN1LJMO; 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 S233522AbhF1O04 (ORCPT + 99 others); Mon, 28 Jun 2021 10:26:56 -0400 Received: from mail.kernel.org ([198.145.29.99]:54392 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233348AbhF1OWF (ORCPT ); Mon, 28 Jun 2021 10:22:05 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id BB56261990; Mon, 28 Jun 2021 14:19:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624889969; bh=fXrnNMAxCvUGIEyD+v33JHz0RrQoK5Pm3Y9aqQylqb4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=lBN1LJMO9JcwDg011Pvmk5covZVUuV/fZwH0H/Zyl/hNrCnXhq83+gBjS6jPw047u vZLF8NO7yAGkdcV9TS7YKy9Bk56pG19N92mRVuo0EDcrdRFMV2LxqGOV658Lg6I1Lm Qr6qOtjl9jjuxHYUXQEp+TBztTtNJNowbtgVRIxQ7gF+DxjCbKlzgyQrFfr0il4y2+ oRlpEvL2Z93n+QMTWoIxbgz29Vc+MZiynnH1umunZ6oY1fJ0l/E+4qwp9HN8xyUH0q 3PcCdn5lDwYfItsQPgnkjggOYmZ8UtfA1ssdR5dV3QD9zyfcKXQ6gA2Oe9FCXLxieb sjmGl/ffYR6Vw== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Heiko Carstens , stable@kernel.org, Vasily Gorbik , Greg Kroah-Hartman Subject: [PATCH 5.12 070/110] s390/stack: fix possible register corruption with stack switch helper Date: Mon, 28 Jun 2021 10:17:48 -0400 Message-Id: <20210628141828.31757-71-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210628141828.31757-1-sashal@kernel.org> References: <20210628141828.31757-1-sashal@kernel.org> MIME-Version: 1.0 X-KernelTest-Patch: http://kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.12.14-rc1.gz X-KernelTest-Tree: git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git X-KernelTest-Branch: linux-5.12.y X-KernelTest-Patches: git://git.kernel.org/pub/scm/linux/kernel/git/stable/stable-queue.git X-KernelTest-Version: 5.12.14-rc1 X-KernelTest-Deadline: 2021-06-30T14:18+00:00 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Heiko Carstens commit 67147e96a332b56c7206238162771d82467f86c0 upstream. The CALL_ON_STACK macro is used to call a C function from inline assembly, and therefore must consider the C ABI, which says that only registers 6-13, and 15 are non-volatile (restored by the called function). The inline assembly incorrectly marks all registers used to pass parameters to the called function as read-only input operands, instead of operands that are read and written to. This might result in register corruption depending on usage, compiler, and compile options. Fix this by marking all operands used to pass parameters as read/write operands. To keep the code simple even register 6, if used, is marked as read-write operand. Fixes: ff340d2472ec ("s390: add stack switch helper") Cc: # 4.20 Reviewed-by: Vasily Gorbik Signed-off-by: Heiko Carstens Signed-off-by: Vasily Gorbik Signed-off-by: Greg Kroah-Hartman --- arch/s390/include/asm/stacktrace.h | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h index 2b543163d90a..76c6034428be 100644 --- a/arch/s390/include/asm/stacktrace.h +++ b/arch/s390/include/asm/stacktrace.h @@ -91,12 +91,16 @@ struct stack_frame { CALL_ARGS_4(arg1, arg2, arg3, arg4); \ register unsigned long r4 asm("6") = (unsigned long)(arg5) -#define CALL_FMT_0 "=&d" (r2) : -#define CALL_FMT_1 "+&d" (r2) : -#define CALL_FMT_2 CALL_FMT_1 "d" (r3), -#define CALL_FMT_3 CALL_FMT_2 "d" (r4), -#define CALL_FMT_4 CALL_FMT_3 "d" (r5), -#define CALL_FMT_5 CALL_FMT_4 "d" (r6), +/* + * To keep this simple mark register 2-6 as being changed (volatile) + * by the called function, even though register 6 is saved/nonvolatile. + */ +#define CALL_FMT_0 "=&d" (r2) +#define CALL_FMT_1 "+&d" (r2) +#define CALL_FMT_2 CALL_FMT_1, "+&d" (r3) +#define CALL_FMT_3 CALL_FMT_2, "+&d" (r4) +#define CALL_FMT_4 CALL_FMT_3, "+&d" (r5) +#define CALL_FMT_5 CALL_FMT_4, "+&d" (r6) #define CALL_CLOBBER_5 "0", "1", "14", "cc", "memory" #define CALL_CLOBBER_4 CALL_CLOBBER_5 @@ -118,7 +122,7 @@ struct stack_frame { " brasl 14,%[_fn]\n" \ " la 15,0(%[_prev])\n" \ : [_prev] "=&a" (prev), CALL_FMT_##nr \ - [_stack] "R" (stack), \ + : [_stack] "R" (stack), \ [_bc] "i" (offsetof(struct stack_frame, back_chain)), \ [_frame] "d" (frame), \ [_fn] "X" (fn) : CALL_CLOBBER_##nr); \ -- 2.30.2