Hi Carmelo,
Carmelo Amoroso wrote,

> Hi,
> I don't think clone on arm is missing RESET_PID if you use the
> correct implementation from
> libpthread/nptl/sysdeps/unix/sysv/linux/arm/clone.S.

Can you explain this a little bit more?

cat ./libpthread/nptl/sysdeps/unix/sysv/linux/arm/clone.S
#define RESET_PID
#include <tcb-offsets.h>
#include "../../../../../../../libc/sysdeps/linux/arm/clone.S"

Do you think the test-suite failures on arm come from a buildsystem
problem?

best regards
 Waldemar
 
> Cheers
> Carmelo
> 
> Inviato con AquaMail per Android
> http://www.aqua-mail.com
> 
> 
> Il 02 settembre 2014 14:12:24 Wangyufen <[email protected]> ha scritto:
> 
> >From: Wang Yufen <[email protected]>
> >
> >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 <[email protected]>
> >---
> > libc/sysdeps/linux/arm/clone.S  |   61 
> > ++++++++++++++++++++++++++++++---------
> > libc/sysdeps/linux/arm/sysdep.h |   45 ++++++++++++++++++++++++++++
> > 2 files changed, 92 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..38a131d 100644
> >--- a/libc/sysdeps/linux/arm/sysdep.h
> >+++ b/libc/sysdeps/linux/arm/sysdep.h
> >@@ -213,6 +213,51 @@ __local_syscall_error:                                  
> >        \
> >    sees the right arguments.
> >
> > */
> >+#if __ARM_ARCH > 4 || defined (__ARM_ARCH_4T__)
> >+# define ARCH_HAS_BX
> >+#endif
> >+#if __ARM_ARCH > 4
> >+# define ARCH_HAS_BLX
> >+#endif
> >+#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6K__) || defined 
> >(__ARM_ARCH_6ZK__)
> >+# define ARCH_HAS_HARD_TP
> >+#endif
> >+#if __ARM_ARCH > 6 || defined (__ARM_ARCH_6T2__)
> >+# define ARCH_HAS_T2
> >+#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.7.1
> >
> >
> >_______________________________________________
> >uClibc mailing list
> >[email protected]
> >http://lists.busybox.net/mailman/listinfo/uclibc
> 
> 
> _______________________________________________
> uClibc mailing list
> [email protected]
> http://lists.busybox.net/mailman/listinfo/uclibc
> 
_______________________________________________
uClibc mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/uclibc

Reply via email to