Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <deee6a58-3745-420a-91c6-f58fe728a27c@loongson.cn>
Date: Thu, 21 Apr 2022 14:54:30 +0800
From: 王洪亮 <wanghongliang@...ngson.cn>
To: musl@...ts.openwall.com
Cc: Christian Brauner <brauner@...nel.org>
Subject: Re: Re: add loongarch64 port


在 2022/4/20 下午9:54, Rich Felker 写道
>>> Hi,
>>>
>>> I'm implementing  __NR_clone3 syscall within __clone().
>>>
>>> I have another problem:CLONE_DETACHED
>>>
>>> in musl,internal call __clone()(such as __pthread_create()),the input
>>> parameter flags
>>>
>>> has been set CLONE_DETACHED ,in kernel,there is a check in
>>> clone3_args_valid(),
>>>
>>> if the condition met,return false.
>>>
>>> How to deal with this problem?
>> CLONE_DETACHED is meaningles since Linux on 2.6.2. There really should
>> be <=2.6.1 living kernel anywhere where CLONE_DETACHED does anything.
>> I've documented that in detail under [1] as:
>>
>>          CLONE_DETACHED (historical)
>>                For a while (during the Linux 2.5 development series)
>>                there was a CLONE_DETACHED flag, which caused the parent
>>                not to receive a signal when the child terminated.
>>                Ultimately, the effect of this flag was subsumed under the
>>                CLONE_THREAD flag and by the time Linux 2.6.0 was
>>                released, this flag had no effect.  Starting in Linux
>>                2.6.2, the need to give this flag together with
>>                CLONE_THREAD disappeared.
>>
>>                This flag is still defined, but it is usually ignored when
>>                calling clone().  However, see the description of
>>                CLONE_PIDFD for some exceptions.
>>
>> [1]: https://man7.org/linux/man-pages/man2/clone.2.html
>>
>> Would it be possible to drop this flag from musl's pthread_create()
>> implementation? (Iirc, glibc dropped CLONE_DETACHED in 2004.)
> I think __clone should just mask it on newer archs. We support Linux
> 2.6.0 and if lack of CLONE_DETACHED causes bogus signals on 2.6.0 we
> should keep it. If it can be established that this doesn't happen and
> that CLONE_DETACHED just affected non-thread clones, we can probably
> safely drop it.
>
> Rich

I have already implemented __NR_clone3 syscall within __clone(),

and libc-test OK.the code is shown below,please help review.


src/thread/loongarch64/clone.s:

#__clone(func, stack, flags, arg, ptid, tls, ctid)

#         a0,    a1,   a2,    a3,  a4,  a5,   a6
# sys_clone3(struct clone_args *cl_args, size_t size)
#                                 a0             a1

.global __clone
.hidden __clone
.type   __clone,@function
__clone:
         # Save function pointer and argument pointer on new thread stack
         addi.d  $a1, $a1, -16
         st.d    $a0, $a1, 0     # save function pointer
         st.d    $a3, $a1, 8     # save argument pointer

         li.d    $t0, ~0x004000ff  # mask CSIGNAL and CLONE_DETACHED
         and     $t1, $a2, $t0     # cl_args.flags
         li.d    $t0, 0x000000ff   # CSIGNAL
         and     $t2, $a2, $t0     # cl_args.exit_signal

         bstrins.d $sp, $zero, 2, 0  # align stack to 8 bytes
         addi.d  $sp, $sp, -88   # struct clone_args
         st.d    $t1, $sp, 0     # flags
         st.d    $a4, $sp, 8     # pidfd
         st.d    $a6, $sp, 16    # child_tid
         st.d    $a4, $sp, 24    # parent_tid
         st.d    $t2, $sp, 32    # exit_signal
         st.d    $a1, $sp, 40    # stack
         st.d    $zero, $sp, 48  # stack_size
         st.d    $a5, $sp, 56    # tls
         st.d    $zero, $sp, 64  # set_tid
         st.d    $zero, $sp, 72  # set_tid_size
         st.d    $zero, $sp, 80  # cgroup

         move    $a0, $sp
         li.d    $a1, 88
         li.d    $a7, 435        # __NR_clone3
         syscall 0               # call clone3

         beqz    $a0, 1f         # whether child process
         addi.d  $sp, $sp, 88
         jirl    $zero, $ra, 0   # parent process return

1:
         ld.d    $t8, $sp, 0     # function pointer
         ld.d    $a0, $sp, 8     # argument pointer
         jirl    $ra, $t8, 0     # call the user's function
         li.d    $a7, 93
         syscall 0               # child process exit

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.