From 3d1024e8d159ec5f0f3899c02af5473f5b0ec49c Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Mon, 26 May 2014 11:41:28 -0500 Subject: PowerPC: Consolidate NPTL/non versions of vfork --- sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S | 28 +++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S') diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S index ebffc4c5af..72e6da85a1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S @@ -19,6 +19,7 @@ #define _ERRNO_H 1 #include #include +#include /* 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) -- cgit 1.4.1