From patchwork Wed Jun 25 20:04:09 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 1736 Received: (qmail 10717 invoked by alias); 25 Jun 2014 20:04:13 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 10708 invoked by uid 89); 25 Jun 2014 20:04:12 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "GNU C. Library" Subject: [PATCH roland/nptl-ia64] IA64: Consolidate NPTL/non versions of vfork Message-Id: <20140625200409.177302C39F4@topped-with-meat.com> Date: Wed, 25 Jun 2014 13:04:09 -0700 (PDT) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=IpD8RWA4bVMA:10 a=Z6MIti7PxpgA:10 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=mDV3o1hIAAAA:8 a=Lq2aNwQma40jDWiqItsA:9 a=CjuIK1q_8ugA:10 Not tested at all. Based on rth's advice about the syntax and safety of a tail call to PLT. Thanks, Roland * sysdeps/unix/sysv/linux/ia64/nptl/vfork.S: Moved ... * sysdeps/unix/sysv/linux/ia64/vfork.S: ... here. (__libc_vfork): Define function under this name. (__vfork): Define as an alias. * sysdeps/unix/sysv/linux/ia64/pt-vfork.S: New file. * sysdeps/unix/sysv/linux/ia64/nptl/pt-vfork.S: File removed. diff --git a/sysdeps/unix/sysv/linux/ia64/nptl/pt-vfork.S b/sysdeps/unix/sysv/linux/ia64/nptl/pt-vfork.S deleted file mode 100644 index 59b5b7a..0000000 --- a/sysdeps/unix/sysv/linux/ia64/nptl/pt-vfork.S +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright (C) 2000-2014 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, see - . */ - - -#include -#define _SIGNAL_H -#include -#include - -/* 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) - .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 - adds r14=PID,r13 - ;; - ld4 r16=[r14] - ;; - sub r15=0,r16 - 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 - adds r14=PID,r13 - ;; -(p7) ld4 r16=[r14] - cmp.eq p6,p0=-1,r10 - ;; -(p7) sub r15=0,r16 - ;; -(p7) st4 [r14]=r15 -(p6) br.cond.spnt.few __syscall_error - ret -PSEUDO_END(__vfork) - -weak_alias (__vfork, vfork) diff --git a/sysdeps/unix/sysv/linux/ia64/nptl/vfork.S b/sysdeps/unix/sysv/linux/ia64/nptl/vfork.S deleted file mode 100644 index f1ca305..0000000 --- a/sysdeps/unix/sysv/linux/ia64/nptl/vfork.S +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright (C) 2000-2014 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, see - . */ - - -#include -#define _SIGNAL_H -#include -#include - -/* 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) - .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 - 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 (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/sysdeps/unix/sysv/linux/ia64/pt-vfork.S b/sysdeps/unix/sysv/linux/ia64/pt-vfork.S new file mode 100644 index 0000000..2816e8d --- /dev/null +++ b/sysdeps/unix/sysv/linux/ia64/pt-vfork.S @@ -0,0 +1,46 @@ +/* vfork ABI-compatibility entry points for libpthread. IA64 version. + Copyright (C) 2014 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, see + . */ + +#include + +/* libpthread used to have its own vfork implementation that differed + from libc's only in having a pointless micro-optimization. There + is no longer any use to having a separate copy in libpthread, but + the historical ABI requires it. For static linking, there is no + need to provide anything here--the libc version will be linked in. + For shared library ABI compatibility, there must be __vfork and + vfork symbols in libpthread.so. */ + +#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \ + || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20)) + +LOCAL_LEAF (vfork_compat) + br __libc_vfork + ;; +END (vfork_compat) + +#endif + +#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) +compat_symbol (libpthread, vfork_compat, vfork, GLIBC_2_0); +#endif + +#if SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20) +strong_alias (vfork_compat, __vfork_compat) +compat_symbol (libpthread, __vfork_compat, __vfork, GLIBC_2_1_2); +#endif diff --git a/sysdeps/unix/sysv/linux/ia64/vfork.S b/sysdeps/unix/sysv/linux/ia64/vfork.S index 0422104..ff2d22b 100644 --- a/sysdeps/unix/sysv/linux/ia64/vfork.S +++ b/sysdeps/unix/sysv/linux/ia64/vfork.S @@ -19,6 +19,7 @@ #include #define _SIGNAL_H #include +#include /* The following are defined in linux/sched.h, which unfortunately */ /* is not safe for inclusion in an assembly file. */ @@ -28,16 +29,42 @@ /* pid_t vfork(void); */ /* Implemented as __clone_syscall(CLONE_VFORK | CLONE_VM | SIGCHLD, 0) */ -ENTRY(__vfork) +ENTRY (__libc_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 + 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. */ ;; - DO_CALL_VIA_BREAK (SYS_ify (clone)) + st4 [r14]=r15 + DO_CALL (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) +PSEUDO_END (__libc_vfork) +strong_alias (__libc_vfork, __vfork) +libc_hidden_def (__vfork) weak_alias (__vfork, vfork)