[roland/nptl-mips] MIPS: Consolidate NPTL/non versions of vfork
Commit Message
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
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.
@@ -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)
deleted file mode 100644
@@ -1,2 +0,0 @@
-#define RESET_PID
-#include <sysdeps/unix/sysv/linux/mips/clone.S>