diff options
author | Pavel Kozlov <pavel.kozlov@synopsys.com> | 2023-03-02 20:10:19 +0400 |
---|---|---|
committer | Pavel Kozlov <pavel.kozlov@synopsys.com> | 2023-03-13 18:12:32 +0400 |
commit | 447273e0bf22a3d42e05e6b16d309f3f89879bea (patch) | |
tree | bb620208fe17f56e965573791b5f9ac2f2cfce94 /sysdeps/unix/sysv/linux/arc | |
parent | 3681cdb8f8b2e19d510caa354fa8d5e466f1d72a (diff) | |
download | glibc-447273e0bf22a3d42e05e6b16d309f3f89879bea.tar glibc-447273e0bf22a3d42e05e6b16d309f3f89879bea.tar.gz glibc-447273e0bf22a3d42e05e6b16d309f3f89879bea.tar.bz2 glibc-447273e0bf22a3d42e05e6b16d309f3f89879bea.zip |
ARC: run child from the separate start block in __clone
For better debug experience use separate code block with extra
cfi_* directives to run child (same as in __clone3).
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/unix/sysv/linux/arc')
-rw-r--r-- | sysdeps/unix/sysv/linux/arc/clone.S | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/sysdeps/unix/sysv/linux/arc/clone.S b/sysdeps/unix/sysv/linux/arc/clone.S index 7666496256..0029aaeb81 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) |