123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- From 60f9eaa155d0f7ff935da37ecdf253c5c744a3ce Mon Sep 17 00:00:00 2001
- From: Wang Yufen <wangyufen@huawei.com>
- Date: Fri, 5 Sep 2014 15:19:21 +0800
- Subject: [PATCH 6/6] arm: add RESET_PID in the clone impl
- Called getpid() When creating a new process with clone(), getpid() returns
- the father_process's value. It should be child_process's value.
- The reason is missing a RESET_PID in the arm clone impl.
- Signed-off-by: Wang Yufen <wangyufen@huawei.com>
- Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
- ---
- libc/sysdeps/linux/arm/clone.S | 61 +++++++++++++++++++++++++++++++----------
- libc/sysdeps/linux/arm/sysdep.h | 36 ++++++++++++++++++++++++
- 2 files changed, 83 insertions(+), 14 deletions(-)
- diff --git a/libc/sysdeps/linux/arm/clone.S b/libc/sysdeps/linux/arm/clone.S
- index 03cd10e..29045ef 100644
- --- a/libc/sysdeps/linux/arm/clone.S
- +++ b/libc/sysdeps/linux/arm/clone.S
- @@ -19,12 +19,17 @@
- /* clone() is even more special than fork() as it mucks with stacks
- and invokes a function in the right context after its all over. */
-
- +#include <sysdep.h>
- #define _ERRNO_H
- #include <features.h>
- #include <bits/errno.h>
- #include <sys/syscall.h>
- #include <bits/arm_asm.h>
- #include <bits/arm_bx.h>
- +#include <sysdep-cancel.h>
- +
- +#define CLONE_VM 0x00000100
- +#define CLONE_THREAD 0x00010000
-
- #if defined(__NR_clone)
- /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
- @@ -87,6 +92,8 @@ __error:
- .pool
- #else
- __clone:
- +.fnstart
- +.cantunwind
- @ sanity check args
- cmp r0, #0
- IT(te, ne)
- @@ -95,32 +102,58 @@ __clone:
- beq __error
-
- @ insert the args onto the new stack
- - sub r1, r1, #8
- - str r3, [r1, #4]
- - @ save the function pointer as the 0th element
- - str r0, [r1]
- + str r3, [r1, #-4]!
- + str r0, [r1, #-4]!
-
- @ do the system call
- @ get flags
- mov r0, r2
- +#ifdef RESET_PID
- + mov ip, r2
- +#endif
- @ new sp is already in r1
- - @ load remaining arguments off the stack
- - stmfd sp!, {r4}
- - ldr r2, [sp, #4]
- - ldr r3, [sp, #8]
- - ldr r4, [sp, #12]
- - DO_CALL (clone)
- - movs a1, a1
- - IT(t, ne)
- - ldmnefd sp!, {r4}
- + push {r4, r7}
- + cfi_adjust_cfa_offset (8)
- + cfi_rel_offset (r4, 0)
- + cfi_rel_offset (r7, 4)
- + ldr r2, [sp, #8]
- + ldr r3, [sp, #12]
- + ldr r4, [sp, #16]
- + ldr r7, =SYS_ify(clone)
- + swi 0x0
- + cfi_endproc
- + cmp r0, #0
- + beq 1f
- + pop {r4, r7}
- blt __error
- - IT(t, ne)
- #if defined(__USE_BX__)
- bxne lr
- #else
- movne pc, lr
- #endif
-
- + cfi_startproc
- +.fnend
- +PSEUDO_END (__clone)
- +
- +1:
- + .fnstart
- + .cantunwind
- +#ifdef RESET_PID
- + tst ip, #CLONE_THREAD
- + bne 3f
- + GET_TLS (lr)
- + mov r1, r0
- + tst ip, #CLONE_VM
- + ldr r7, =SYS_ify(getpid)
- + ite ne
- + movne r0, #-1
- + swieq 0x0
- + NEGOFF_ADJ_BASE (r1, TID_OFFSET)
- + str r0, NEGOFF_OFF1 (r1, TID_OFFSET)
- + str r0, NEGOFF_OFF2 (r1, PID_OFFSET, TID_OFFSET)
- +3:
- +#endif
- @ pick the function arg and call address off the stack and execute
- ldr r0, [sp, #4]
- mov lr, pc
- diff --git a/libc/sysdeps/linux/arm/sysdep.h b/libc/sysdeps/linux/arm/sysdep.h
- index 64f4040..2d0a9cc 100644
- --- a/libc/sysdeps/linux/arm/sysdep.h
- +++ b/libc/sysdeps/linux/arm/sysdep.h
- @@ -213,6 +213,42 @@ __local_syscall_error: \
- sees the right arguments.
-
- */
- +#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6K__) || defined (__ARM_ARCH_6ZK__)
- +# define ARCH_HAS_HARD_TP
- +#endif
- +
- +# ifdef __thumb2__
- +# define NEGOFF_ADJ_BASE(R, OFF) add R, R, $OFF
- +# define NEGOFF_ADJ_BASE2(D, S, OFF) add D, S, $OFF
- +# define NEGOFF_OFF1(R, OFF) [R]
- +# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $((OFFA) - (OFFB))]
- +# else
- +# define NEGOFF_ADJ_BASE(R, OFF)
- +# define NEGOFF_ADJ_BASE2(D, S, OFF) mov D, S
- +# define NEGOFF_OFF1(R, OFF) [R, $OFF]
- +# define NEGOFF_OFF2(R, OFFA, OFFB) [R, $OFFA]
- +# endif
- +
- +# ifdef ARCH_HAS_HARD_TP
- +/* If the cpu has cp15 available, use it. */
- +# define GET_TLS(TMP) mrc p15, 0, r0, c13, c0, 3
- +# else
- +/* At this generic level we have no tricks to pull. Call the ABI routine. */
- +# define GET_TLS(TMP) \
- + push { r1, r2, r3, lr }; \
- + cfi_remember_state; \
- + cfi_adjust_cfa_offset (16); \
- + cfi_rel_offset (r1, 0); \
- + cfi_rel_offset (r2, 4); \
- + cfi_rel_offset (r3, 8); \
- + cfi_rel_offset (lr, 12); \
- + bl __aeabi_read_tp; \
- + pop { r1, r2, r3, lr }; \
- + cfi_restore_state
- +# endif /* ARCH_HAS_HARD_TP */
- +
- +
- +
-
- #undef DO_CALL
- #if defined(__ARM_EABI__)
- --
- 1.8.5.2 (Apple Git-48)
|