linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Heiko Carstens <hca@linux.ibm.com>,
	Sven Schnelle <svens@linux.ibm.com>,
	Vasily Gorbik <gor@linux.ibm.com>,
	Sasha Levin <sashal@kernel.org>,
	linux-s390@vger.kernel.org
Subject: [PATCH AUTOSEL 5.4 50/51] s390: introduce proper type handling call_on_stack() macro
Date: Wed, 14 Jul 2021 15:45:12 -0400	[thread overview]
Message-ID: <20210714194513.54827-50-sashal@kernel.org> (raw)
In-Reply-To: <20210714194513.54827-1-sashal@kernel.org>

From: Heiko Carstens <hca@linux.ibm.com>

[ Upstream commit 41d71fe59cce41237f24f3b7bdc1b414069a34ed ]

The existing CALL_ON_STACK() macro allows for subtle bugs:

- There is no type checking of the function that is being called. That
  is: missing or too many arguments do not cause any compile error or
  warning. The same is true if the return type of the called function
  changes. This can lead to quite random bugs.

- Sign and zero extension of arguments is missing. Given that the s390
  C ABI requires that the caller of a function performs proper sign
  and zero extension this can also lead to subtle bugs.

- If arguments to the CALL_ON_STACK() macros contain functions calls
  register corruption can happen due to register asm constructs being
  used.

Therefore introduce a new call_on_stack() macro which is supposed to
fix all these problems.

Reviewed-by: Sven Schnelle <svens@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/s390/include/asm/stacktrace.h | 97 ++++++++++++++++++++++++++++++
 1 file changed, 97 insertions(+)

diff --git a/arch/s390/include/asm/stacktrace.h b/arch/s390/include/asm/stacktrace.h
index 6836532f8d1a..e192681f83e1 100644
--- a/arch/s390/include/asm/stacktrace.h
+++ b/arch/s390/include/asm/stacktrace.h
@@ -115,6 +115,103 @@ struct stack_frame {
 	r2;								\
 })
 
