From patchwork Fri May 23 18:18:32 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 352005 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id D728014007C for ; Sat, 24 May 2014 04:19:36 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=qk8d7L0jAxw6En5R+aYoVb4praNZ1yj /9EqWg4QfI89h2n/r1gbN2FxpzWdvMtPsn1W3NoD73YjUjbuu/3cOiazTdERTj8y eJya8X2eRC3G2cmiCF+euU6rKvqyvnAoTYakIbs4kKNT9ZGcw5t/EnichK2zYKSJ vYNd3R2oM808= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=D9RXkApkwLA8mpuE/y5/eHQ/+6o=; b=LbrBM VMjYfaXNZLTyHHe2uql+1pQaJpPzZJ6+SEf9PgZYV3okwZszeTsIkryXwg8v3Q4Y 24TGq/gW769JSbn466EGcc8tqIuyRtzxcfLpe07ezCMxCph+iL+sNRShRGaWfw9G lu/NahYXB2EHOleqttfnl8FGeoKcM9BuavaWuI= Received: (qmail 5085 invoked by alias); 23 May 2014 18:19:12 -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 4995 invoked by uid 89); 23 May 2014 18:19:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.9 required=5.0 tests=AWL, BAYES_50, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-qg0-f41.google.com X-Received: by 10.140.109.70 with SMTP id k64mr8955156qgf.92.1400869147949; Fri, 23 May 2014 11:19:07 -0700 (PDT) From: Richard Henderson To: libc-alpha@sourceware.org Subject: [COMMITTED 3/4] alpha: Consolidate NPTL/non versions of vfork Date: Fri, 23 May 2014 11:18:32 -0700 Message-Id: <1400869113-11768-3-git-send-email-rth@twiddle.net> In-Reply-To: <1400869113-11768-1-git-send-email-rth@twiddle.net> References: <1400869113-11768-1-git-send-email-rth@twiddle.net> --- ChangeLog | 8 +++++ sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S | 42 ---------------------- sysdeps/unix/sysv/linux/alpha/pt-vfork.S | 34 ++++++++++++++++++ sysdeps/unix/sysv/linux/alpha/syscalls.list | 1 - sysdeps/unix/sysv/linux/alpha/{nptl => }/vfork.S | 44 +++++++++++++++--------- 5 files changed, 70 insertions(+), 59 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S create mode 100644 sysdeps/unix/sysv/linux/alpha/pt-vfork.S rename sysdeps/unix/sysv/linux/alpha/{nptl => }/vfork.S (56%) diff --git a/ChangeLog b/ChangeLog index 83b3599..faee2f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2014-05-23 Richard Henderson + * sysdeps/unix/sysv/linux/alpha/syscalls.list: Remove vfork. + * sysdeps/unix/sysv/linux/alpha/nptl/vfork.S: Move file ... + * sysdeps/unix/sysv/linux/alpha/vfork.S: ... here. Restore PID + before exiting on error. + (__libc_vfork): New strong alias. + * sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S: Remove file. + * sysdeps/unix/sysv/linux/alpha/pt-vfork.S: New file. + * sysdeps/unix/sysv/linux/alpha/clone.S: Deconditionalize the code that was previously under [RESET_PID]. * sysdeps/unix/sysv/linux/alpha/nptl/clone.S: File removed. diff --git a/sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S b/sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S deleted file mode 100644 index 769826e..0000000 --- a/sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (C) 2003-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 -#include - -#undef PSEUDO_PREPARE_ARGS -#define PSEUDO_PREPARE_ARGS \ - /* Load the current cached pid value across the vfork. */ \ - rduniq; \ - ldl a2, PID_OFFSET(v0); \ - mov v0, a1; \ - /* Write back its negation, to indicate that the pid value is \ - uninitialized in the child, and in the window between \ - here and the point at which we restore the value. */ \ - negl a2, t0; \ - stl t0, PID_OFFSET(v0); - -PSEUDO (__vfork, vfork, 0) - - /* If we're back in the parent, restore the saved pid. */ - beq v0, 1f - stl a2, PID_OFFSET(a1) -1: ret - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/sysdeps/unix/sysv/linux/alpha/pt-vfork.S b/sysdeps/unix/sysv/linux/alpha/pt-vfork.S new file mode 100644 index 0000000..1d13736 --- /dev/null +++ b/sysdeps/unix/sysv/linux/alpha/pt-vfork.S @@ -0,0 +1,34 @@ +/* vfork ABI-compatibility entry points for libpthread. + 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)) + +#include + +#endif diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list index 319ca90..cad1fc3 100644 --- a/sysdeps/unix/sysv/linux/alpha/syscalls.list +++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list @@ -14,7 +14,6 @@ semget - semget i:iii __semget semget oldsemctl EXTRA semctl i:iiii __old_semctl semctl@GLIBC_2.0 sigstack - sigstack 2 sigstack -vfork - vfork 0 __vfork vfork getpriority - getpriority i:ii __getpriority getpriority diff --git a/sysdeps/unix/sysv/linux/alpha/nptl/vfork.S b/sysdeps/unix/sysv/linux/alpha/vfork.S similarity index 56% rename from sysdeps/unix/sysv/linux/alpha/nptl/vfork.S rename to sysdeps/unix/sysv/linux/alpha/vfork.S index 083b341..0507d35 100644 --- a/sysdeps/unix/sysv/linux/alpha/nptl/vfork.S +++ b/sysdeps/unix/sysv/linux/alpha/vfork.S @@ -18,28 +18,40 @@ #include #include -#undef PSEUDO_PREPARE_ARGS -#define PSEUDO_PREPARE_ARGS \ - /* Load the current cached pid value across the vfork. */ \ - rduniq; \ - ldl a2, PID_OFFSET(v0); \ - mov v0, a1; \ - /* If the cached value is initialized (nonzero), then write \ - back its negation, or INT_MIN, to indicate that the pid \ - value is uninitialized in the child, and in the window \ - between here and the point at which we restore the value. */ \ - ldah t0, -0x8000; \ - negl a2, t1; \ - cmovne a2, t1, t0; \ +ENTRY(__vfork) + PSEUDO_PROLOGUE + + /* Load the thread pointer value in A1 across the vfork. */ + rduniq + mov v0, a1 + + /* Save the TCB-cached PID away in A2, and then negate the TCB + field. But if it's zero, set it to 0x80000000 instead. See + raise.c for the logic that relies on this value. */ + ldl a2, PID_OFFSET(v0) + ldah t0, -0x8000 + negl a2, t1 + cmovne a2, t1, t0 stl t0, PID_OFFSET(v0); -PSEUDO (__vfork, vfork, 0) + lda v0, SYS_ify(vfork) + call_pal PAL_callsys - /* If we're back in the parent, restore the saved pid. */ + /* Restore the original value of the TCB cache of the PID, if we're + the parent. But in the child (syscall return value equals zero), + leave things as they are. */ beq v0, 1f stl a2, PID_OFFSET(a1) -1: ret +1: + /* Normal error check and return. */ + bne a3, SYSCALL_ERROR_LABEL + ret PSEUDO_END (__vfork) libc_hidden_def (__vfork) + weak_alias (__vfork, vfork) + +#if !NOT_IN_libc +strong_alias (__vfork, __libc_vfork) +#endif