]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/alpha/vfork.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / alpha / vfork.S
CommitLineData
f7a9f785 1/* Copyright (C) 2004-2016 Free Software Foundation, Inc.
76deb697
RH
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
ab84e3ff
PE
15 License along with the GNU C Library. If not, see
16 <http://www.gnu.org/licenses/>. */
76deb697
RH
17
18#include <sysdep.h>
19#include <tcb-offsets.h>
20
82aab97c 21ENTRY(__libc_vfork)
e2fa4bc2
RH
22 PSEUDO_PROLOGUE
23
24 /* Load the thread pointer value in A1 across the vfork. */
25 rduniq
26 mov v0, a1
27
28 /* Save the TCB-cached PID away in A2, and then negate the TCB
29 field. But if it's zero, set it to 0x80000000 instead. See
30 raise.c for the logic that relies on this value. */
31 ldl a2, PID_OFFSET(v0)
32 ldah t0, -0x8000
33 negl a2, t1
34 cmovne a2, t1, t0
76deb697
RH
35 stl t0, PID_OFFSET(v0);
36
e2fa4bc2
RH
37 lda v0, SYS_ify(vfork)
38 call_pal PAL_callsys
76deb697 39
e2fa4bc2
RH
40 /* Restore the original value of the TCB cache of the PID, if we're
41 the parent. But in the child (syscall return value equals zero),
42 leave things as they are. */
76deb697
RH
43 beq v0, 1f
44 stl a2, PID_OFFSET(a1)
e2fa4bc2
RH
451:
46 /* Normal error check and return. */
47 bne a3, SYSCALL_ERROR_LABEL
48 ret
76deb697 49
82aab97c 50PSEUDO_END (__libc_vfork)
e2fa4bc2 51
4f41c682 52#if IS_IN (libc)
82aab97c
RH
53weak_alias (__libc_vfork, vfork)
54strong_alias (__libc_vfork, __vfork)
55libc_hidden_def (__vfork)
e2fa4bc2 56#endif