mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
PowerPC: Consolidate NPTL/non versions of vfork
This commit is contained in:
@ -19,6 +19,7 @@
|
||||
#define _ERRNO_H 1
|
||||
#include <bits/errno.h>
|
||||
#include <kernel-features.h>
|
||||
#include <tcb-offsets.h>
|
||||
|
||||
/* Clone the calling process, but without copying the whole address space.
|
||||
The calling process is suspended until the new process exits or is
|
||||
@ -27,9 +28,36 @@
|
||||
|
||||
ENTRY (__vfork)
|
||||
CALL_MCOUNT 0
|
||||
|
||||
/* Load the TCB-cached PID value and negates it. If It it is zero
|
||||
sets it to 0x800000. And then sets its value again on TCB field.
|
||||
See raise.c for the logic that relies on this value. */
|
||||
lwz r0,PID(r13)
|
||||
cmpwi cr0,r0,0
|
||||
neg r0,r0
|
||||
bne- cr0,1f
|
||||
lis r0,0x8000
|
||||
1: stw r0,PID(r13)
|
||||
|
||||
DO_CALL (SYS_ify (vfork))
|
||||
|
||||
cmpwi cr1,r3,0
|
||||
beqlr- 1
|
||||
|
||||
/* 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. */
|
||||
lwz r0,PID(r13)
|
||||
clrlwi r4,r0,1
|
||||
cmpwi cr1,r4,0
|
||||
beq- cr1,1f
|
||||
neg r4,r0
|
||||
1: stw r4,PID(r13)
|
||||
|
||||
PSEUDO_RET
|
||||
|
||||
PSEUDO_END (__vfork)
|
||||
libc_hidden_def (__vfork)
|
||||
|
||||
weak_alias (__vfork, vfork)
|
||||
strong_alias (__vfork, __libc_vfork)
|
||||
|
Reference in New Issue
Block a user