diff mbox series

[v2,04/14] powerpc/32: Remove powerpc select specialisation

Message ID 20220725062621.118988-1-rmclure@linux.ibm.com (mailing list archive)
State Superseded
Headers show
Series powerpc: Syscall wrapper and register clearing | expand

Commit Message

Rohan McLure July 25, 2022, 6:26 a.m. UTC
Syscall #82 has been implemented for 32-bit platforms in a unique way on
powerpc systems. This hack will in effect guess whether the caller is
expecting new select semantics or old select semantics. It does so via a
guess, based off the first parameter. In new select, this parameter
represents the length of a user-memory array of file descriptors, and in
old select this is a pointer to an arguments structure.

The heuristic simply interprets sufficiently large values of its first
parameter as being a call to old select. The following is a discussion
on how this syscall should be handled.

Link: https://lore.kernel.org/lkml/13737de5-0eb7-e881-9af0-163b0d29a1a0@csgroup.eu/

As discussed in this thread, the existence of such a hack suggests that for
whatever powerpc binaries may predate glibc, it is most likely that they
would have taken use of the old select semantics. x86 and arm64 both
implement this syscall with oldselect semantics.

Remove the powerpc implementation, and update syscall.tbl to refer to emit
a reference to sys_old_select for 32-bit binaries, in keeping with how
other architectures support syscall #82.

Signed-off-by: Rohan McLure <rmclure@linux.ibm.com>
---
V1 -> V2: Remove arch-specific select handler
---
 arch/powerpc/kernel/syscalls.c               | 18 ------------------
 arch/powerpc/kernel/syscalls/syscall.tbl     |  2 +-
 .../arch/powerpc/entry/syscalls/syscall.tbl  |  2 +-
 3 files changed, 2 insertions(+), 20 deletions(-)

Comments

Christophe Leroy Aug. 5, 2022, 4:51 p.m. UTC | #1
Le 25/07/2022 à 08:26, Rohan McLure a écrit :
> Syscall #82 has been implemented for 32-bit platforms in a unique way on
> powerpc systems. This hack will in effect guess whether the caller is
> expecting new select semantics or old select semantics. It does so via a
> guess, based off the first parameter. In new select, this parameter
> represents the length of a user-memory array of file descriptors, and in
> old select this is a pointer to an arguments structure.
> 
> The heuristic simply interprets sufficiently large values of its first
> parameter as being a call to old select. The following is a discussion
> on how this syscall should be handled.
> 
> Link: https://lore.kernel.org/lkml/13737de5-0eb7-e881-9af0-163b0d29a1a0@csgroup.eu/
> 
> As discussed in this thread, the existence of such a hack suggests that for
> whatever powerpc binaries may predate glibc, it is most likely that they
> would have taken use of the old select semantics. x86 and arm64 both
> implement this syscall with oldselect semantics.
> 
> Remove the powerpc implementation, and update syscall.tbl to refer to emit
> a reference to sys_old_select for 32-bit binaries, in keeping with how
> other architectures support syscall #82.
> 
> Signed-off-by: Rohan McLure <rmclure@linux.ibm.com>

Acked-by: Christophe Leroy <christophe.leroy@csgroup.eu>