+#define CALL_LARGS_0(...)						\
+	long dummy = 0
+#define CALL_LARGS_1(t1, a1)						\
+	long arg1  = (long)(t1)(a1)
+#define CALL_LARGS_2(t1, a1, t2, a2)					\
+	CALL_LARGS_1(t1, a1);						\
+	long arg2 = (long)(t2)(a2)
+#define CALL_LARGS_3(t1, a1, t2, a2, t3, a3)				\
+	CALL_LARGS_2(t1, a1, t2, a2);					\
+	long arg3 = (long)(t3)(a3)
+#define CALL_LARGS_4(t1, a1, t2, a2, t3, a3, t4, a4)			\
+	CALL_LARGS_3(t1, a1, t2, a2, t3, a3);				\
+	long arg4  = (long)(t4)(a4)
+#define CALL_LARGS_5(t1, a1, t2, a2, t3, a3, t4, a4, t5, a5)		\
+	CALL_LARGS_4(t1, a1, t2, a2, t3, a3, t4, a4);			\
+	long arg5 = (long)(t5)(a5)
+
+#define CALL_REGS_0							\
+	register long r2 asm("2") = dummy
+#define CALL_REGS_1							\
+	register long r2 asm("2") = arg1
+#define CALL_REGS_2							\
+	CALL_REGS_1;							\
+	register long r3 asm("3") = arg2
+#define CALL_REGS_3							\
+	CALL_REGS_2;							\
+	register long r4 asm("4") = arg3
+#define CALL_REGS_4							\
+	CALL_REGS_3;							\
+	register long r5 asm("5") = arg4
+#define CALL_REGS_5							\
+	CALL_REGS_4;							\
+	register long r6 asm("6") = arg5
+
+#define CALL_TYPECHECK_0(...)
+#define CALL_TYPECHECK_1(t, a, ...)					\
+	typecheck(t, a)
+#define CALL_TYPECHECK_2(t, a, ...)					\
+	CALL_TYPECHECK_1(__VA_ARGS__);					\
+	typecheck(t, a)
+#define CALL_TYPECHECK_3(t, a, ...)					\
+	CALL_TYPECHECK_2(__VA_ARGS__);					\
+	typecheck(t, a)
+#define CALL_TYPECHECK_4(t, a, ...)					\
+	CALL_TYPECHECK_3(__VA_ARGS__);					\
+	typecheck(t, a)
+#define CALL_TYPECHECK_5(t, a, ...)					\
+	CALL_TYPECHECK_4(__VA_ARGS__);					\
+	typecheck(t, a)
+
+#define CALL_PARM_0(...) void
+#define CALL_PARM_1(t, a, ...) t
+#define CALL_PARM_2(t, a, ...) t, CALL_PARM_1(__VA_ARGS__)
+#define CALL_PARM_3(t, a, ...) t, CALL_PARM_2(__VA_ARGS__)
+#define CALL_PARM_4(t, a, ...) t, CALL_PARM_3(__VA_ARGS__)
+#define CALL_PARM_5(t, a, ...) t, CALL_PARM_4(__VA_ARGS__)
+#define CALL_PARM_6(t, a, ...) t, CALL_PARM_5(__VA_ARGS__)
+
+/*
+ * Use call_on_stack() to call a function switching to a specified
+ * stack. Proper sign and zero extension of function arguments is
+ * done. Usage:
+ *
+ * rc = call_on_stack(nr, stack, rettype, fn, t1, a1, t2, a2, ...)
+ *
+ * - nr specifies the number of function arguments of fn.
+ * - stack specifies the stack to be used.
+ * - fn is the function to be called.
+ * - rettype is the return type of fn.
+ * - t1, a1, ... are pairs, where t1 must match the type of the first
+ *   argument of fn, t2 the second, etc. a1 is the corresponding
+ *   first function argument (not name), etc.
+ */
+#define call_on_stack(nr, stack, rettype, fn, ...)			\
+({									\
+	rettype (*__fn)(CALL_PARM_##nr(__VA_ARGS__)) = fn;		\
+	unsigned long frame = current_frame_address();			\
+	unsigned long __stack = stack;					\
+	unsigned long prev;						\
+	CALL_LARGS_##nr(__VA_ARGS__);					\
+	CALL_REGS_##nr;							\
+									\
+	CALL_TYPECHECK_##nr(__VA_ARGS__);				\
+	asm volatile(							\
+		"	lgr	%[_prev],15\n"				\
+		"	lg	15,%[_stack]\n"				\
+		"	stg	%[_frame],%[_bc](15)\n"			\
+		"	brasl	14,%[_fn]\n"				\
+		"	lgr	15,%[_prev]\n"				\
+		: [_prev] "=&d" (prev), CALL_FMT_##nr			\
+		: [_stack] "R" (__stack),				\
+		  [_bc] "i" (offsetof(struct stack_frame, back_chain)),	\
+		  [_frame] "d" (frame),					\
+		  [_fn] "X" (__fn) : CALL_CLOBBER_##nr);		\
+	(rettype)r2;							\
+})
+
 #define CALL_ON_STACK_NORETURN(fn, stack)				\
 ({									\
 	asm volatile(							\
-- 
2.30.2


  parent reply	other threads:[~2021-07-14 19:53 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-14 19:44 [PATCH AUTOSEL 5.4 01/51] ARM: dts: gemini: rename mdio to the right name Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 02/51] ARM: dts: gemini: add device_type on pci Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 03/51] ARM: dts: rockchip: fix pinctrl sleep nodename for rk3036-kylin and rk3288 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 04/51] arm64: dts: rockchip: fix pinctrl sleep nodename for rk3399.dtsi Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 05/51] ARM: dts: rockchip: Fix the timer clocks order Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 06/51] ARM: dts: rockchip: Fix IOMMU nodes properties on rk322x Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 07/51] ARM: dts: rockchip: Fix power-controller node names for rk3066a Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 08/51] ARM: dts: rockchip: Fix power-controller node names for rk3188 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 09/51] ARM: dts: rockchip: Fix power-controller node names for rk3288 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 10/51] arm64: dts: rockchip: Fix power-controller node names for px30 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 11/51] arm64: dts: rockchip: Fix power-controller node names for rk3328 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 12/51] reset: ti-syscon: fix to_ti_syscon_reset_data macro Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 13/51] ARM: brcmstb: dts: fix NAND nodes names Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 14/51] ARM: Cygnus: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 15/51] ARM: NSP: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 16/51] ARM: dts: BCM63xx: Fix " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 17/51] ARM: dts: Hurricane 2: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 18/51] ARM: dts: imx25-pinfunc: Fix gpio function name for pads GPIO_[A-F] Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 19/51] ARM: dts: imx6: phyFLEX: Fix UART hardware flow control Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 20/51] ARM: imx: pm-imx5: Fix references to imx5_cpu_suspend_info Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 21/51] rtc: mxc_v2: add missing MODULE_DEVICE_TABLE Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 22/51] kbuild: sink stdout from cmd for silent build Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 23/51] ARM: dts: am335x: align GPIO hog names with dt-schema Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 24/51] ARM: dts: am437x: align gpio " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 25/51] ARM: dts: omap3: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 26/51] ARM: dts: omap5-board-common: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 27/51] ARM: dts: dra7x-evm: Align GPIO " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 28/51] ARM: dts: am57xx-cl-som-am57x: fix ti,no-reset-on-init flag for gpios Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 29/51] ARM: dts: am437x-gp-evm: " Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 30/51] ARM: dts: stm32: fix gpio-keys node on STM32 MCU boards Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 31/51] ARM: dts: stm32: fix RCC node name on stm32f429 MCU Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 32/51] ARM: dts: stm32: fix timer nodes on STM32 MCU to prevent warnings Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 33/51] arm64: dts: juno: Update SCPI nodes as per the YAML schema Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 34/51] ARM: dts: rockchip: fix supply properties in io-domains nodes Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 35/51] ARM: dts: stm32: fix i2c node name on stm32f746 to prevent warnings Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 36/51] ARM: dts: stm32: move stmmac axi config in ethernet node on stm32mp15 Sasha Levin
