qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall


From: Laurent Vivier
Subject: Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64
Date: Thu, 7 Jul 2016 21:09:14 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.1


Le 07/07/2016 à 21:04, Wirth, Allan a écrit :
> 
> 
> On 7/7/16, 3:02 PM, "Laurent Vivier" <address@hidden> 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 <address@hidden> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]