|
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.