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 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] |