diff options
-rw-r--r-- | ChangeLog | 20 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S | 48 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S | 56 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S | 48 | ||||
-rw-r--r-- | nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S | 54 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S | 31 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S | 28 |
7 files changed, 79 insertions, 206 deletions
@@ -1,3 +1,23 @@ +2014-05-26 Adhemerval Zanella <azanella@linux.vnet.ibm.com> + + * sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: Include + <tcb-offsets.h>. + (__vfork): Incorporate save/restore of PID from nptl/vfork.S here. + (__libc_vfork): New strong alias. + * nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S: File + removed. + * nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S: File + Removed. + + * sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: Include + <tcb-offsets.h>. + (__vfork): Incorporate save/retore of PID from nptl/vfork.S here. + (__libc_vfork): New strong alias. + * nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S: File + removed. + * nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S: File + removed. + 2014-05-26 Carlos O'Donell <carlos@redhat.com> * malloc/malloc.c (mi_arena): New function. diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S deleted file mode 100644 index 81dbdeeb68..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/pt-vfork.S +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2004-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#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 - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(2) - neg 0,0 - stw 0,PID(2) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(2) - neg 0,0 - stw 0,PID(2) - - PSEUDO_RET - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S deleted file mode 100644 index e0161050b1..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S +++ /dev/null @@ -1,56 +0,0 @@ -/* Copyright (C) 2004-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#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 - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(2) - cmpwi 0,0,0 - neg 0,0 - bne- 0,1f - lis 0,0x8000 -1: stw 0,PID(2) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(2) - /* Cannot use clrlwi. here, because cr0 needs to be preserved - until PSEUDO_RET. */ - clrlwi 4,0,1 - cmpwi 1,4,0 - beq- 1,1f - neg 4,0 -1: stw 4,PID(2) - - PSEUDO_RET - -PSEUDO_END (__vfork) -libc_hidden_def (__vfork) -weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S deleted file mode 100644 index bbf570fc0a..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/pt-vfork.S +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright (C) 2004-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#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 - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(13) - neg 0,0 - stw 0,PID(13) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(13) - neg 0,0 - stw 0,PID(13) - - PSEUDO_RET - -PSEUDO_END (__vfork) - -weak_alias (__vfork, vfork) diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S deleted file mode 100644 index f8bf01699a..0000000000 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/vfork.S +++ /dev/null @@ -1,54 +0,0 @@ -/* Copyright (C) 2004-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Jakub Jelinek <jakub@redhat.com>, 2004. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <sysdep.h> -#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 - replaced by a call to `execve'. Return -1 for errors, 0 to the new process, - and the process ID of the new process to the old process. */ - -ENTRY (__vfork) - lwz 0,PID(13) - cmpwi 0,0,0 - neg 0,0 - bne- 0,1f - lis 0,0x8000 -1: stw 0,PID(13) - - DO_CALL (SYS_ify (vfork)) - - cmpwi 1,3,0 - beqlr- 1 - - lwz 0,PID(13) - clrlwi 4,0,1 - cmpwi 1,4,0 - beq- 1,1f - neg 4,0 -1: stw 4,PID(13) - - PSEUDO_RET - -PSEUDO_END (__vfork) -libc_hidden_def (__vfork) -weak_alias (__vfork, vfork) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S index 7a1e8422ad..8a8433617f 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/vfork.S @@ -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 @@ -26,9 +27,39 @@ and the process ID of the new process to the old process. */ ENTRY (__vfork) + + /* 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(r2) + cmpwi cr0,r0,0 + neg r0,r0 + bne- cr0,1f + lis r0,0x8000 +1: stw r0,PID(r2) + 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(r2) + /* Cannot use clrlwi. here, because cr0 needs to be preserved + until PSEUDO_RET. */ + clrlwi r4,r0,1 + cmpwi cr1,r4,0 + beq- cr1,1f + neg r4,r0 +1: stw r4,PID(r2) + PSEUDO_RET + PSEUDO_END (__vfork) libc_hidden_def (__vfork) weak_alias (__vfork, vfork) +strong_alias (__vfork, __libc_vfork) 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 <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) |