This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi, The appended patch is an SH version of the change done in x86 clone.S. I've also found that the frame pointer wasn't cleared at the begining of the new thread. Regards, kaz -- [nptl/ChangeLog] 2004-12-07 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/sh/clone.S: New file. [ChangeLog] 2004-12-07 Kaz Kojima <kkojima@rr.iij4u.or.jp> * sysdeps/unix/sysv/linux/sh/clone.S: Clear the frame pointer when starting a new thread. Add support for NPTL where the PID is stored at userlevel and needs to be reset when CLONE_THREAD is not used. diff -u3prN ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/clone.S LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/clone.S --- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/clone.S Thu Jan 1 09:00:00 1970 +++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/clone.S Tue Dec 7 09:40:56 2004 @@ -0,0 +1,2 @@ +#define RESET_PID +#include <sysdeps/unix/sysv/linux/sh/clone.S> diff -u3prN ORIG/libc/sysdeps/unix/sysv/linux/sh/clone.S LOCAL/libc/sysdeps/unix/sysv/linux/sh/clone.S --- ORIG/libc/sysdeps/unix/sysv/linux/sh/clone.S Tue Feb 11 14:29:43 2003 +++ LOCAL/libc/sysdeps/unix/sysv/linux/sh/clone.S Tue Dec 7 10:49:02 2004 @@ -1,4 +1,4 @@ -/* Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,11 +22,13 @@ #include <sysdep.h> #define _ERRNO_H 1 #include <bits/errno.h> - +#ifdef RESET_PID +#include <tcb-offsets.h> +#endif /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg, pid_t *ptid, void *tls, pid_t *ctid); */ - .text + .text ENTRY(__clone) /* sanity check arguments. */ tst r4, r4 @@ -64,6 +66,31 @@ ENTRY(__clone) rts nop 2: + /* terminate the stack frame */ + mov #0, r14 +#ifdef RESET_PID + mov r4, r0 + shlr16 r0 + tst #1, r0 // CLONE_THREAD = (1 << 16) + bf/s 4f + mov r4, r0 + /* new pid */ + shlr8 r0 + tst #1, r0 // CLONE_VM = (1 << 8) + bf/s 3f + mov #-1, r0 + mov #+SYS_ify(getpid), r3 + trapa #0x15 +3: + stc gbr, r1 + mov.w .Lpidoff, r2 + add r1, r2 + mov.l r0, @r2 + mov.w .Ltidoff, r2 + add r1, r2 + mov.l r0, @r2 +4: +#endif /* thread starts */ mov.l @r15, r1 jsr @r1 @@ -94,6 +121,12 @@ ENTRY(__clone) .long _GLOBAL_OFFSET_TABLE_ .L3: .long PLTJMP(C_SYMBOL_NAME(_exit)) +#ifdef RESET_PID +.Lpidoff: + .word PID - TLS_PRE_TCB_SIZE +.Ltidoff: + .word TID - TLS_PRE_TCB_SIZE +#endif PSEUDO_END (__clone) weak_alias (__clone, clone)
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |