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] vfork patch for SH


Hi,

The attached is the vfork fix of SH and adding correct syscall error
handling for non-PIC case which was forgotten in the previous patch.

Regards,
	kaz
--
2003-01-11  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/unix/sysv/linux/sh/sysdep.h (SYSCALL_ERROR_HANDLER):
	Add non-PIC case.
	* sysdeps/unix/sysv/linux/sh/vfork.S (__vfork): Handle
	SINGLE_THREAD_P case.

diff -urN ORIG/libc/sysdeps/unix/sysv/linux/sh/sysdep.h LOCAL/libc/sysdeps/unix/sysv/linux/sh/sysdep.h
--- ORIG/libc/sysdeps/unix/sysv/linux/sh/sysdep.h	Wed Jan  8 08:37:36 2003
+++ LOCAL/libc/sysdeps/unix/sysv/linux/sh/sysdep.h	Sat Jan 11 10:07:19 2003
@@ -66,7 +66,12 @@
   END (name)
 
 #ifndef PIC
-# define SYSCALL_ERROR_HANDLER	/* Nothing here; code in sysdep.S is used.  */
+# define SYSCALL_ERROR_HANDLER	\
+	mov.l 0f,r1; \
+	jmp @r1; \
+	 mov r0,r4; \
+	.align 2; \
+     0: .long __syscall_error
 #else
 # if RTLD_PRIVATE_ERRNO
 #  define SYSCALL_ERROR_HANDLER	\
diff -urN ORIG/libc/sysdeps/unix/sysv/linux/sh/vfork.S LOCAL/libc/sysdeps/unix/sysv/linux/sh/vfork.S
--- ORIG/libc/sysdeps/unix/sysv/linux/sh/vfork.S	Wed Jan  8 08:37:36 2003
+++ LOCAL/libc/sysdeps/unix/sysv/linux/sh/vfork.S	Sat Jan 11 10:43:53 2003
@@ -16,7 +16,7 @@
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <sysdep.h>
+#include <sysdep-cancel.h>
 #define _ERRNO_H	1
 #include <bits/errno.h>
 
@@ -26,32 +26,10 @@
    and the process ID of the new process to the old process.  */
 
 ENTRY (__vfork)
+	SINGLE_THREAD_P
+	bf .Lhidden_fork
 
-#ifdef __NR_vfork
-	mov.w	.L3, r3
-	trapa	#0x10
-	mov     r0, r1
-	mov	#-12, r2
-	shad	r2, r1
-	not	r1, r1			// r1=0 means r0 = -1 to -4095
-	tst	r1, r1			// i.e. error in linux
-	bf	1f
-	mov.w	.L1, r1
-	cmp/eq	r1, r0
-	bt	2f
-	bra	.Lsyscall_error
-	 nop
-.L1:
-	.word	-ENOSYS
-.L3:	.word	__NR_vfork
-1:
-	rts
-	 nop
-2:
-#endif
-
-	/* If we don't have vfork, fork is close enough.  */
-	mov	#+__NR_fork, r3
+	mov.w	.L1, r3
 	trapa	#0x10
 	mov     r0, r1
 	mov	#-12, r2
@@ -59,11 +37,19 @@
 	not	r1, r1			// r1=0 means r0 = -1 to -4095
 	tst	r1, r1			// i.e. error in linux
 	bf	.Lpseudo_end
-.Lsyscall_error:	
 	SYSCALL_ERROR_HANDLER
 .Lpseudo_end:
 	rts
 	 nop
+.L1:	.word	__NR_vfork
+
+.Lhidden_fork:	
+	mov.l	.L2, r1
+	braf	r1
+	 nop
+1:
+	.align 2
+.L2:	.long	HIDDEN_JUMPTARGET(__fork)-1b
 
 PSEUDO_END (__vfork)
 libc_hidden_def (__vfork)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]