> ---
> V1 -> V2: Remove arch-specific select handler
> ---
>   arch/powerpc/kernel/syscalls.c               | 18 ------------------
>   arch/powerpc/kernel/syscalls/syscall.tbl     |  2 +-
>   .../arch/powerpc/entry/syscalls/syscall.tbl  |  2 +-
>   3 files changed, 2 insertions(+), 20 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
> index 9f339bcb433d..0afbcbd50433 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -74,24 +74,6 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
>   	return do_mmap2(addr, len, prot, flags, fd, offset, PAGE_SHIFT);
>   }
>   
> -#ifdef CONFIG_PPC32
> -/*
> - * Due to some executables calling the wrong select we sometimes
> - * get wrong args.  This determines how the args are being passed
> - * (a single ptr to them all args passed) then calls
> - * sys_select() with the appropriate args. -- Cort
> - */
> -SYSCALL_DEFINE5(ppc_select, int, n, fd_set __user *, inp,
> -		fd_set __user *, outp, fd_set __user *, exp,
> -		struct __kernel_old_timeval __user *, tvp)
> -{
> -	if ((unsigned long)n >= 4096)
> -		return sys_old_select((void __user *)n);
> -
> -	return sys_select(n, inp, outp, exp, tvp);
> -}
> -#endif
> -
>   #ifdef CONFIG_PPC64
>   static inline long do_ppc64_personality(unsigned long personality)
>   {
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index 59d9259dfbb5..c6cfcdf52c57 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				sys_ppc_select			sys_ni_syscall
> +82	32	select				sys_old_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
> diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> index 437066f5c4b2..b4c970c9c6b1 100644
> --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				sys_ppc_select			sys_ni_syscall
> +82	32	select				sys_old_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
Andrew Donnellan Aug. 8, 2022, 4:11 a.m. UTC | #2
On Mon, 2022-07-25 at 16:26 +1000, Rohan McLure wrote:
> Syscall #82 has been implemented for 32-bit platforms in a unique way
> on
> powerpc systems. This hack will in effect guess whether the caller is
> expecting new select semantics or old select semantics. It does so
> via a
> guess, based off the first parameter. In new select, this parameter
> represents the length of a user-memory array of file descriptors, and
> in
> old select this is a pointer to an arguments structure.
> 
> The heuristic simply interprets sufficiently large values of its
> first
> parameter as being a call to old select. The following is a
> discussion
> on how this syscall should be handled.
> 
> Link: 
> https://lore.kernel.org/lkml/13737de5-0eb7-e881-9af0-163b0d29a1a0@csgroup.eu/
> 
> As discussed in this thread, the existence of such a hack suggests
> that for
> whatever powerpc binaries may predate glibc, it is most likely that
> they
> would have taken use of the old select semantics. x86 and arm64 both
> implement this syscall with oldselect semantics.
> 
> Remove the powerpc implementation, and update syscall.tbl to refer to
> emit
> a reference to sys_old_select for 32-bit binaries, in keeping with
> how
> other architectures support syscall #82.
> 
> Signed-off-by: Rohan McLure <rmclure@linux.ibm.com>
> ---
> V1 -> V2: Remove arch-specific select handler
> ---
>  arch/powerpc/kernel/syscalls.c               | 18 ------------------
>  arch/powerpc/kernel/syscalls/syscall.tbl     |  2 +-
>  .../arch/powerpc/entry/syscalls/syscall.tbl  |  2 +-
>  3 files changed, 2 insertions(+), 20 deletions(-)

You should remove the declaration from
arch/powerpc/include/asm/syscalls.h, which I see you end up doing in
patch #6.

Apart from that:

Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>

> 
> diff --git a/arch/powerpc/kernel/syscalls.c
> b/arch/powerpc/kernel/syscalls.c
> index 9f339bcb433d..0afbcbd50433 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -74,24 +74,6 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t,
> len,
>         return do_mmap2(addr, len, prot, flags, fd, offset,
> PAGE_SHIFT);
>  }
>  
> -#ifdef CONFIG_PPC32
> -/*
> - * Due to some executables calling the wrong select we sometimes
> - * get wrong args.  This determines how the args are being passed
> - * (a single ptr to them all args passed) then calls
> - * sys_select() with the appropriate args. -- Cort
> - */
> -SYSCALL_DEFINE5(ppc_select, int, n, fd_set __user *, inp,
> -               fd_set __user *, outp, fd_set __user *, exp,
> -               struct __kernel_old_timeval __user *, tvp)
> -{
> -       if ((unsigned long)n >= 4096)
> -               return sys_old_select((void __user *)n);
> -
> -       return sys_select(n, inp, outp, exp, tvp);
> -}
> -#endif
> -
>  #ifdef CONFIG_PPC64
>  static inline long do_ppc64_personality(unsigned long personality)
>  {
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl
> b/arch/powerpc/kernel/syscalls/syscall.tbl
> index 59d9259dfbb5..c6cfcdf52c57 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>  79     common  settimeofday                    sys_settimeofday     
>            compat_sys_settimeofday
>  80     common  getgroups                       sys_getgroups
>  81     common  setgroups                       sys_setgroups
> -
> 82     32      select                          sys_ppc_select         
>          sys_ni_syscall
> +82     32      select                          sys_old_select       
>            sys_ni_syscall
>  82     64      select                          sys_ni_syscall
>  82     spu     select                          sys_ni_syscall
>  83     common  symlink                         sys_symlink
> diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> index 437066f5c4b2..b4c970c9c6b1 100644
> --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>  79     common  settimeofday                    sys_settimeofday     
>            compat_sys_settimeofday
>  80     common  getgroups                       sys_getgroups
>  81     common  setgroups                       sys_setgroups
> -
> 82     32      select                          sys_ppc_select         
>          sys_ni_syscall
> +82     32      select                          sys_old_select       
>            sys_ni_syscall
>  82     64      select                          sys_ni_syscall
>  82     spu     select                          sys_ni_syscall
>  83     common  symlink                         sys_symlink
Christophe Leroy Aug. 8, 2022, 10:13 a.m. UTC | #3
Le 25/07/2022 à 08:26, Rohan McLure a écrit :
> Syscall #82 has been implemented for 32-bit platforms in a unique way on
> powerpc systems. This hack will in effect guess whether the caller is
> expecting new select semantics or old select semantics. It does so via a
> guess, based off the first parameter. In new select, this parameter
> represents the length of a user-memory array of file descriptors, and in
> old select this is a pointer to an arguments structure.
> 
> The heuristic simply interprets sufficiently large values of its first
> parameter as being a call to old select. The following is a discussion
> on how this syscall should be handled.
> 
> Link: https://lore.kernel.org/lkml/13737de5-0eb7-e881-9af0-163b0d29a1a0@csgroup.eu/
> 
> As discussed in this thread, the existence of such a hack suggests that for
> whatever powerpc binaries may predate glibc, it is most likely that they
> would have taken use of the old select semantics. x86 and arm64 both
> implement this syscall with oldselect semantics.
> 
> Remove the powerpc implementation, and update syscall.tbl to refer to emit
> a reference to sys_old_select for 32-bit binaries, in keeping with how
> other architectures support syscall #82.
> 
> Signed-off-by: Rohan McLure <rmclure@linux.ibm.com>

Move this before patch 1, it will remove one change in patch 1.


> ---
> V1 -> V2: Remove arch-specific select handler
> ---
>   arch/powerpc/kernel/syscalls.c               | 18 ------------------
>   arch/powerpc/kernel/syscalls/syscall.tbl     |  2 +-
>   .../arch/powerpc/entry/syscalls/syscall.tbl  |  2 +-
>   3 files changed, 2 insertions(+), 20 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
> index 9f339bcb433d..0afbcbd50433 100644
> --- a/arch/powerpc/kernel/syscalls.c
> +++ b/arch/powerpc/kernel/syscalls.c
> @@ -74,24 +74,6 @@ SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
>   	return do_mmap2(addr, len, prot, flags, fd, offset, PAGE_SHIFT);
>   }
>   
> -#ifdef CONFIG_PPC32
> -/*
> - * Due to some executables calling the wrong select we sometimes
> - * get wrong args.  This determines how the args are being passed
> - * (a single ptr to them all args passed) then calls
> - * sys_select() with the appropriate args. -- Cort
> - */
> -SYSCALL_DEFINE5(ppc_select, int, n, fd_set __user *, inp,
> -		fd_set __user *, outp, fd_set __user *, exp,
> -		struct __kernel_old_timeval __user *, tvp)
> -{
> -	if ((unsigned long)n >= 4096)
> -		return sys_old_select((void __user *)n);
> -
> -	return sys_select(n, inp, outp, exp, tvp);
> -}
> -#endif
> -
>   #ifdef CONFIG_PPC64
>   static inline long do_ppc64_personality(unsigned long personality)
>   {
> diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
> index 59d9259dfbb5..c6cfcdf52c57 100644
> --- a/arch/powerpc/kernel/syscalls/syscall.tbl
> +++ b/arch/powerpc/kernel/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				sys_ppc_select			sys_ni_syscall
> +82	32	select				sys_old_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
> diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> index 437066f5c4b2..b4c970c9c6b1 100644
> --- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> +++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
> @@ -110,7 +110,7 @@
>   79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
>   80	common	getgroups			sys_getgroups
>   81	common	setgroups			sys_setgroups
> -82	32	select				sys_ppc_select			sys_ni_syscall
> +82	32	select				sys_old_select			sys_ni_syscall
>   82	64	select				sys_ni_syscall
>   82	spu	select				sys_ni_syscall
>   83	common	symlink				sys_symlink
diff mbox series

Patch

diff --git a/arch/powerpc/kernel/syscalls.c b/arch/powerpc/kernel/syscalls.c
index 9f339bcb433d..0afbcbd50433 100644
--- a/arch/powerpc/kernel/syscalls.c
+++ b/arch/powerpc/kernel/syscalls.c
@@ -74,24 +74,6 @@  SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
 	return do_mmap2(addr, len, prot, flags, fd, offset, PAGE_SHIFT);
 }
 