2021-07-14 19:44 ` [PATCH AUTOSEL 5.4 37/51] soc/tegra: fuse: Fix Tegra234-only builds Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 38/51] firmware: tegra: bpmp: " Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 39/51] arm64: dts: ls208xa: remove bus-num from dspi node Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 40/51] arm64: dts: imx8mq: assign PCIe clocks Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 41/51] thermal/core: Correct function name thermal_zone_device_unregister() Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 42/51] kbuild: mkcompile_h: consider timestamp if KBUILD_BUILD_TIMESTAMP is set Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 43/51] rtc: max77686: Do not enforce (incorrect) interrupt trigger type Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 44/51] scsi: aic7xxx: Fix unintentional sign extension issue on left shift of u8 Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 45/51] scsi: libsas: Add LUN number check in .slave_alloc callback Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 46/51] scsi: be2iscsi: Fix some missing space in some messages Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 47/51] scsi: libfc: Fix array index out of bound exception Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 48/51] scsi: qedf: Add check to synchronize abort and flush Sasha Levin
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 49/51] sched/fair: Fix CFS bandwidth hrtimer expiry type Sasha Levin
2021-07-14 19:45 ` Sasha Levin [this message]
2021-07-14 19:45 ` [PATCH AUTOSEL 5.4 51/51] cifs: prevent NULL deref in cifs_compose_mount_options() Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210714194513.54827-50-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=gor@linux.ibm.com \
    --cc=hca@linux.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=svens@linux.ibm.com \
    --subject='Re: [PATCH AUTOSEL 5.4 50/51] s390: introduce proper type handling call_on_stack() macro' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).