linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/4] Disable compat cruft on ppc64le v3
@ 2019-08-28 16:43 Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 1/4] powerpc: make llseek 32bit-only Michal Suchanek
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-28 16:43 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Michal Suchanek, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Christophe Leroy, Nicholas Piggin,
	Hari Bathini, Joel Stanley, Andrew Donnellan, Firoz Khan,
	Breno Leitao, Russell Currey, Nicolai Stange, Michael Neuling,
	Eric W. Biederman, Thomas Gleixner, Arnd Bergmann,
	Geert Uytterhoeven, Heiko Carstens, Christian Brauner,
	David Howells, Greg Kroah-Hartman, Allison Randal,
	David Hildenbrand, linux-kernel

Less code means less bugs so add a knob to skip the compat stuff.

This is tested on ppc64le top of

https://patchwork.ozlabs.org/cover/1153556/

Changes in v2: saner CONFIG_COMPAT ifdefs
Changes in v3:
 - change llseek to 32bit instead of builing it unconditionally in fs
 - clanup the makefile conditionals
 - remove some ifdefs or convert to IS_DEFINED where possible

Michal Suchanek (4):
  powerpc: make llseek 32bit-only.
  powerpc: move common register copy functions from signal_32.c to
    signal.c
  powerpc/64: make buildable without CONFIG_COMPAT
  powerpc/64: Make COMPAT user-selectable disable on littleendian by
    default.

 arch/powerpc/Kconfig                     |   5 +-
 arch/powerpc/kernel/Makefile             |   9 +-
 arch/powerpc/kernel/entry_64.S           |   2 +
 arch/powerpc/kernel/signal.c             | 143 ++++++++++++++++++++++-
 arch/powerpc/kernel/signal_32.c          | 140 ----------------------
 arch/powerpc/kernel/syscall_64.c         |   2 +-
 arch/powerpc/kernel/syscalls/syscall.tbl |   2 +-
 arch/powerpc/kernel/vdso.c               |   5 +-
 arch/powerpc/perf/callchain.c            |  13 ++-
 9 files changed, 165 insertions(+), 156 deletions(-)

-- 
2.22.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 1/4] powerpc: make llseek 32bit-only.
  2019-08-28 16:43 [PATCH v3 0/4] Disable compat cruft on ppc64le v3 Michal Suchanek
@ 2019-08-28 16:43 ` Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 2/4] powerpc: move common register copy functions from signal_32.c to signal.c Michal Suchanek
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-28 16:43 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Michal Suchanek, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Christophe Leroy, Nicholas Piggin,
	Hari Bathini, Joel Stanley, Andrew Donnellan, Firoz Khan,
	Breno Leitao, Russell Currey, Nicolai Stange, Michael Neuling,
	Eric W. Biederman, Thomas Gleixner, Arnd Bergmann,
	Geert Uytterhoeven, Heiko Carstens, Christian Brauner,
	David Howells, Greg Kroah-Hartman, Allison Randal,
	David Hildenbrand, linux-kernel

Fixes: aff850393200 ("powerpc: add system call table generation support")

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
 arch/powerpc/kernel/syscalls/syscall.tbl | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
index 010b9f445586..53e427606f6c 100644
--- a/arch/powerpc/kernel/syscalls/syscall.tbl
+++ b/arch/powerpc/kernel/syscalls/syscall.tbl
@@ -188,7 +188,7 @@
 137	common	afs_syscall			sys_ni_syscall
 138	common	setfsuid			sys_setfsuid
 139	common	setfsgid			sys_setfsgid
-140	common	_llseek				sys_llseek
+140	32	_llseek				sys_llseek
 141	common	getdents			sys_getdents			compat_sys_getdents
 142	common	_newselect			sys_select			compat_sys_select
 143	common	flock				sys_flock
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 2/4] powerpc: move common register copy functions from signal_32.c to signal.c
  2019-08-28 16:43 [PATCH v3 0/4] Disable compat cruft on ppc64le v3 Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 1/4] powerpc: make llseek 32bit-only Michal Suchanek
@ 2019-08-28 16:43 ` Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 4/4] powerpc/64: Make COMPAT user-selectable disabled on littleendian by default Michal Suchanek
  3 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-28 16:43 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Michal Suchanek, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Christophe Leroy, Nicholas Piggin,
	Hari Bathini, Joel Stanley, Andrew Donnellan, Firoz Khan,
	Breno Leitao, Russell Currey, Nicolai Stange, Michael Neuling,
	Eric W. Biederman, Thomas Gleixner, Arnd Bergmann,
	Geert Uytterhoeven, Heiko Carstens, Christian Brauner,
	David Howells, Greg Kroah-Hartman, Allison Randal,
	David Hildenbrand, linux-kernel

