Le 07/07/2016 à 21:04, Wirth, Allan a écrit : > > > On 7/7/16, 3:02 PM, "Laurent Vivier" <laur...@vivier.eu> wrote: > >> >> >> Le 07/07/2016 à 20:49, Riku Voipio a écrit : >>> On Sat, Jul 02, 2016 at 09:12:09PM +0100, Peter Maydell wrote: >>>> On 2 July 2016 at 17:41, Laurent Vivier <laur...@vivier.eu> wrote: >>>>> Sadly, this can't work: >>>>> >>>>> sparc/sparc64/cris use sys_select for NR_select AND NR_newselect. >>>> >>>>> Not sure all is correct, but it's what I've found: >>>>> >>>>> | __NR_select | __NR__newselect >>>>> ------------+----------------+-----------------+ >>>>> arm | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> aarch64 | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> alpha | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> cris | sys_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> m68k | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> microblaze | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> mips | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> mips64 | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> openrisc | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> ppc | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> s390x | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> sh4 | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> sparc | sys_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> sparc64 | sys_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>>> tilegx | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> unicore32 | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> x86_64 | sys_select | - | >>>>> ------------+----------------+-----------------+ >>>>> i386 | sys_old_select | sys_select | >>>>> ------------+----------------+-----------------+ >>>> >>>> Hmm. Looking at current Linux git master, I get >>>> slightly different results. The only architectures which >>>> define __ARCH_WANT_SYS_OLD_SELECT are: >>>> arm, m68k, mn10300, x86 >>>> and no others use sys_old_select. >>>> >>>> So I think we have the following behaviours: >>>> >>>> (1) Define neither NR_select nor NR__newselect >>>> (and use pselect6 syscall for select): >>>> aarch64, openrisc, tilegx, unicore32, presumably any future arch >>>> >>>> (2) only define NR__newselect, it is new select: >>>> mips, mips64, sh, s390 >>>> >>>> (3) Only define NR_select, want that to be new select: >>>> alpha, x86_64, s390x >>>> >>>> (4) NR__newselect is new select, NR_select is old_select: >>>> i386, m68k, arm if kernel is not CONFIG_AEABI >>>> >>>> (5) NR__newselect is new select, NR_select is defined but >>>> if called returns ENOSYS: >>>> microblaze, arm if CONFIG_AEABI, ppc64 >>>> >>>> (6) NR__newselect is new select, NR_select is a bonkers custom >>>> thing that tries to autodetect the calling convention: >>>> http://lxr.free-electrons.com/source/arch/powerpc/kernel/syscalls.c#L86 >>>> ppc32 (but only native 32-bit; 32-bit compat support >>>> on a ppc64 kernel is category 5, so I vote for ignoring >>>> this weirdness and calling ppc category 5) >>>> >>>> (7) NR_select and NR__newselect are different numbers >>>> but both are new select: >>>> cris, sparc, sparc64 >>>> >>>> which is a pretty confusing mess, but I think it equates to: >>>> (0) if defined, NR__newselect is always new select >>>> (1) if NR_select is defined, the choices are: >>>> (a) NR_select is old_select: >>>> i386, m68k, arm >>>> (b) NR_select is defined but should ENOSYS: >>>> microblaze, ppc >>>> (c) NR_select defined and is new select: >>>> everything else (alpha, x86-64, s390x, cris, sparc, sparc64) >>>> >>>> and I think we should handle that by having the code in syscall.c >>>> be something like: >>>> >>>> #ifdef TARGET_NR_select >>>> case TARGET_NR_select: >>>> #if defined(TARGET_WANT_NI_OLD_SELECT) >>>> /* some architectures used to have old_select here >>>> * but now ENOSYS it. >>>> */ >>>> ret = -TARGET_ENOSYS; >>>> break; >>>> #elif defined(TARGET_WANT_OLD_SYS_SELECT) >>>> /* code for old select here; maybe factored out to >>>> * its own function: ret = do_old_select() ? >>>> */ >>>> #else >>>> /* select is new style select */ >>>> ret = do_select(...); >>>> #endif >>>> #endif >>> >>> I agree, this seems to be the best way to fix select properly. >> >> Ok, if no one is already working on that, I'm going to send a patch >> according to Peter's comments. >> >> Laurent > > I was hoping to, but I do not think that I will get around to it anytime soon.
If I provide a patch, could you test it for your test case? Thanks, Laurent