[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall
From: |
Wirth, Allan |
Subject: |
Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64 |
Date: |
Thu, 7 Jul 2016 19:13:09 +0000 |
On 7/7/16, 3:09 PM, "Laurent Vivier" <address@hidden> wrote:
>
>
>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
Definitely I would be happy to. I would be very grateful if you did.
Thanks,
Allan
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, (continued)
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Peter Maydell, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Laurent Vivier, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Peter Maydell, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Laurent Vivier, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Peter Maydell, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Laurent Vivier, 2016/07/02
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Riku Voipio, 2016/07/07
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Laurent Vivier, 2016/07/07
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Wirth, Allan, 2016/07/07
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64, Laurent Vivier, 2016/07/07
- Re: [Qemu-trivial] [Qemu-devel] [PATCH] linux-user: fix signal() syscall on x86_64,
Wirth, Allan <=