about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--sysdeps/unix/sysv/linux/mips/clone.S44
2 files changed, 19 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index 46ea37b797..a80ca22660 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,6 @@
 2000-04-13  Andreas Jaeger  <aj@suse.de>
 
-	* sysdeps/unix/sysv/linux/mips/pipe.S: New file.
+	* sysdeps/unix/sysv/linux/mips/clone.S: Fix function.
 
 	* sysdeps/unix/mips/pipe.S: Reorder instructions since .reorder is
 	default.
@@ -12,6 +12,8 @@
 	* sysdeps/mips/bsd-setjmp.S: Use __PIC__.
 	* sysdeps/mips/bsd-_setjmp.S: Likewise.
 	* sysdeps/mips/setjmp.S: Likewise.
+
+	* sysdeps/unix/sysv/linux/mips/pipe.S: New file.
 	
 2000-04-13  Ulrich Drepper  <drepper@redhat.com>
 
diff --git a/sysdeps/unix/sysv/linux/mips/clone.S b/sysdeps/unix/sysv/linux/mips/clone.S
index 30499bcf43..1bb5c29d3c 100644
--- a/sysdeps/unix/sysv/linux/mips/clone.S
+++ b/sysdeps/unix/sysv/linux/mips/clone.S
@@ -26,25 +26,18 @@
 #define _ERRNO_H	1
 #include <bits/errno.h>
 
-/* int clone(int (*fn)(), void *child_stack, int flags, void *arg) */
-
-#define FRAMESZ  8*SZREG
-#if _MIPS_SIM == _MIPS_SIM_ABI32
-#define MAX_REG_ARGS 4
-#else
-#define MAX_REG_ARGS 6
-#endif
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */
 
 	.text
-NESTED(__clone,FRAMESZ,sp)
+NESTED(__clone,4*SZREG,sp)
 #ifdef __PIC__
 	.set		noreorder
 	.cpload		$25
 	.set		reorder
-	PTR_SUBIU	sp,FRAMESZ
-	.cprestore	SZREG*4
+	subu		sp,32
+	.cprestore	16
 #else
-	PTR_SUBIU	sp,FRAMESZ
+	subu		sp,32
 #endif
 #ifdef PROF
 	.set		noat
@@ -53,17 +46,15 @@ NESTED(__clone,FRAMESZ,sp)
 	.set		at
 #endif
 
-	REG_S		s0,FRAMESZ-SZREG*2(sp)
-	REG_S		s1,FRAMESZ-SZREG*3(sp)
+
 	/* Sanity check arguments.  */
 	li		v0,EINVAL
-	beqz		a0,error	/* no NULL function pointers */
-	beqz		a1,error	/* no NULL stack pointers */
+	beqz		a0,error	/* No NULL function pointers.  */
+	beqz		a1,error	/* No NULL stack pointers.  */
 
-	/* Allocate space on the new stack and copy args over */
-	/* Save the arg for user's function */
-	move		s0,a3		/* Save arg __thread_start.  */
-	move		s1,a0		/* Save func. pointer.  */
+	subu		a1,32		/* Reserve argument save space.  */
+	sw		a0,0(a1)	/* Save function pointer.  */
+	sw		a3,4(a1)	/* Save argument pointer.  */
 
 
 	/* Do the system call */
@@ -75,16 +66,12 @@ NESTED(__clone,FRAMESZ,sp)
 	beqz		v0,__thread_start
 
 	/* Successful return from the parent */
-	REG_L		s0,FRAMESZ-SZREG*2(sp)
-	REG_L		s1,FRAMESZ-SZREG*3(sp)
-	PTR_ADDIU	sp,FRAMESZ
+	addiu		sp,32
 	ret
 
 	/* Something bad happened -- no child created */
 error:
-	REG_L		s0,FRAMESZ-SZREG*2(sp)
-	REG_L		s1,FRAMESZ-SZREG*3(sp)
-	PTR_ADDIU	sp,FRAMESZ
+	addiu		sp,32
 #ifdef PIC
 	la		t9,__syscall_error
 	jr		t9
@@ -100,10 +87,11 @@ error:
    At this point we have s0=arg, s1=fn.  */
 
 NESTED(__thread_start,FRAMESZ,sp)
+	/* cp is already loaded.  */
 	/* The stackframe has been created on entry of clone().  */
 	/* Resort the arg for user's function.  */
-	move		a0,s0
-	move		t9,s1
+	move		a0,0(sp)	/* Function pointer.  */
+	move		t9,4(sp)	/* Argument pointer.  */
 
 	/* Call the user's function.  */
 	jalr		t9