]>
Commit | Line | Data |
---|---|---|
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 | 21 | ENTRY(__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 |
45 | 1: |
46 | /* Normal error check and return. */ | |
47 | bne a3, SYSCALL_ERROR_LABEL | |
48 | ret | |
76deb697 | 49 | |
82aab97c | 50 | PSEUDO_END (__libc_vfork) |
e2fa4bc2 | 51 | |
4f41c682 | 52 | #if IS_IN (libc) |
82aab97c RH |
53 | weak_alias (__libc_vfork, vfork) |
54 | strong_alias (__libc_vfork, __vfork) | |
55 | libc_hidden_def (__vfork) | |
e2fa4bc2 | 56 | #endif |