Message ID | 20230302161019.27192-2-kozlov@synopsys.com |
---|---|
State | New |
Headers | show |
Series | [1/2] ARC: Add the clone3 wrapper | expand |
On 02/03/23 13:10, Pavel Kozlov via Libc-alpha wrote: > From: Pavel Kozlov <pavel.kozlov@synopsys.com> > > For better debug experience use separate code block with extra > cfi_* directives to run child (same as in __clone3). LGTM, thanks. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org> > --- > sysdeps/unix/sysv/linux/arc/clone.S | 40 ++++++++++++++++++----------- > 1 file changed, 25 insertions(+), 15 deletions(-) > > diff --git a/sysdeps/unix/sysv/linux/arc/clone.S b/sysdeps/unix/sysv/linux/arc/clone.S > index 766649625658..0029aaeb8170 100644 > --- a/sysdeps/unix/sysv/linux/arc/clone.S > +++ b/sysdeps/unix/sysv/linux/arc/clone.S > @@ -20,9 +20,6 @@ > #include <sysdep.h> > #define _ERRNO_H 1 > #include <bits/errno.h> > -#include <tcb-offsets.h> > - > -#define CLONE_SETTLS 0x00080000 > > /* int clone(int (*fn)(void *), void *child_stack, > int flags, void *arg, ... > @@ -63,19 +60,9 @@ ENTRY (__clone) > ARC_TRAP_INSN > > cmp r0, 0 /* return code : 0 new process, !0 parent. */ > + beq thread_start_clone > blt L (__sys_err2) /* < 0 (signed) error. */ > - jnz [blink] /* Parent returns. */ > - > - /* child jumps off to @fn with @arg as argument > - TP register already set by kernel. */ > - jl.d [r10] > - mov r0, r11 > - > - /* exit() with result from @fn (already in r0). */ > - mov r8, __NR_exit > - ARC_TRAP_INSN > - /* In case it ever came back. */ > - flag 1 > + j [blink] /* Parent returns. */ > > L (__sys_err): > mov r0, -EINVAL > @@ -89,5 +76,28 @@ L (__sys_err2): > position independent. */ > b __syscall_error > PSEUDO_END (__clone) > + > + > + .align 4 > + .type thread_start_clone, %function > +thread_start_clone: > + cfi_startproc > + /* Terminate call stack by noting ra is undefined. */ > + cfi_undefined (blink) > + > + /* Child jumps off to @fn with @arg as argument. */ > + jl.d [r10] > + mov r0, r11 > + > + /* exit() with result from @fn (already in r0). */ > + mov r8, __NR_exit > + ARC_TRAP_INSN > + > + /* In case it ever came back. */ > + flag 1 > + > + cfi_endproc > + .size thread_start_clone, .-thread_start_clone > + > libc_hidden_def (__clone) > weak_alias (__clone, clone)
diff --git a/sysdeps/unix/sysv/linux/arc/clone.S b/sysdeps/unix/sysv/linux/arc/clone.S index 766649625658..0029aaeb8170 100644 --- a/sysdeps/unix/sysv/linux/arc/clone.S +++ b/sysdeps/unix/sysv/linux/arc/clone.S @@ -20,9 +20,6 @@ #include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> -#include <tcb-offsets.h> - -#define CLONE_SETTLS 0x00080000 /* int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ... @@ -63,19 +60,9 @@ ENTRY (__clone) ARC_TRAP_INSN cmp r0, 0 /* return code : 0 new process, !0 parent. */ + beq thread_start_clone blt L (__sys_err2) /* < 0 (signed) error. */ - jnz [blink] /* Parent returns. */ - - /* child jumps off to @fn with @arg as argument - TP register already set by kernel. */ - jl.d [r10] - mov r0, r11 - - /* exit() with result from @fn (already in r0). */ - mov r8, __NR_exit - ARC_TRAP_INSN - /* In case it ever came back. */ - flag 1 + j [blink] /* Parent returns. */ L (__sys_err): mov r0, -EINVAL @@ -89,5 +76,28 @@ L (__sys_err2): position independent. */ b __syscall_error PSEUDO_END (__clone) + + + .align 4 + .type thread_start_clone, %function +thread_start_clone: + cfi_startproc + /* Terminate call stack by noting ra is undefined. */ + cfi_undefined (blink) + + /* Child jumps off to @fn with @arg as argument. */ + jl.d [r10] + mov r0, r11 + + /* exit() with result from @fn (already in r0). */ + mov r8, __NR_exit + ARC_TRAP_INSN + + /* In case it ever came back. */ + flag 1 + + cfi_endproc + .size thread_start_clone, .-thread_start_clone + libc_hidden_def (__clone) weak_alias (__clone, clone)
From: Pavel Kozlov <pavel.kozlov@synopsys.com> For better debug experience use separate code block with extra cfi_* directives to run child (same as in __clone3). --- sysdeps/unix/sysv/linux/arc/clone.S | 40 ++++++++++++++++++----------- 1 file changed, 25 insertions(+), 15 deletions(-)