diff options
34 files changed, 530 insertions, 48 deletions
diff --git a/ChangeLog b/ChangeLog index 489d79de11..e07376681d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,50 @@ +2004-03-10 Jakub Jelinek <jakub@redhat.com> + + * include/libc-symbols.h [__ASSEMBLY__] (compat_text_section, + compat_data_section): Define. + * sysdeps/unix/sysv/linux/alpha/adjtime.c (ADJTIME): Add + attribute_compat_text_section. + * sysdeps/unix/sysv/linux/alpha/wordexp.c (__old_wordexp): Likewise. + * sysdeps/unix/sysv/linux/alpha/oldglob.c (__old_glob, + __old_globfree): Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/chown.c (__chown_is_lchown): + Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c + (__posix_fadvise64_l32): Likewise. + * sysdeps/unix/sysv/linux/msgctl.c (__old_msgctl): Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c + (__posix_fadvise64_l32): Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c (__old_semctl): + Likewise. + * sysdeps/unix/sysv/linux/semctl.c (__old_semctl): Likewise. + * sysdeps/unix/sysv/linux/posix_fadvise64.c (__posix_fadvise64_l32): + Likewise. + * sysdeps/unix/sysv/linux/shmctl.c (__old_shmctl): Likewise. + * hurd/compat-20.c (_hurd_proc_init_compat_20): Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S + (__swapcontext, __novec_swapcontext): Use END instead of PSEUDO_END. + (__novec_swapcontext, __swapcontext_stub): Add compat_text_section. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S + (__makecontext_stub): Likewise. + (__novec_makecontext): Likewise. Fix name in END () to match + function name. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S + (__setcontext): Use END instead of PSEUDO_END. + (__novec_setcontext): Add compat_text_section. Use END instead of + PSEUDO_END, fix the name in END () to match function name. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S + (__getcontext, __novec_getcontext): Use END instead of PSEUDO_END. + (__novec_getcontext, __getcontext_stub): Add compat_text_section. + +2004-03-10 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * sysdeps/sh/dl-machine.h: Don't use GL macro if not appropriate. + (COPY_UNALIGNED_WORD): Remove cast used as lvalue. + +2004-03-10 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/i386/dl-procinfo.h (HWCAP_IMPORTANT): Remove mmx, add sse2. + 2004-03-10 Richard Henderson <rth@redhat.com> * sysdeps/generic/errno.c: Disable versioning for rtld. diff --git a/hurd/compat-20.c b/hurd/compat-20.c index 8c075c9eb0..c55e3e266a 100644 --- a/hurd/compat-20.c +++ b/hurd/compat-20.c @@ -1,5 +1,5 @@ /* Old-versioned functions for binary compatibility with glibc-2.0. - Copyright (C) 1998, 2000 Free Software Foundation, Inc. + Copyright (C) 1998, 2000, 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 @@ -28,6 +28,7 @@ #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) void +attribute_compat_text_section _hurd_proc_init_compat_20 (char **argv) { _hurd_proc_init (argv, NULL, 0); diff --git a/include/libc-symbols.h b/include/libc-symbols.h index 4d87b2d4dc..e7074a6064 100644 --- a/include/libc-symbols.h +++ b/include/libc-symbols.h @@ -761,9 +761,14 @@ for linking") /* Move compatibility symbols out of the way by placing them all in a special section. */ -#define attribute_compat_text_section \ +#ifndef __ASSEMBLER__ +# define attribute_compat_text_section \ __attribute__ ((section (".text.compat"))) -#define attribute_compat_data_section \ +# define attribute_compat_data_section \ __attribute__ ((section (".data.compat"))) +#else +# define compat_text_section .section ".text.compat", "ax"; +# define compat_data_section .section ".data.compat", "aw"; +#endif #endif /* libc-symbols.h */ diff --git a/nptl/ChangeLog b/nptl/ChangeLog index 2ca0c7c6d4..94d2273f92 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,30 @@ +2004-03-10 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S: Include + tcb-offsets.h. + (__vfork): Negate PID if non-zero and set to INT_MIN if zero + before syscall, set to the old value in the parent afterwards. + * sysdeps/unix/sysv/linux/s390/s390-32/vfork.S: New file. + * sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S: Include + tcb-offsets.h. + (__vfork): Negate PID if non-zero and set to INT_MIN if zero + before syscall, set to the old value in the parent afterwards. + * sysdeps/unix/sysv/linux/s390/s390-64/vfork.S: New file. + * sysdeps/s390/tcb-offsets.sym: Add PID. + + * sysdeps/unix/sysv/linux/sparc/pt-vfork.S: Remove. + * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: New file. + * sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S: New file. + * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: New file. + * sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S: New file. + * sysdeps/sparc/tcb-offsets.sym: Add PID. + +2004-03-10 Andreas Schwab <schwab@suse.de> + + * sysdeps/ia64/tcb-offsets.sym: Add PID. + * sysdeps/unix/sysv/linux/ia64/vfork.S: New file. + * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: Properly handle PID cache. + 2004-03-09 Jakub Jelinek <jakub@redhat.com> * tst-cancel20.c (do_one_test): Clear in_sh_body first. diff --git a/nptl/sysdeps/ia64/tcb-offsets.sym b/nptl/sysdeps/ia64/tcb-offsets.sym index 24dc3e9683..09ea70ddc7 100644 --- a/nptl/sysdeps/ia64/tcb-offsets.sym +++ b/nptl/sysdeps/ia64/tcb-offsets.sym @@ -1,5 +1,6 @@ #include <sysdep.h> #include <tls.h> +PID offsetof (struct pthread, pid) - sizeof (struct pthread) MULTIPLE_THREADS_OFFSET offsetof (struct pthread, header.multiple_threads) - sizeof (struct pthread) SYSINFO_OFFSET offsetof (tcbhead_t, private) diff --git a/nptl/sysdeps/s390/tcb-offsets.sym b/nptl/sysdeps/s390/tcb-offsets.sym index aee6be2570..c6e230a315 100644 --- a/nptl/sysdeps/s390/tcb-offsets.sym +++ b/nptl/sysdeps/s390/tcb-offsets.sym @@ -2,3 +2,4 @@ #include <tls.h> MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) +PID offsetof (struct pthread, pid) diff --git a/nptl/sysdeps/sparc/tcb-offsets.sym b/nptl/sysdeps/sparc/tcb-offsets.sym index aee6be2570..c6e230a315 100644 --- a/nptl/sysdeps/sparc/tcb-offsets.sym +++ b/nptl/sysdeps/sparc/tcb-offsets.sym @@ -2,3 +2,4 @@ #include <tls.h> MULTIPLE_THREADS_OFFSET offsetof (tcbhead_t, multiple_threads) +PID offsetof (struct pthread, pid) diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/ia64/pt-vfork.S index a8e2e492d3..f59227c695 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/pt-vfork.S +++ b/nptl/sysdeps/unix/sysv/linux/ia64/pt-vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 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 @@ -32,13 +32,22 @@ ENTRY(__vfork) .prologue // work around a GAS bug which triggers if .body // first .prologue is not at the beginning of proc. - alloc r2=ar.pfs,0,0,2,0 + alloc r2=ar.pfs,0,1,2,0 + adds r14=PID,r13 + ;; + ld4 loc0=[r14] + ;; + sub r15=0,loc0 mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD mov out1=0 /* Standard sp value. */ ;; + st4 [r14]=r15 DO_CALL (SYS_ify (clone)) + cmp.eq p0,p7=0,r8 cmp.eq p6,p0=-1,r10 + adds r14=PID,r13 ;; +(p7) st4 [r14]=loc0 (p6) br.cond.spnt.few __syscall_error ret PSEUDO_END(__vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/vfork.S b/nptl/sysdeps/unix/sysv/linux/ia64/vfork.S new file mode 100644 index 0000000000..bbb34d94f0 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/ia64/vfork.S @@ -0,0 +1,68 @@ +/* Copyright (C) 2000, 2002, 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + + +#include <sysdep.h> +#define _SIGNAL_H +#include <bits/signum.h> +#include <tcb-offsets.h> + +/* The following are defined in linux/sched.h, which unfortunately */ +/* is not safe for inclusion in an assembly file. */ +#define CLONE_VM 0x00000100 /* set if VM shared between processes */ +#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */ + +/* pid_t vfork(void); */ +/* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */ + +ENTRY(__vfork) + alloc r2=ar.pfs,0,0,2,0 + adds r14=PID,r13 + ;; + ld4 r16=[r14] + ;; + sub r15=0,r16 + cmp.eq p6,p0=0,r16 + ;; +(p6) movl r15=0x80000000 + mov out0=CLONE_VM+CLONE_VFORK+SIGCHLD + mov out1=0 /* Standard sp value. */ + ;; + st4 [r14]=r15 + DO_CALL_VIA_BREAK (SYS_ify (clone)) + cmp.eq p6,p0=0,r8 + adds r14=PID,r13 +(p6) br.cond.dptk 1f + ;; + ld4 r15=[r14] + ;; + extr.u r16=r15,0,31 + ;; + cmp.eq p0,p6=0,r16 + ;; +(p6) sub r16=0,r15 + ;; + st4 [r14]=r16 +1: + cmp.eq p6,p0=-1,r10 +(p6) br.cond.spnt.few __syscall_error + ret +PSEUDO_END(__vfork) +libc_hidden_def (__vfork) + +weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S index 67a5bc6613..60d6dbdef6 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/pt-vfork.S @@ -22,6 +22,7 @@ #include <bits/errno.h> #include <kernel-features.h> #include <bits/wordsize.h> +#include <tcb-offsets.h> /* Clone the calling process, but without copying the whole address space. The calling process is suspended until the new process exits or is @@ -29,9 +30,18 @@ and the process ID of the new process to the old process. */ ENTRY (__vfork) + ear %r4,%a0 + l %r3,PID(%r4) + lcr %r1,%r3 + st %r1,PID(%r4) + /* Do vfork system call. */ svc SYS_ify (vfork) + ltr %r2,%r2 + je 1f + st %r3,PID(%r4) +1: /* Check for error. */ lhi %r4,-4095 clr %r2,%r4 diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S new file mode 100644 index 0000000000..2dca28fb6f --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/vfork.S @@ -0,0 +1,57 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> +#include <kernel-features.h> +#include <bits/wordsize.h> +#include <tcb-offsets.h> + +/* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ + +ENTRY (__vfork) + ear %r4,%a0 + lhi %r1,1 + icm %r3,15,PID(%r4) + sll %r1,31 + je 1f + lcr %r1,%r3 +1: st %r1,PID(%r4) + + /* Do vfork system call. */ + svc SYS_ify (vfork) + + ltr %r2,%r2 + je 1f + st %r3,PID(%r4) +1: + /* Check for error. */ + lhi %r4,-4095 + clr %r2,%r4 + jnl SYSCALL_ERROR_LABEL + + /* Normal return. */ + br %r14 +PSEUDO_END(__vfork) + +weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S index e45165e37b..fcc7ee0804 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/pt-vfork.S @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Martin Schwidefsky <schwidefsky@de.ibm.com>, 2003. @@ -22,6 +22,7 @@ #include <bits/errno.h> #include <kernel-features.h> #include <bits/wordsize.h> +#include <tcb-offsets.h> /* Clone the calling process, but without copying the whole address space. The calling process is suspended until the new process exits or is @@ -29,9 +30,21 @@ and the process ID of the new process to the old process. */ ENTRY (__vfork) + + ear %r4,%a0 + sllg %r4,%r4,32 + ear %r4,%a1 + l %r3,PID(%r4) + lcr %r1,%r3 + st %r1,PID(%r4) + /* Do vfork system call. */ svc SYS_ify (vfork) + ltgr %r2,%r2 + je 1f + st %r3,PID(%r4) +1: /* Check for error. */ lghi %r4,-4095 clgr %r2,%r4 diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S new file mode 100644 index 0000000000..c73d849f25 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/vfork.S @@ -0,0 +1,59 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#define _ERRNO_H 1 +#include <bits/errno.h> +#include <kernel-features.h> +#include <bits/wordsize.h> +#include <tcb-offsets.h> + +/* Clone the calling process, but without copying the whole address space. + The calling process is suspended until the new process exits or is + replaced by a call to `execve'. Return -1 for errors, 0 to the new process, + and the process ID of the new process to the old process. */ + +ENTRY (__vfork) + + ear %r4,%a0 + sllg %r4,%r4,32 + ear %r4,%a1 + icm %r3,15,PID(%r4) + llilh %r1,32768 + je 1f + lcr %r1,%r3 +1: st %r1,PID(%r4) + + /* Do vfork system call. */ + svc SYS_ify (vfork) + + ltgr %r2,%r2 + je 1f + st %r3,PID(%r4) +1: + /* Check for error. */ + lghi %r4,-4095 + clgr %r2,%r4 + jnl SYSCALL_ERROR_LABEL + + /* Normal return. */ + br %r14 +PSEUDO_END(__vfork) + +weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S index 006bc96bd6..55229c9e66 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/pt-vfork.S +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/pt-vfork.S @@ -1,6 +1,6 @@ -/* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jj@ultra.linux.cz>, 1999. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -18,11 +18,25 @@ 02111-1307 USA. */ #include <sysdep.h> +#include <tcb-offsets.h> -PSEUDO (__vfork, vfork, 0) + .text +ENTRY(__vfork) + ld [%g7 + PID], %o5 + sub %g0, %o5, %o4 + st %o4, [%g7 + PID] + + LOADSYSCALL(vfork) + ta 0x10 + bcs,a __syscall_error_handler + st %o5, [%g7 + PID] + SYSCALL_ERROR_HANDLER sub %o1, 1, %o1 - retl - and %o0, %o1, %o0 + andcc %o0, %o1, %o0 + bne,a 1f + st %o5, [%g7 + PID] +1: retl + nop PSEUDO_END (__vfork) weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S new file mode 100644 index 0000000000..6a65a881af --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S @@ -0,0 +1,45 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <tcb-offsets.h> + + .text +ENTRY(__vfork) + ld [%g7 + PID], %o5 + cmp %o5, 0 + bne 1f + sub %g0, %o5, %o4 + sethi %hi(0x80000000), %o4 +1: st %o4, [%g7 + PID] + + LOADSYSCALL(vfork) + ta 0x10 + bcs,a __syscall_error_handler + st %o5, [%g7 + PID] + SYSCALL_ERROR_HANDLER + sub %o1, 1, %o1 + andcc %o0, %o1, %o0 + bne,a 1f + st %o5, [%g7 + PID] +1: retl + nop + +PSEUDO_END (__vfork) +weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S new file mode 100644 index 0000000000..e9018b2e99 --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/pt-vfork.S @@ -0,0 +1,42 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <tcb-offsets.h> + + .text +ENTRY(__vfork) + ld [%g7 + PID], %o5 + sub %g0, %o5, %o4 + st %o4, [%g7 + PID] + + LOADSYSCALL(vfork) + ta 0x6d + bcs,a,pn %xcc, __syscall_error_handler + st %o5, [%g7 + PID] + SYSCALL_ERROR_HANDLER + sub %o1, 1, %o1 + andcc %o0, %o1, %o0 + bne,a,pt %icc, 1f + st %o5, [%g7 + PID] +1: retl + nop + +PSEUDO_END (__vfork) +weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S new file mode 100644 index 0000000000..c9ccd0f57d --- /dev/null +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S @@ -0,0 +1,45 @@ +/* Copyright (C) 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +#include <sysdep.h> +#include <tcb-offsets.h> + + .text +ENTRY(__vfork) + ld [%g7 + PID], %o5 + sethi %hi(0x80000000), %o3 + cmp %o5, 0 + sub %g0, %o5, %o4 + move %icc, %o3, %o4 + st %o4, [%g7 + PID] + + LOADSYSCALL(vfork) + ta 0x6d + bcs,a,pn %xcc, __syscall_error_handler + st %o5, [%g7 + PID] + SYSCALL_ERROR_HANDLER + sub %o1, 1, %o1 + andcc %o0, %o1, %o0 + bne,a,pt %icc, 1f + st %o5, [%g7 + PID] +1: retl + nop + +PSEUDO_END (__vfork) +weak_alias (__vfork, vfork) diff --git a/sysdeps/i386/dl-procinfo.h b/sysdeps/i386/dl-procinfo.h index e6b7faf812..d114fec79e 100644 --- a/sysdeps/i386/dl-procinfo.h +++ b/sysdeps/i386/dl-procinfo.h @@ -57,7 +57,7 @@ enum HWCAP_I386_AMD3D = 1 << 31, /* XXX Which others to add here? */ - HWCAP_IMPORTANT = (HWCAP_I386_MMX) + HWCAP_IMPORTANT = (HWCAP_I386_XMM2) }; diff --git a/sysdeps/sh/dl-machine.h b/sysdeps/sh/dl-machine.h index 304fbf98f7..a0852a4e71 100644 --- a/sysdeps/sh/dl-machine.h +++ b/sysdeps/sh/dl-machine.h @@ -1,5 +1,6 @@ /* Machine-dependent ELF dynamic relocation inline functions. SH version. - Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2002, 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 @@ -417,9 +418,9 @@ _dl_start_user:\n\ static inline void __attribute__ ((unused)) dl_platform_init (void) { - if (GL(dl_platform) != NULL && *GL(dl_platform) == '\0') + if (GLRO(dl_platform) != NULL && *GLRO(dl_platform) == '\0') /* Avoid an empty string which would disturb us. */ - GL(dl_platform) = NULL; + GLRO(dl_platform) = NULL; } static inline Elf32_Addr @@ -460,20 +461,23 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, #define COPY_UNALIGNED_WORD(swp, twp, align) \ { \ void *__s = (swp), *__t = (twp); \ + unsigned char *__s1 = __s, *__t1 = __t; \ + unsigned short *__s2 = __s, *__t2 = __t; \ + unsigned long *__s4 = __s, *__t4 = __t; \ switch ((align)) \ { \ case 0: \ - *(unsigned long *) __t = *(unsigned long *) __s; \ + *__t4 = *__s4; \ break; \ case 2: \ - *((unsigned short *) __t)++ = *((unsigned short *) __s)++; \ - *((unsigned short *) __t) = *((unsigned short *) __s); \ + *__t2++ = *__s2++; \ + *__t2 = *__s2; \ break; \ default: \ - *((unsigned char *) __t)++ = *((unsigned char *) __s)++; \ - *((unsigned char *) __t)++ = *((unsigned char *) __s)++; \ - *((unsigned char *) __t)++ = *((unsigned char *) __s)++; \ - *((unsigned char *) __t) = *((unsigned char *) __s); \ + *__t1++ = *__s1++; \ + *__t1++ = *__s1++; \ + *__t1++ = *__s1++; \ + *__t1 = *__s1; \ break; \ } \ } @@ -525,7 +529,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, found. */ break; if (sym->st_size > refsym->st_size - || (sym->st_size < refsym->st_size && GL(dl_verbose))) + || (sym->st_size < refsym->st_size && GLRO(dl_verbose))) { const char *strtab; @@ -593,7 +597,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, rtld.c contains the common defn for _dl_rtld_map, which is incompatible with a weak decl in the same file. */ # ifndef SHARED - weak_extern (GL(dl_rtld_map)); + weak_extern (_dl_rtld_map); # endif if (map == &GL(dl_rtld_map)) /* Undo the relocation done here during bootstrapping. diff --git a/sysdeps/unix/sysv/linux/alpha/adjtime.c b/sysdeps/unix/sysv/linux/alpha/adjtime.c index e036896216..f8b272e9ce 100644 --- a/sysdeps/unix/sysv/linux/alpha/adjtime.c +++ b/sysdeps/unix/sysv/linux/alpha/adjtime.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000, 2002, 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 @@ -58,7 +58,7 @@ struct timex32 { #define TIMEVAL timeval32 #define TIMEX timex32 -#define ADJTIME __adjtime_tv32 +#define ADJTIME attribute_compat_text_section __adjtime_tv32 #define ADJTIMEX(x) INLINE_SYSCALL (old_adjtimex, 1, x) #define ADJTIMEX32(x) INLINE_SYSCALL (old_adjtimex, 1, x) #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) @@ -72,7 +72,9 @@ LINKAGE int ADJTIME (const struct TIMEVAL *itv, struct TIMEVAL *otv); #include <sysdeps/unix/sysv/linux/adjtime.c> #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) -int __adjtimex_tv32 (struct timex32 *tx) { return ADJTIMEX (tx); } +int +attribute_compat_text_section +__adjtimex_tv32 (struct timex32 *tx) { return ADJTIMEX (tx); } strong_alias (__adjtimex_tv32, __adjtimex_tv32_1); strong_alias (__adjtimex_tv32, __adjtimex_tv32_2); compat_symbol (libc, __adjtimex_tv32_1, __adjtimex, GLIBC_2_0); diff --git a/sysdeps/unix/sysv/linux/alpha/oldglob.c b/sysdeps/unix/sysv/linux/alpha/oldglob.c index 68cda76c97..9d39176f6b 100644 --- a/sysdeps/unix/sysv/linux/alpha/oldglob.c +++ b/sysdeps/unix/sysv/linux/alpha/oldglob.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000, 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 @@ -44,6 +44,7 @@ typedef struct int +attribute_compat_text_section __old_glob (const char *pattern, int flags, int (*errfunc) (const char *, int), old_glob_t *pglob) @@ -82,6 +83,7 @@ compat_symbol (libc, __old_glob, glob, GLIBC_2_0); /* Free storage allocated in PGLOB by a previous `glob' call. */ void +attribute_compat_text_section __old_globfree (old_glob_t *pglob) { glob_t correct; diff --git a/sysdeps/unix/sysv/linux/alpha/wordexp.c b/sysdeps/unix/sysv/linux/alpha/wordexp.c index 1027204071..1921a03388 100644 --- a/sysdeps/unix/sysv/linux/alpha/wordexp.c +++ b/sysdeps/unix/sysv/linux/alpha/wordexp.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001 Free Software Foundation, Inc. +/* Copyright (C) 2001, 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 @@ -38,6 +38,7 @@ typedef struct int +attribute_compat_text_section __old_wordexp (const char *words, old_wordexp_t *pwordexp, int flags) { wordexp_t we; diff --git a/sysdeps/unix/sysv/linux/msgctl.c b/sysdeps/unix/sysv/linux/msgctl.c index 24c87d3ad9..700591b2d3 100644 --- a/sysdeps/unix/sysv/linux/msgctl.c +++ b/sysdeps/unix/sysv/linux/msgctl.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1995, 1997, 1998, 2000, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2000, 2002, 2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -55,6 +56,7 @@ int __new_msgctl (int, int, struct msqid_ds *); #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) int +attribute_compat_text_section __old_msgctl (int msqid, int cmd, struct __old_msqid_ds *buf) { return INLINE_SYSCALL (ipc, 5, IPCOP_msgctl, msqid, cmd, 0, CHECK_1 (buf)); diff --git a/sysdeps/unix/sysv/linux/posix_fadvise64.c b/sysdeps/unix/sysv/linux/posix_fadvise64.c index 350a0268f5..3555ae8352 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -69,6 +69,7 @@ __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) #if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) int +attribute_compat_text_section __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) { return __posix_fadvise64_l64 (fd, offset, len, advise); diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S index 0c04df5119..baade0bfc1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/getcontext.S @@ -244,12 +244,13 @@ L(no_vec): addi r1,r1,16 mtlr r0 blr -PSEUDO_END(__getcontext) +END(__getcontext) versioned_symbol (libc, __getcontext, getcontext, GLIBC_2_3_4) #if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) + compat_text_section ENTRY(__novec_getcontext) /* * Since we are not attempting to save the altivec registers, @@ -355,7 +356,8 @@ ENTRY(__novec_getcontext) addi r1,r1,16 mtlr r0 blr -PSEUDO_END(__novec_getcontext) +END(__novec_getcontext) + .previous compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3_3) @@ -366,10 +368,12 @@ compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3_3) #define _ERRNO_H 1 #include <bits/errno.h> + compat_text_section ENTRY (__getcontext_stub) li r3,ENOSYS b JUMPTARGET(__syscall_error) - END (__getcontext_stub) +END (__getcontext_stub) + .previous compat_symbol (libc, __getcontext_stub, getcontext, GLIBC_2_1) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S index 9f34357deb..5615718e11 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/makecontext.S @@ -111,6 +111,7 @@ versioned_symbol (libc, __makecontext, makecontext, GLIBC_2_3_4) #if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) + compat_text_section ENTRY(__novec_makecontext) /* Set up the first 7 args to the function in its registers */ addi r11,r3,_UC_REG_SPACE @@ -191,7 +192,8 @@ L(novec_exitcode): 4: bl HIDDEN_JUMPTARGET(exit) b 4b -END(__makecontext) +END(__novec_makecontext) + .previous compat_symbol (libc, __novec_makecontext, makecontext, GLIBC_2_3_3) #endif @@ -201,10 +203,12 @@ compat_symbol (libc, __novec_makecontext, makecontext, GLIBC_2_3_3) #define _ERRNO_H 1 #include <bits/errno.h> + compat_text_section ENTRY (__makecontext_stub) li r3,ENOSYS b JUMPTARGET(__syscall_error) - END (__makecontext_stub) +END (__makecontext_stub) + .previous compat_symbol (libc, __makecontext_stub, makecontext, GLIBC_2_1) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c index edc21f69cd..c97bbbe879 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -65,6 +65,7 @@ __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) #if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) int +attribute_compat_text_section __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) { return __posix_fadvise64_l64 (fd, offset, len, advise); diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S index 16d5a3b745..ea0669d24b 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext.S @@ -261,12 +261,13 @@ L(do_sigret): sc /* NOTREACHED */ -PSEUDO_END (__setcontext) +END (__setcontext) versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4) #if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) + compat_text_section ENTRY(__novec_setcontext) mflr r0 stwu r1,-16(r1) @@ -388,7 +389,8 @@ L(novec_do_sigret): sc /* NOTREACHED */ -PSEUDO_END (__setcontext) +END (__novec_setcontext) + .previous compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3_3) @@ -399,10 +401,12 @@ compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3_3) #define _ERRNO_H 1 #include <bits/errno.h> + compat_text_section ENTRY (__setcontext_stub) li r3,ENOSYS b JUMPTARGET(__syscall_error) - END (__setcontext_stub) +END (__setcontext_stub) + .previous compat_symbol (libc, __setcontext_stub, setcontext, GLIBC_2_1) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S index 607f282a9a..1bf3f516b1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext.S @@ -467,12 +467,13 @@ L(do_sigret): sc /* NOTREACHED */ -PSEUDO_END(__swapcontext) +END(__swapcontext) versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4) #if SHLIB_COMPAT (libc, GLIBC_2_3_3, GLIBC_2_3_4) + compat_text_section ENTRY(__novec_swapcontext) /* Save the current context */ addi r3,r3,_UC_REG_SPACE @@ -682,7 +683,8 @@ L(novec_do_sigret): sc /* NOTREACHED */ -PSEUDO_END(__novec_swapcontext) +END(__novec_swapcontext) + .previous compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3_3) @@ -693,10 +695,12 @@ compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3_3) #define _ERRNO_H 1 #include <bits/errno.h> + compat_text_section ENTRY (__swapcontext_stub) li r3,ENOSYS b JUMPTARGET(__syscall_error) - END (__swapcontext_stub) +END (__swapcontext_stub) + .previous compat_symbol (libc, __swapcontext_stub, swapcontext, GLIBC_2_1) diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/chown.c b/sysdeps/unix/sysv/linux/s390/s390-32/chown.c index 1c7b7abc50..0656b396f8 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/chown.c +++ b/sysdeps/unix/sysv/linux/s390/s390-32/chown.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2001, 2002, 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 @@ -97,6 +97,7 @@ __real_chown (const char *file, uid_t owner, gid_t group) #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) /* Compiling for compatibiity. */ int +attribute_compat_text_section __chown_is_lchown (const char *file, uid_t owner, gid_t group) { return __lchown (file, owner, group); diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c index 6c539cd700..e0fed24af3 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 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 @@ -78,6 +78,7 @@ __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) #if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) int +attribute_compat_text_section __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) { return __posix_fadvise64_l64 (fd, offset, len, advise); diff --git a/sysdeps/unix/sysv/linux/semctl.c b/sysdeps/unix/sysv/linux/semctl.c index 07b1e6b4fa..ecd23ce53e 100644 --- a/sysdeps/unix/sysv/linux/semctl.c +++ b/sysdeps/unix/sysv/linux/semctl.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1995, 1997, 1998, 2000, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2000, 2003, 2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -63,6 +64,7 @@ int __new_semctl (int semid, int semnum, int cmd, ...); #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) int +attribute_compat_text_section __old_semctl (int semid, int semnum, int cmd, ...) { union semun arg; diff --git a/sysdeps/unix/sysv/linux/shmctl.c b/sysdeps/unix/sysv/linux/shmctl.c index 2bd92469c1..5561cca36f 100644 --- a/sysdeps/unix/sysv/linux/shmctl.c +++ b/sysdeps/unix/sysv/linux/shmctl.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1995, 1997, 1998, 2000, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1997, 1998, 2000, 2003, 2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -62,6 +63,7 @@ int __new_shmctl (int, int, struct shmid_ds *); #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) int +attribute_compat_text_section __old_shmctl (int shmid, int cmd, struct __old_shmid_ds *buf) { return INLINE_SYSCALL (ipc, 5, IPCOP_shmctl, shmid, diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c b/sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c index ebf9f52e93..b28f009b06 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/semctl.c @@ -1,5 +1,6 @@ /* Semctl for architectures where word sized unions are passed indirectly - Copyright (C) 1995,1997,1998,2000,2002,2003 Free Software Foundation, Inc. + Copyright (C) 1995, 1997, 1998, 2000, 2002, 2003, 2004 + Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. @@ -72,6 +73,7 @@ int __new_semctl (int semid, int semnum, int cmd, ...); #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) int +attribute_compat_text_section __old_semctl (int semid, int semnum, int cmd, ...) { union semun arg; |