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-163b0d29a...@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 <rmcl...@linux.ibm.com>
Acked-by: Christophe Leroy <christophe.le...@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