-#ifdef CONFIG_PPC32
-/*
- * Due to some executables calling the wrong select we sometimes
- * get wrong args.  This determines how the args are being passed
- * (a single ptr to them all args passed) then calls
- * sys_select() with the appropriate args. -- Cort
- */
-SYSCALL_DEFINE5(ppc_select, int, n, fd_set __user *, inp,
-		fd_set __user *, outp, fd_set __user *, exp,
-		struct __kernel_old_timeval __user *, tvp)
-{
-	if ((unsigned long)n >= 4096)
-		return sys_old_select((void __user *)n);
-
-	return sys_select(n, inp, outp, exp, tvp);
-}
-#endif
-
 #ifdef CONFIG_PPC64
 static inline long do_ppc64_personality(unsigned long personality)
 {
diff --git a/arch/powerpc/kernel/syscalls/syscall.tbl b/arch/powerpc/kernel/syscalls/syscall.tbl
index 59d9259dfbb5..c6cfcdf52c57 100644
--- a/arch/powerpc/kernel/syscalls/syscall.tbl
+++ b/arch/powerpc/kernel/syscalls/syscall.tbl
@@ -110,7 +110,7 @@ 
 79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
 80	common	getgroups			sys_getgroups
 81	common	setgroups			sys_setgroups
-82	32	select				sys_ppc_select			sys_ni_syscall
+82	32	select				sys_old_select			sys_ni_syscall
 82	64	select				sys_ni_syscall
 82	spu	select				sys_ni_syscall
 83	common	symlink				sys_symlink
diff --git a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
index 437066f5c4b2..b4c970c9c6b1 100644
--- a/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
+++ b/tools/perf/arch/powerpc/entry/syscalls/syscall.tbl
@@ -110,7 +110,7 @@ 
 79	common	settimeofday			sys_settimeofday		compat_sys_settimeofday
 80	common	getgroups			sys_getgroups
 81	common	setgroups			sys_setgroups
-82	32	select				sys_ppc_select			sys_ni_syscall
+82	32	select				sys_old_select			sys_ni_syscall
 82	64	select				sys_ni_syscall
 82	spu	select				sys_ni_syscall
 83	common	symlink				sys_symlink