From patchwork Wed Jun 25 23:24:05 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roland McGrath X-Patchwork-Id: 1752 Received: (qmail 2382 invoked by alias); 25 Jun 2014 23:24:09 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 2371 invoked by uid 89); 25 Jun 2014 23:24:08 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL, BAYES_00 autolearn=ham version=3.3.2 X-HELO: topped-with-meat.com MIME-Version: 1.0 From: Roland McGrath To: "Joseph S. Myers" Cc: "GNU C. Library" Subject: Re: [PATCH roland/nptl-mips] MIPS: Consolidate NPTL/non versions of vfork In-Reply-To: Joseph S. Myers's message of Wednesday, 25 June 2014 22:21:18 +0000 References: <20140625220124.0BD4F2C39D4@topped-with-meat.com> Message-Id: <20140625232405.6D1982C398B@topped-with-meat.com> Date: Wed, 25 Jun 2014 16:24:05 -0700 (PDT) X-CMAE-Score: 0 X-CMAE-Analysis: v=2.1 cv=SvUDtp+0 c=1 sm=1 tr=0 a=WkljmVdYkabdwxfqvArNOQ==:117 a=14OXPxybAAAA:8 a=9m3u6dYJseoA:10 a=Z6MIti7PxpgA:10 a=kj9zAlcOel0A:10 a=hOe2yjtxAAAA:8 a=mDV3o1hIAAAA:8 a=uokKZjG9cCAt_s44q6EA:9 a=CjuIK1q_8ugA:10 > This appears to be a copy of the clone patch, not a vfork patch.... Oops. The branch had the right thing. > The generic pt-vfork.c gives a #error for the non-IFUNC case. The AArch64 > version (which I now notice is returning void not pid_t, which looks > suspicious to me) won't work for MIPS n32/n64 - for the 64-bit ABIs, gp > ($28) is callee-saved, and so the attempt at a tail call involves saving > the caller's value and computing a new value, then restoring the old value > of gp after the non-tail call before returning. It might work for o32, > but it seems simpler just to #include the alpha version for all three > ABIs. OK. I've updated the branch to do that. The new patch is below. Thanks, Roland * sysdeps/unix/sysv/linux/mips/vfork.S: Incorporate SAVE_PID and RESTORE_PID blocks from nptl/pt-vfork.S. * sysdeps/unix/sysv/linux/mips/nptl/vfork.S: File removed. * sysdeps/unix/sysv/linux/mips/nptl/pt-vfork.S: File removed. * sysdeps/unix/sysv/linux/mips/pt-vfork.S: New file. diff --git a/sysdeps/unix/sysv/linux/mips/nptl/pt-vfork.S b/sysdeps/unix/sysv/linux/mips/nptl/pt-vfork.S deleted file mode 100644 index 85c55c9..0000000 --- a/sysdeps/unix/sysv/linux/mips/nptl/pt-vfork.S +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright (C) 2005-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - 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 - . */ - -#include - -/* Save the PID value. */ -#define SAVE_PID \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Negate it. */ \ - sw a2, PID_OFFSET(v1); /* Store the temporary PID. */ - -/* Restore the old PID value in the parent. */ -#define RESTORE_PID \ - beqz v0, 1f; /* If we are the parent... */ \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Re-negate it. */ \ - sw a2, PID_OFFSET(v1); /* Restore the PID. */ \ -1: - -#include diff --git a/sysdeps/unix/sysv/linux/mips/nptl/vfork.S b/sysdeps/unix/sysv/linux/mips/nptl/vfork.S deleted file mode 100644 index 7f1068c..0000000 --- a/sysdeps/unix/sysv/linux/mips/nptl/vfork.S +++ /dev/null @@ -1,41 +0,0 @@ -/* Copyright (C) 2005-2014 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - 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 - . */ - -#include - -/* Save the PID value. */ -#define SAVE_PID \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Negate it. */ \ - bnez a2, 1f; /* If it was zero... */ \ - lui a2, 0x8000; /* use 0x80000000 instead. */ \ -1: sw a2, PID_OFFSET(v1); /* Store the temporary PID. */ - -/* Restore the old PID value in the parent. */ -#define RESTORE_PID \ - beqz v0, 1f; /* If we are the parent... */ \ - READ_THREAD_POINTER(v1); /* Get the thread pointer. */ \ - lw a2, PID_OFFSET(v1); /* Load the saved PID. */ \ - subu a2, $0, a2; /* Re-negate it. */ \ - lui a0, 0x8000; /* Load 0x80000000... */ \ - bne a2, a0, 2f; /* ... compare against it... */ \ - li a2, 0; /* ... use 0 instead. */ \ -2: sw a2, PID_OFFSET(v1); /* Restore the PID. */ \ -1: - -#include diff --git a/sysdeps/unix/sysv/linux/mips/pt-vfork.S b/sysdeps/unix/sysv/linux/mips/pt-vfork.S new file mode 100644 index 0000000..65cc382 --- /dev/null +++ b/sysdeps/unix/sysv/linux/mips/pt-vfork.S @@ -0,0 +1 @@ +#include diff --git a/sysdeps/unix/sysv/linux/mips/vfork.S b/sysdeps/unix/sysv/linux/mips/vfork.S index 0913d6b..80c362d 100644 --- a/sysdeps/unix/sysv/linux/mips/vfork.S +++ b/sysdeps/unix/sysv/linux/mips/vfork.S @@ -21,14 +21,7 @@ #include #include #include - -#ifndef SAVE_PID -#define SAVE_PID -#endif - -#ifndef RESTORE_PID -#define RESTORE_PID -#endif +#include /* int vfork() */ @@ -67,7 +60,13 @@ NESTED(__vfork,FRAMESZ,sp) PTR_ADDU sp, FRAMESZ cfi_adjust_cfa_offset (-FRAMESZ) - SAVE_PID + /* Save the PID value. */ + READ_THREAD_POINTER(v1) /* Get the thread pointer. */ + lw a2, PID_OFFSET(v1) /* Load the saved PID. */ + subu a2, $0, a2 /* Negate it. */ + bnez a2, 1f /* If it was zero... */ + lui a2, 0x8000 /* use 0x80000000 instead. */ +1: sw a2, PID_OFFSET(v1) /* Store the temporary PID. */ li a0, 0x4112 /* CLONE_VM | CLONE_VFORK | SIGCHLD */ move a1, sp @@ -76,7 +75,16 @@ NESTED(__vfork,FRAMESZ,sp) li v0,__NR_clone syscall - RESTORE_PID + /* Restore the old PID value in the parent. */ + beqz v0, 1f /* If we are the parent... */ + READ_THREAD_POINTER(v1) /* Get the thread pointer. */ + lw a2, PID_OFFSET(v1) /* Load the saved PID. */ + subu a2, $0, a2 /* Re-negate it. */ + lui a0, 0x8000 /* Load 0x80000000... */ + bne a2, a0, 2f /* ... compare against it... */ + li a2, 0 /* ... use 0 instead. */ +2: sw a2, PID_OFFSET(v1) /* Restore the PID. */ +1: cfi_remember_state bnez a3,L(error)