Skip to content

Commit

Permalink
alpha: Consolidate NPTL/non versions of vfork
Browse files Browse the repository at this point in the history
  • Loading branch information
Richard Henderson committed May 23, 2014
1 parent 279b24e commit e2fa4bc
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 59 deletions.
8 changes: 8 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
2014-05-23 Richard Henderson <rth@twiddle.net>

* 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.
Expand Down
42 changes: 0 additions & 42 deletions sysdeps/unix/sysv/linux/alpha/nptl/pt-vfork.S

This file was deleted.

34 changes: 34 additions & 0 deletions sysdeps/unix/sysv/linux/alpha/pt-vfork.S
Original file line number Diff line number Diff line change
@@ -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
<http://www.gnu.org/licenses/>. */

#include <shlib-compat.h>

/* 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 <vfork.S>

#endif
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/alpha/syscalls.list
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,28 +18,40 @@
#include <sysdep.h>
#include <tcb-offsets.h>

#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

0 comments on commit e2fa4bc

Please sign in to comment.