]>
Commit | Line | Data |
---|---|---|
76deb697 RH |
1 | /* Copyright (C) 2004 Free Software Foundation, Inc. |
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 | ||
21 | #undef PSEUDO_PREPARE_ARGS | |
22 | #define PSEUDO_PREPARE_ARGS \ | |
23 | /* Load the current cached pid value across the vfork. */ \ | |
24 | rduniq; \ | |
25 | ldl a2, PID_OFFSET(v0); \ | |
26 | mov v0, a1; \ | |
27 | /* If the cached value is initialized (nonzero), then write \ | |
28 | back its negation, or INT_MIN, to indicate that the pid \ | |
29 | value is uninitialized in the the child, and in the window \ | |
30 | between here and the point at which we restore the value. */ \ | |
31 | ldah t0, -0x8000; \ | |
32 | negl a2, t1; \ | |
33 | cmovne a2, t1, t0; \ | |
34 | stl t0, PID_OFFSET(v0); | |
35 | ||
36 | PSEUDO (__vfork, vfork, 0) | |
37 | ||
38 | /* If we're back in the parent, restore the saved pid. */ | |
39 | beq v0, 1f | |
40 | stl a2, PID_OFFSET(a1) | |
41 | 1: ret | |
42 | ||
43 | PSEUDO_END (__vfork) | |
93207f7d | 44 | libc_hidden_def (__vfork) |
76deb697 | 45 | weak_alias (__vfork, vfork) |