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]

[PATCH] SH: Fixup clone for NPTL


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]