[roland/nptl-mips] MIPS: Consolidate NPTL/non versions of vfork

Message ID 20140625220124.0BD4F2C39D4@topped-with-meat.com
State Superseded
Headers

Commit Message

Roland McGrath June 25, 2014, 10:01 p.m. UTC
  Not tested at all.  It looks to me like MIPS calls don't use a PLT per se,
but always load from the GOT and then do a proper tail call via register.
So I think the generic pt-vfork.c is safe even without IFUNC, but you tell me.


Thanks,
Roland


2014-06-25  Roland McGrath  <roland@hack.frob.com>

	* sysdeps/unix/sysv/linux/mips/clone.S: Deconditionalize the code
	that was previously under [RESET_PID].
	* sysdeps/unix/sysv/linux/mips/nptl/clone.S: File removed.
  

Comments

Joseph Myers June 25, 2014, 10:21 p.m. UTC | #1
On Wed, 25 Jun 2014, Roland McGrath wrote:

> Not tested at all.  It looks to me like MIPS calls don't use a PLT per se,
> but always load from the GOT and then do a proper tail call via register.
> So I think the generic pt-vfork.c is safe even without IFUNC, but you tell me.
> 
> 
> Thanks,
> Roland
> 
> 
> 2014-06-25  Roland McGrath  <roland@hack.frob.com>
> 
> 	* sysdeps/unix/sysv/linux/mips/clone.S: Deconditionalize the code
> 	that was previously under [RESET_PID].
> 	* sysdeps/unix/sysv/linux/mips/nptl/clone.S: File removed.

This appears to be a copy of the clone patch, not a vfork patch....

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.
  

Patch

diff --git a/sysdeps/unix/sysv/linux/mips/clone.S b/sysdeps/unix/sysv/linux/mips/clone.S
index d3fd80f..286a6b9 100644
--- a/sysdeps/unix/sysv/linux/mips/clone.S
+++ b/sysdeps/unix/sysv/linux/mips/clone.S
@@ -23,9 +23,7 @@ 
 #include <sysdep.h>
 #define _ERRNO_H	1
 #include <bits/errno.h>
-#ifdef RESET_PID
 #include <tls.h>
-#endif
 
 #define CLONE_VM      0x00000100
 #define CLONE_THREAD  0x00010000
@@ -69,9 +67,7 @@  NESTED(__clone,4*SZREG,sp)
 	PTR_SUBU	a1,32		/* Reserve argument save space.  */
 	PTR_S		a0,0(a1)	/* Save function pointer.  */
 	PTR_S		a3,PTRSIZE(a1)	/* Save argument pointer.  */
-#ifdef RESET_PID
 	LONG_S		a2,(PTRSIZE*2)(a1)	/* Save clone flags.  */
-#endif
 
 	move		a0,a2
 
@@ -134,13 +130,11 @@  L(thread_start):
 	SAVE_GP (GPOFF)
 	/* The stackframe has been created on entry of clone().  */
 
-#ifdef RESET_PID
 	/* Check and see if we need to reset the PID.  */
 	LONG_L		a0,(PTRSIZE*2)(sp)
 	and		a1,a0,CLONE_THREAD
 	beqz		a1,L(restore_pid)
 L(donepid):
-#endif
 
 	/* Restore the arg for user's function.  */
 	PTR_L		t9,0(sp)	/* Function pointer.  */
@@ -158,7 +152,6 @@  L(donepid):
 	jal		_exit
 #endif
 
-#ifdef RESET_PID
 L(restore_pid):
 	and		a1,a0,CLONE_VM
 	li		v0,-1
@@ -170,7 +163,6 @@  L(gotpid):
 	INT_S		v0,PID_OFFSET(v1)
 	INT_S		v0,TID_OFFSET(v1)
 	b		L(donepid)
-#endif
 
 	END(__thread_start)
 
diff --git a/sysdeps/unix/sysv/linux/mips/nptl/clone.S b/sysdeps/unix/sysv/linux/mips/nptl/clone.S
deleted file mode 100644
index 80c265b..0000000
--- a/sysdeps/unix/sysv/linux/mips/nptl/clone.S
+++ /dev/null
@@ -1,2 +0,0 @@ 
-#define RESET_PID
-#include <sysdeps/unix/sysv/linux/mips/clone.S>