These functions are required for 64bit as well.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
 arch/powerpc/kernel/signal.c    | 141 ++++++++++++++++++++++++++++++++
 arch/powerpc/kernel/signal_32.c | 140 -------------------------------
 2 files changed, 141 insertions(+), 140 deletions(-)

diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
index e6c30cee6abf..60436432399f 100644
--- a/arch/powerpc/kernel/signal.c
+++ b/arch/powerpc/kernel/signal.c
@@ -18,12 +18,153 @@
 #include <linux/syscalls.h>
 #include <asm/hw_breakpoint.h>
 #include <linux/uaccess.h>
+#include <asm/switch_to.h>
 #include <asm/unistd.h>
 #include <asm/debug.h>
 #include <asm/tm.h>
 
 #include "signal.h"
 
+#ifdef CONFIG_VSX
+unsigned long copy_fpr_to_user(void __user *to,
+			       struct task_struct *task)
+{
+	u64 buf[ELF_NFPREG];
+	int i;
+
+	/* save FPR copy to local buffer then write to the thread_struct */
+	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+		buf[i] = task->thread.TS_FPR(i);
+	buf[i] = task->thread.fp_state.fpscr;
+	return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_fpr_from_user(struct task_struct *task,
+				 void __user *from)
+{
+	u64 buf[ELF_NFPREG];
+	int i;
+
+	if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+		return 1;
+	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+		task->thread.TS_FPR(i) = buf[i];
+	task->thread.fp_state.fpscr = buf[i];
+
+	return 0;
+}
+
+unsigned long copy_vsx_to_user(void __user *to,
+			       struct task_struct *task)
+{
+	u64 buf[ELF_NVSRHALFREG];
+	int i;
+
+	/* save FPR copy to local buffer then write to the thread_struct */
+	for (i = 0; i < ELF_NVSRHALFREG; i++)
+		buf[i] = task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
+	return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
+}
+
+unsigned long copy_vsx_from_user(struct task_struct *task,
+				 void __user *from)
+{
+	u64 buf[ELF_NVSRHALFREG];
+	int i;
+
+	if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
+		return 1;
+	for (i = 0; i < ELF_NVSRHALFREG ; i++)
+		task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
+	return 0;
+}
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+unsigned long copy_ckfpr_to_user(void __user *to,
+				  struct task_struct *task)
+{
+	u64 buf[ELF_NFPREG];
+	int i;
+
+	/* save FPR copy to local buffer then write to the thread_struct */
+	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+		buf[i] = task->thread.TS_CKFPR(i);
+	buf[i] = task->thread.ckfp_state.fpscr;
+	return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
+}
+
+unsigned long copy_ckfpr_from_user(struct task_struct *task,
+					  void __user *from)
+{
+	u64 buf[ELF_NFPREG];
+	int i;
+
+	if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
+		return 1;
+	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
+		task->thread.TS_CKFPR(i) = buf[i];
+	task->thread.ckfp_state.fpscr = buf[i];
+
+	return 0;
+}
+
+unsigned long copy_ckvsx_to_user(void __user *to,
+				  struct task_struct *task)
+{
+	u64 buf[ELF_NVSRHALFREG];
+	int i;
+
+	/* save FPR copy to local buffer then write to the thread_struct */
+	for (i = 0; i < ELF_NVSRHALFREG; i++)
+		buf[i] = task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
+	return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
+}
+
+unsigned long copy_ckvsx_from_user(struct task_struct *task,
+					  void __user *from)
+{
+	u64 buf[ELF_NVSRHALFREG];
+	int i;
+
+	if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
+		return 1;
+	for (i = 0; i < ELF_NVSRHALFREG ; i++)
+		task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
+	return 0;
+}
+#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
+#else
+inline unsigned long copy_fpr_to_user(void __user *to,
+				      struct task_struct *task)
+{
+	return __copy_to_user(to, task->thread.fp_state.fpr,
+			      ELF_NFPREG * sizeof(double));
+}
+
+inline unsigned long copy_fpr_from_user(struct task_struct *task,
+					void __user *from)
+{
+	return __copy_from_user(task->thread.fp_state.fpr, from,
+			      ELF_NFPREG * sizeof(double));
+}
+
+#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
+inline unsigned long copy_ckfpr_to_user(void __user *to,
+					 struct task_struct *task)
+{
+	return __copy_to_user(to, task->thread.ckfp_state.fpr,
+			      ELF_NFPREG * sizeof(double));
+}
+
+inline unsigned long copy_ckfpr_from_user(struct task_struct *task,
+						 void __user *from)
+{
+	return __copy_from_user(task->thread.ckfp_state.fpr, from,
+				ELF_NFPREG * sizeof(double));
+}
+#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
+#endif
+
 /* Log an error when sending an unhandled signal to a process. Controlled
  * through debug.exception-trace sysctl.
  */
diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
index 98600b276f76..c93c937ea568 100644
--- a/arch/powerpc/kernel/signal_32.c
+++ b/arch/powerpc/kernel/signal_32.c
@@ -235,146 +235,6 @@ struct rt_sigframe {
 	int			abigap[56];
 };
 
-#ifdef CONFIG_VSX
-unsigned long copy_fpr_to_user(void __user *to,
-			       struct task_struct *task)
-{
-	u64 buf[ELF_NFPREG];
-	int i;
-
-	/* save FPR copy to local buffer then write to the thread_struct */
-	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-		buf[i] = task->thread.TS_FPR(i);
-	buf[i] = task->thread.fp_state.fpscr;
-	return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
-}
-
-unsigned long copy_fpr_from_user(struct task_struct *task,
-				 void __user *from)
-{
-	u64 buf[ELF_NFPREG];
-	int i;
-
-	if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
-		return 1;
-	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-		task->thread.TS_FPR(i) = buf[i];
-	task->thread.fp_state.fpscr = buf[i];
-
-	return 0;
-}
-
-unsigned long copy_vsx_to_user(void __user *to,
-			       struct task_struct *task)
-{
-	u64 buf[ELF_NVSRHALFREG];
-	int i;
-
-	/* save FPR copy to local buffer then write to the thread_struct */
-	for (i = 0; i < ELF_NVSRHALFREG; i++)
-		buf[i] = task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET];
-	return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
-}
-
-unsigned long copy_vsx_from_user(struct task_struct *task,
-				 void __user *from)
-{
-	u64 buf[ELF_NVSRHALFREG];
-	int i;
-
-	if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
-		return 1;
-	for (i = 0; i < ELF_NVSRHALFREG ; i++)
-		task->thread.fp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
-	return 0;
-}
-
-#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-unsigned long copy_ckfpr_to_user(void __user *to,
-				  struct task_struct *task)
-{
-	u64 buf[ELF_NFPREG];
-	int i;
-
-	/* save FPR copy to local buffer then write to the thread_struct */
-	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-		buf[i] = task->thread.TS_CKFPR(i);
-	buf[i] = task->thread.ckfp_state.fpscr;
-	return __copy_to_user(to, buf, ELF_NFPREG * sizeof(double));
-}
-
-unsigned long copy_ckfpr_from_user(struct task_struct *task,
-					  void __user *from)
-{
-	u64 buf[ELF_NFPREG];
-	int i;
-
-	if (__copy_from_user(buf, from, ELF_NFPREG * sizeof(double)))
-		return 1;
-	for (i = 0; i < (ELF_NFPREG - 1) ; i++)
-		task->thread.TS_CKFPR(i) = buf[i];
-	task->thread.ckfp_state.fpscr = buf[i];
-
-	return 0;
-}
-
-unsigned long copy_ckvsx_to_user(void __user *to,
-				  struct task_struct *task)
-{
-	u64 buf[ELF_NVSRHALFREG];
-	int i;
-
-	/* save FPR copy to local buffer then write to the thread_struct */
-	for (i = 0; i < ELF_NVSRHALFREG; i++)
-		buf[i] = task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
-	return __copy_to_user(to, buf, ELF_NVSRHALFREG * sizeof(double));
-}
-
-unsigned long copy_ckvsx_from_user(struct task_struct *task,
-					  void __user *from)
-{
-	u64 buf[ELF_NVSRHALFREG];
-	int i;
-
-	if (__copy_from_user(buf, from, ELF_NVSRHALFREG * sizeof(double)))
-		return 1;
-	for (i = 0; i < ELF_NVSRHALFREG ; i++)
-		task->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
-	return 0;
-}
-#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
-#else
-inline unsigned long copy_fpr_to_user(void __user *to,
-				      struct task_struct *task)
-{
-	return __copy_to_user(to, task->thread.fp_state.fpr,
-			      ELF_NFPREG * sizeof(double));
-}
-
-inline unsigned long copy_fpr_from_user(struct task_struct *task,
-					void __user *from)
-{
-	return __copy_from_user(task->thread.fp_state.fpr, from,
-			      ELF_NFPREG * sizeof(double));
-}
-
-#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
-inline unsigned long copy_ckfpr_to_user(void __user *to,
-					 struct task_struct *task)
-{
-	return __copy_to_user(to, task->thread.ckfp_state.fpr,
-			      ELF_NFPREG * sizeof(double));
-}
-
-inline unsigned long copy_ckfpr_from_user(struct task_struct *task,
-						 void __user *from)
-{
-	return __copy_from_user(task->thread.ckfp_state.fpr, from,
-				ELF_NFPREG * sizeof(double));
-}
-#endif /* CONFIG_PPC_TRANSACTIONAL_MEM */
-#endif
-
 /*
  * Save the current user registers on the user stack.
  * We only save the altivec/spe registers if the process has used
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-28 16:43 [PATCH v3 0/4] Disable compat cruft on ppc64le v3 Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 1/4] powerpc: make llseek 32bit-only Michal Suchanek
  2019-08-28 16:43 ` [PATCH v3 2/4] powerpc: move common register copy functions from signal_32.c to signal.c Michal Suchanek
@ 2019-08-28 16:43 ` Michal Suchanek
  2019-08-29  6:46   ` Christoph Hellwig
  2019-08-28 16:43 ` [PATCH v3 4/4] powerpc/64: Make COMPAT user-selectable disabled on littleendian by default Michal Suchanek
  3 siblings, 1 reply; 10+ messages in thread
From: Michal Suchanek @ 2019-08-28 16:43 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Michal Suchanek, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Christophe Leroy, Nicholas Piggin,
	Hari Bathini, Joel Stanley, Andrew Donnellan, Firoz Khan,
	Breno Leitao, Russell Currey, Nicolai Stange, Michael Neuling,
	Eric W. Biederman, Thomas Gleixner, Arnd Bergmann,
	Geert Uytterhoeven, Heiko Carstens, Christian Brauner,
	David Howells, Greg Kroah-Hartman, Allison Randal,
	David Hildenbrand, linux-kernel

There are numerous references to 32bit functions in generic and 64bit
code so ifdef them out.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v2:
- fix 32bit ifdef condition in signal.c
- simplify the compat ifdef condition in vdso.c - 64bit is redundant
- simplify the compat ifdef condition in callchain.c - 64bit is redundant
v3:
- use IS_ENABLED and maybe_unused where possible
- do not ifdef declarations
- clean up Makefile
---
 arch/powerpc/kernel/Makefile     |  9 +++++----
 arch/powerpc/kernel/entry_64.S   |  2 ++
 arch/powerpc/kernel/signal.c     |  2 +-
 arch/powerpc/kernel/syscall_64.c |  2 +-
 arch/powerpc/kernel/vdso.c       |  5 ++---
 arch/powerpc/perf/callchain.c    | 13 +++++++++----
 6 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 1d646a94d96c..de1fbb21daf5 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -44,16 +44,17 @@ CFLAGS_btext.o += -DDISABLE_BRANCH_PROFILING
 endif
 
 obj-y				:= cputable.o ptrace.o syscalls.o \
-				   irq.o align.o signal_32.o pmc.o vdso.o \
+				   irq.o align.o signal_$(BITS).o pmc.o vdso.o \
 				   process.o systbl.o idle.o \
 				   signal.o sysfs.o cacheinfo.o time.o \
 				   prom.o traps.o setup-common.o \
 				   udbg.o misc.o io.o misc_$(BITS).o \
 				   of_platform.o prom_parse.o
-obj-$(CONFIG_PPC64)		+= setup_64.o sys_ppc32.o \
-				   signal_64.o ptrace32.o \
-				   paca.o nvram_64.o firmware.o \
+obj-$(CONFIG_PPC64)		+= setup_64.o paca.o nvram_64.o firmware.o \
 				   syscall_64.o
+ifdef CONFIG_COMPAT
+obj-y				+= sys_ppc32.o ptrace32.o signal_32.o
+endif
 obj-$(CONFIG_VDSO32)		+= vdso32/
 obj-$(CONFIG_PPC_WATCHDOG)	+= watchdog.o
 obj-$(CONFIG_HAVE_HW_BREAKPOINT)	+= hw_breakpoint.o
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index 2ec825a85f5b..a2dbf216f607 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -51,8 +51,10 @@
 SYS_CALL_TABLE:
 	.tc sys_call_table[TC],sys_call_table
 
+#ifdef CONFIG_COMPAT
 COMPAT_SYS_CALL_TABLE:
 	.tc compat_sys_call_table[TC],compat_sys_call_table
+#endif
 
 /* This value is used to mark exception frames on the stack. */
 exception_marker:
diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
index 60436432399f..73d0f53ffc1a 100644
--- a/arch/powerpc/kernel/signal.c
+++ b/arch/powerpc/kernel/signal.c
@@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
 
 	rseq_signal_deliver(&ksig, tsk->thread.regs);
 
-	if (is32) {
+	if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {
         	if (ksig.ka.sa.sa_flags & SA_SIGINFO)
 			ret = handle_rt_signal32(&ksig, oldset, tsk);
 		else
diff --git a/arch/powerpc/kernel/syscall_64.c b/arch/powerpc/kernel/syscall_64.c
index 98ed970796d5..bdd9dcf156f8 100644
--- a/arch/powerpc/kernel/syscall_64.c
+++ b/arch/powerpc/kernel/syscall_64.c
@@ -100,7 +100,7 @@ long system_call_exception(long r3, long r4, long r5, long r6, long r7, long r8,
 	/* May be faster to do array_index_nospec? */
 	barrier_nospec();
 
-	if (unlikely(ti_flags & _TIF_32BIT)) {
+	if (IS_ENABLED(CONFIG_COMPAT) && unlikely(ti_flags & _TIF_32BIT)) {
 		f = (void *)compat_sys_call_table[r0];
 
 		r3 &= 0x00000000ffffffffULL;
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index d60598113a9f..6d4a077f74d6 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -667,9 +667,7 @@ static void __init vdso_setup_syscall_map(void)
 {
 	unsigned int i;
 	extern unsigned long *sys_call_table;
-#ifdef CONFIG_PPC64
 	extern unsigned long *compat_sys_call_table;
-#endif
 	extern unsigned long sys_ni_syscall;
 
 
@@ -678,7 +676,8 @@ static void __init vdso_setup_syscall_map(void)
 		if (sys_call_table[i] != sys_ni_syscall)
 			vdso_data->syscall_map_64[i >> 5] |=
 				0x80000000UL >> (i & 0x1f);
-		if (compat_sys_call_table[i] != sys_ni_syscall)
+		if (IS_ENABLED(CONFIG_COMPAT) &&
+		    compat_sys_call_table[i] != sys_ni_syscall)
 			vdso_data->syscall_map_32[i >> 5] |=
 				0x80000000UL >> (i & 0x1f);
 #else /* CONFIG_PPC64 */
diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c
index c84bbd4298a0..d4e6bf22e0cc 100644
--- a/arch/powerpc/perf/callchain.c
+++ b/arch/powerpc/perf/callchain.c
@@ -15,7 +15,7 @@
 #include <asm/sigcontext.h>
 #include <asm/ucontext.h>
 #include <asm/vdso.h>
-#ifdef CONFIG_PPC64
+#ifdef CONFIG_COMPAT
 #include "../kernel/ppc32.h"
 #endif
 #include <asm/pte-walk.h>
@@ -165,6 +165,7 @@ static int read_user_stack_64(unsigned long __user *ptr, unsigned long *ret)
 	return read_user_stack_slow(ptr, ret, 8);
 }
 
+__maybe_unused
 static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
 {
 	if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||
@@ -341,6 +342,7 @@ static inline int valid_user_sp(unsigned long sp, int is_64)
 
 #endif /* CONFIG_PPC64 */
 
+#if defined(CONFIG_PPC32) || defined(CONFIG_COMPAT)
 /*
  * Layout for non-RT signal frames
  */
@@ -482,12 +484,15 @@ static void perf_callchain_user_32(struct perf_callchain_entry_ctx *entry,
 		sp = next_sp;
 	}
 }
+#endif /* 32bit */
 
 void
 perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
 {
-	if (current_is_64bit())
-		perf_callchain_user_64(entry, regs);
-	else
+#if defined(CONFIG_PPC32) || defined(CONFIG_COMPAT)
+	if (!current_is_64bit())
 		perf_callchain_user_32(entry, regs);
+	else
+#endif
+		perf_callchain_user_64(entry, regs);
 }
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH v3 4/4] powerpc/64: Make COMPAT user-selectable disabled on littleendian by default.
  2019-08-28 16:43 [PATCH v3 0/4] Disable compat cruft on ppc64le v3 Michal Suchanek
                   ` (2 preceding siblings ...)
  2019-08-28 16:43 ` [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT Michal Suchanek
@ 2019-08-28 16:43 ` Michal Suchanek
  3 siblings, 0 replies; 10+ messages in thread
From: Michal Suchanek @ 2019-08-28 16:43 UTC (permalink / raw)
  To: linuxppc-dev
  Cc: Michal Suchanek, Benjamin Herrenschmidt, Paul Mackerras,
	Michael Ellerman, Christophe Leroy, Nicholas Piggin,
	Hari Bathini, Joel Stanley, Andrew Donnellan, Firoz Khan,
	Breno Leitao, Russell Currey, Nicolai Stange, Michael Neuling,
	Eric W. Biederman, Thomas Gleixner, Arnd Bergmann,
	Geert Uytterhoeven, Heiko Carstens, Christian Brauner,
	David Howells, Greg Kroah-Hartman, Allison Randal,
	David Hildenbrand, linux-kernel

On bigendian ppc64 it is common to have 32bit legacy binaries but much
less so on littleendian.

Signed-off-by: Michal Suchanek <msuchanek@suse.de>
---
v3: make configurable
---
 arch/powerpc/Kconfig | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
index 5bab0bb6b833..b0339e892329 100644
--- a/arch/powerpc/Kconfig
+++ b/arch/powerpc/Kconfig
@@ -264,8 +264,9 @@ config PANIC_TIMEOUT
 	default 180
 
 config COMPAT
-	bool
-	default y if PPC64
+	bool "Enable support for 32bit binaries"
+	depends on PPC64
+	default y if !CPU_LITTLE_ENDIAN
 	select COMPAT_BINFMT_ELF
 	select ARCH_WANT_OLD_COMPAT_IPC
 	select COMPAT_OLD_SIGACTION
-- 
2.22.0


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-28 16:43 ` [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT Michal Suchanek
@ 2019-08-29  6:46   ` Christoph Hellwig
  2019-08-29  8:01     ` Arnd Bergmann
  2019-08-29 10:01     ` Michal Suchánek
  0 siblings, 2 replies; 10+ messages in thread
From: Christoph Hellwig @ 2019-08-29  6:46 UTC (permalink / raw)
  To: Michal Suchanek
  Cc: linuxppc-dev, David Hildenbrand, Heiko Carstens, David Howells,
	Paul Mackerras, Breno Leitao, Michael Neuling, Nicolai Stange,
	Allison Randal, Geert Uytterhoeven, Joel Stanley, Firoz Khan,
	Arnd Bergmann, Nicholas Piggin, Thomas Gleixner,
	Christian Brauner, Greg Kroah-Hartman, linux-kernel,
	Eric W. Biederman, Andrew Donnellan, Hari Bathini

On Wed, Aug 28, 2019 at 06:43:50PM +0200, Michal Suchanek wrote:
> +ifdef CONFIG_COMPAT
> +obj-y				+= sys_ppc32.o ptrace32.o signal_32.o
> +endif

This should be:

obj-$(CONFIG_COMPAT)		+= sys_ppc32.o ptrace32.o signal_32.o

>  /* This value is used to mark exception frames on the stack. */
>  exception_marker:
> diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
> index 60436432399f..73d0f53ffc1a 100644
> --- a/arch/powerpc/kernel/signal.c
> +++ b/arch/powerpc/kernel/signal.c
> @@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
>  
>  	rseq_signal_deliver(&ksig, tsk->thread.regs);
>  
> -	if (is32) {
> +	if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {

I think we should fix the is_32bit_task definitions instead so that
callers don't need this mess.  I'd suggest something like:

#ifdef CONFIG_COMPAT
#define is_32bit_task()		test_thread_flag(TIF_32BIT)
#else
#define is_32bit_task()		IS_ENABLED(CONFIG_PPC32)
#endif

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-29  6:46   ` Christoph Hellwig
@ 2019-08-29  8:01     ` Arnd Bergmann
  2019-08-29  8:38       ` Christophe Leroy
  2019-08-29 10:01     ` Michal Suchánek
  1 sibling, 1 reply; 10+ messages in thread
From: Arnd Bergmann @ 2019-08-29  8:01 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michal Suchanek, linuxppc-dev, David Hildenbrand, Heiko Carstens,
	David Howells, Paul Mackerras, Breno Leitao, Michael Neuling,
	Nicolai Stange, Allison Randal, Geert Uytterhoeven, Joel Stanley,
	Firoz Khan, Nicholas Piggin, Thomas Gleixner, Christian Brauner,
	Greg Kroah-Hartman, Linux Kernel Mailing List, Eric W. Biederman,
	Andrew Donnellan, Hari Bathini

On Thu, Aug 29, 2019 at 8:46 AM Christoph Hellwig <hch@infradead.org> wrote:

> > @@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
> >
> >       rseq_signal_deliver(&ksig, tsk->thread.regs);
> >
> > -     if (is32) {
> > +     if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {
>
> I think we should fix the is_32bit_task definitions instead so that
> callers don't need this mess.  I'd suggest something like:
>
> #ifdef CONFIG_COMPAT
> #define is_32bit_task()         test_thread_flag(TIF_32BIT)
> #else
> #define is_32bit_task()         IS_ENABLED(CONFIG_PPC32)
> #endif

Are there actually any (correct) uses of is_32bit_task() outside of
#ifdef CONFIG_PPC64?

I suspect most if not all could be changed to the generic
in_compat_syscall() that we use outside of architecture specific
code.

       Arnd

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-29  8:01     ` Arnd Bergmann
@ 2019-08-29  8:38       ` Christophe Leroy
  2019-08-29  8:49         ` Arnd Bergmann
  0 siblings, 1 reply; 10+ messages in thread
From: Christophe Leroy @ 2019-08-29  8:38 UTC (permalink / raw)
  To: Arnd Bergmann, Christoph Hellwig
  Cc: Michael Neuling, Andrew Donnellan, Nicolai Stange,
	David Hildenbrand, Greg Kroah-Hartman, Heiko Carstens,
	Linux Kernel Mailing List, Nicholas Piggin, David Howells,
	Hari Bathini, Paul Mackerras, Joel Stanley, Christian Brauner,
	Firoz Khan, Breno Leitao, Geert Uytterhoeven, Thomas Gleixner,
	Michal Suchanek, linuxppc-dev, Allison Randal, Eric W. Biederman



Le 29/08/2019 à 10:01, Arnd Bergmann a écrit :
> On Thu, Aug 29, 2019 at 8:46 AM Christoph Hellwig <hch@infradead.org> wrote:
> 
>>> @@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
>>>
>>>        rseq_signal_deliver(&ksig, tsk->thread.regs);
>>>
>>> -     if (is32) {
>>> +     if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {
>>
>> I think we should fix the is_32bit_task definitions instead so that
>> callers don't need this mess.  I'd suggest something like:
>>
>> #ifdef CONFIG_COMPAT
>> #define is_32bit_task()         test_thread_flag(TIF_32BIT)
>> #else
>> #define is_32bit_task()         IS_ENABLED(CONFIG_PPC32)
>> #endif
> 
> Are there actually any (correct) uses of is_32bit_task() outside of
> #ifdef CONFIG_PPC64?

There is at least  stack_maxrandom_size()
Also  brk_rnd() and do_signal()

Christophe

> 
> I suspect most if not all could be changed to the generic
> in_compat_syscall() that we use outside of architecture specific
> code.
> 
>         Arnd
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-29  8:38       ` Christophe Leroy
@ 2019-08-29  8:49         ` Arnd Bergmann
  0 siblings, 0 replies; 10+ messages in thread
From: Arnd Bergmann @ 2019-08-29  8:49 UTC (permalink / raw)
  To: Christophe Leroy
  Cc: Christoph Hellwig, Michael Neuling, Andrew Donnellan,
	Nicolai Stange, David Hildenbrand, Greg Kroah-Hartman,
	Heiko Carstens, Linux Kernel Mailing List, Nicholas Piggin,
	David Howells, Hari Bathini, Paul Mackerras, Joel Stanley,
	Christian Brauner, Firoz Khan, Breno Leitao, Geert Uytterhoeven,
	Thomas Gleixner, Michal Suchanek, linuxppc-dev, Allison Randal,
	Eric W. Biederman

On Thu, Aug 29, 2019 at 10:38 AM Christophe Leroy
<christophe.leroy@c-s.fr> wrote:
> Le 29/08/2019 à 10:01, Arnd Bergmann a écrit :
> > On Thu, Aug 29, 2019 at 8:46 AM Christoph Hellwig <hch@infradead.org> wrote:
> >
> >>> @@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
> >>>
> >>>        rseq_signal_deliver(&ksig, tsk->thread.regs);
> >>>
> >>> -     if (is32) {
> >>> +     if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {
> >>
> >> I think we should fix the is_32bit_task definitions instead so that
> >> callers don't need this mess.  I'd suggest something like:
> >>
> >> #ifdef CONFIG_COMPAT
> >> #define is_32bit_task()         test_thread_flag(TIF_32BIT)
> >> #else
> >> #define is_32bit_task()         IS_ENABLED(CONFIG_PPC32)
> >> #endif
> >
> > Are there actually any (correct) uses of is_32bit_task() outside of
> > #ifdef CONFIG_PPC64?
>
> There is at least  stack_maxrandom_size()
> Also  brk_rnd() and do_signal()

Right, makes sense.

      Arnd

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT
  2019-08-29  6:46   ` Christoph Hellwig
  2019-08-29  8:01     ` Arnd Bergmann
@ 2019-08-29 10:01     ` Michal Suchánek
  1 sibling, 0 replies; 10+ messages in thread
From: Michal Suchánek @ 2019-08-29 10:01 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Michael Neuling, Arnd Bergmann, Nicolai Stange,
	David Hildenbrand, Greg Kroah-Hartman, Andrew Donnellan,
	Heiko Carstens, linux-kernel, Nicholas Piggin, David Howells,
	Hari Bathini, Paul Mackerras, Joel Stanley, Christian Brauner,
	Firoz Khan, Breno Leitao, Geert Uytterhoeven, Thomas Gleixner,
	linuxppc-dev, Allison Randal, Eric W. Biederman

On Wed, 28 Aug 2019 23:46:24 -0700
Christoph Hellwig <hch@infradead.org> wrote:

> On Wed, Aug 28, 2019 at 06:43:50PM +0200, Michal Suchanek wrote:
> > +ifdef CONFIG_COMPAT
> > +obj-y				+= sys_ppc32.o ptrace32.o signal_32.o
> > +endif  
> 
> This should be:
> 
> obj-$(CONFIG_COMPAT)		+= sys_ppc32.o ptrace32.o signal_32.o

Yes, looks better.
> 
> >  /* This value is used to mark exception frames on the stack. */
> >  exception_marker:
> > diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
> > index 60436432399f..73d0f53ffc1a 100644
> > --- a/arch/powerpc/kernel/signal.c
> > +++ b/arch/powerpc/kernel/signal.c
> > @@ -277,7 +277,7 @@ static void do_signal(struct task_struct *tsk)
> >  
> >  	rseq_signal_deliver(&ksig, tsk->thread.regs);
> >  
> > -	if (is32) {
> > +	if ((IS_ENABLED(CONFIG_PPC32) || IS_ENABLED(CONFIG_COMPAT)) && is32) {  
> 
> I think we should fix the is_32bit_task definitions instead so that
> callers don't need this mess.  

Yes, that makes sense.

Thanks

Michal

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2019-08-29 10:02 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-28 16:43 [PATCH v3 0/4] Disable compat cruft on ppc64le v3 Michal Suchanek
2019-08-28 16:43 ` [PATCH v3 1/4] powerpc: make llseek 32bit-only Michal Suchanek
2019-08-28 16:43 ` [PATCH v3 2/4] powerpc: move common register copy functions from signal_32.c to signal.c Michal Suchanek
2019-08-28 16:43 ` [PATCH v3 3/4] powerpc/64: make buildable without CONFIG_COMPAT Michal Suchanek
2019-08-29  6:46   ` Christoph Hellwig
2019-08-29  8:01     ` Arnd Bergmann
2019-08-29  8:38       ` Christophe Leroy
2019-08-29  8:49         ` Arnd Bergmann
2019-08-29 10:01     ` Michal Suchánek
2019-08-28 16:43 ` [PATCH v3 4/4] powerpc/64: Make COMPAT user-selectable disabled on littleendian by default Michal Suchanek

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).