Browse Source

Rewrite vfork() as C, should now work. Changed longjmp.S and setjmp.S
to use GCC's internal ppc-asm.h, and added macro to disable FP save/
restore in longjmp and setjmp. Fixed name of _setjmp() (was __setjmp).
Fixed _setjmp to be PIC.

David Schleef 22 years ago
parent
commit
e4cfe3fb82

+ 2 - 2
libc/sysdeps/linux/powerpc/Makefile

@@ -36,10 +36,10 @@ CRT0=crt0.S
 CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
 endif
 
-SSRC=longjmp.S setjmp.S vfork.S
+SSRC=longjmp.S setjmp.S
 SOBJS=$(patsubst %.S,%.o, $(SSRC))
 
-CSRC=_mmap.c
+CSRC=_mmap.c vfork.c
 COBJS=$(patsubst %.c,%.o, $(CSRC))
 
 OBJS=$(SOBJS) $(MOBJ) $(COBJS)

+ 28 - 19
libc/sysdeps/linux/powerpc/longjmp.S

@@ -18,12 +18,21 @@
    Boston, MA 02111-1307, USA.  */
 
 /* So we can use r3, r4, instead of 3, 4 */
-#include "ppc_asm.h"
+#include <ppc-asm.h>
+#define r1 1
+#define r2 2
 
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
 
+#define USE_FP
+#ifdef USE_FP
+#define FP(x...) x
+#else
+#define FP(x...)
+#endif
+
 .global	longjmp;
 .align	4;
 
@@ -32,44 +41,44 @@ longjmp:
 	lwz r2,(JB_GPR2*4)(r3)
 	lwz r0,(JB_LR*4)(r3)
 	lwz r14,((JB_GPRS+0)*4)(r3)
-	lfd fr14,((JB_FPRS+0*2)*4)(r3)
+FP(	lfd f14,((JB_FPRS+0*2)*4)(r3) )
 	lwz r15,((JB_GPRS+1)*4)(r3)
-	lfd fr15,((JB_FPRS+1*2)*4)(r3)
+FP(	lfd f15,((JB_FPRS+1*2)*4)(r3) )
 	lwz r16,((JB_GPRS+2)*4)(r3)
-	lfd fr16,((JB_FPRS+2*2)*4)(r3)
+FP(	lfd f16,((JB_FPRS+2*2)*4)(r3) )
 	lwz r17,((JB_GPRS+3)*4)(r3)
-	lfd fr17,((JB_FPRS+3*2)*4)(r3)
+FP(	lfd f17,((JB_FPRS+3*2)*4)(r3) )
 	lwz r18,((JB_GPRS+4)*4)(r3)
-	lfd fr18,((JB_FPRS+4*2)*4)(r3)
+FP(	lfd f18,((JB_FPRS+4*2)*4)(r3) )
 	lwz r19,((JB_GPRS+5)*4)(r3)
-	lfd fr19,((JB_FPRS+5*2)*4)(r3)
+FP(	lfd f19,((JB_FPRS+5*2)*4)(r3) )
 	lwz r20,((JB_GPRS+6)*4)(r3)
-	lfd fr20,((JB_FPRS+6*2)*4)(r3)
+FP(	lfd f20,((JB_FPRS+6*2)*4)(r3) )
 	mtlr r0
 	lwz r21,((JB_GPRS+7)*4)(r3)
-	lfd fr21,((JB_FPRS+7*2)*4)(r3)
+FP(	lfd f21,((JB_FPRS+7*2)*4)(r3) )
 	lwz r22,((JB_GPRS+8)*4)(r3)
-	lfd fr22,((JB_FPRS+8*2)*4)(r3)
+FP(	lfd f22,((JB_FPRS+8*2)*4)(r3) )
 	lwz r0,(JB_CR*4)(r3)
 	lwz r23,((JB_GPRS+9)*4)(r3)
-	lfd fr23,((JB_FPRS+9*2)*4)(r3)
+FP(	lfd f23,((JB_FPRS+9*2)*4)(r3) )
 	lwz r24,((JB_GPRS+10)*4)(r3)
-	lfd fr24,((JB_FPRS+10*2)*4)(r3)
+FP(	lfd f24,((JB_FPRS+10*2)*4)(r3) )
 	lwz r25,((JB_GPRS+11)*4)(r3)
-	lfd fr25,((JB_FPRS+11*2)*4)(r3)
+FP(	lfd f25,((JB_FPRS+11*2)*4)(r3) )
 	mtcrf 0xFF,r0
 	lwz r26,((JB_GPRS+12)*4)(r3)
-	lfd fr26,((JB_FPRS+12*2)*4)(r3)
+FP(	lfd f26,((JB_FPRS+12*2)*4)(r3) )
 	lwz r27,((JB_GPRS+13)*4)(r3)
-	lfd fr27,((JB_FPRS+13*2)*4)(r3)
+FP(	lfd f27,((JB_FPRS+13*2)*4)(r3) )
 	lwz r28,((JB_GPRS+14)*4)(r3)
-	lfd fr28,((JB_FPRS+14*2)*4)(r3)
+FP(	lfd f28,((JB_FPRS+14*2)*4)(r3) )
 	lwz r29,((JB_GPRS+15)*4)(r3)
-	lfd fr29,((JB_FPRS+15*2)*4)(r3)
+FP(	lfd f29,((JB_FPRS+15*2)*4)(r3) )
 	lwz r30,((JB_GPRS+16)*4)(r3)
-	lfd fr30,((JB_FPRS+16*2)*4)(r3)
+FP(	lfd f30,((JB_FPRS+16*2)*4)(r3) )
 	lwz r31,((JB_GPRS+17)*4)(r3)
-	lfd fr31,((JB_FPRS+17*2)*4)(r3)
+FP(	lfd f31,((JB_FPRS+17*2)*4)(r3) )
 	mr r3,r4
 	blr
 .size longjmp,.-longjmp;

+ 35 - 22
libc/sysdeps/linux/powerpc/setjmp.S

@@ -17,16 +17,25 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
-#include "ppc_asm.h"
+#include <ppc-asm.h>
+#define r1 1
+#define r2 2
 
 #define _ASM
 #define _SETJMP_H
 #include <bits/setjmp.h>
 
-.global __setjmp
-.type __setjmp,@function
+#define USE_FP
+#ifdef USE_FP
+#define FP(x...) x
+#else
+#define FP(x...)
+#endif
+
+.global _setjmp
+.type _setjmp,@function
 .align 4
-__setjmp:
+_setjmp:
 	li	r4,0
 .global __sigsetjmp
 .type __sigsetjmp,@function
@@ -36,44 +45,48 @@ __sigsetjmp:
 	mflr r0
 	stw  r2,(JB_GPR2*4)(3)
 	stw  r14,((JB_GPRS+0)*4)(3)
-	stfd fr14,((JB_FPRS+0*2)*4)(3)
+FP(	stfd f14,((JB_FPRS+0*2)*4)(3) )
 	stw  r0,(JB_LR*4)(3)
 	stw  r15,((JB_GPRS+1)*4)(3)
-	stfd fr15,((JB_FPRS+1*2)*4)(3)
+FP(	stfd f15,((JB_FPRS+1*2)*4)(3) )
 	mfcr r0
 	stw  r16,((JB_GPRS+2)*4)(3)
-	stfd fr16,((JB_FPRS+2*2)*4)(3)
+FP(	stfd f16,((JB_FPRS+2*2)*4)(3) )
 	stw  r0,(JB_CR*4)(3)
 	stw  r17,((JB_GPRS+3)*4)(3)
-	stfd fr17,((JB_FPRS+3*2)*4)(3)
+FP(	stfd f7,((JB_FPRS+3*2)*4)(3) )
 	stw  r18,((JB_GPRS+4)*4)(3)
-	stfd fr18,((JB_FPRS+4*2)*4)(3)
+FP(	stfd f18,((JB_FPRS+4*2)*4)(3) )
 	stw  r19,((JB_GPRS+5)*4)(3)
-	stfd fr19,((JB_FPRS+5*2)*4)(3)
+FP(	stfd f19,((JB_FPRS+5*2)*4)(3) )
 	stw  r20,((JB_GPRS+6)*4)(3)
-	stfd fr20,((JB_FPRS+6*2)*4)(3)
+FP(	stfd f20,((JB_FPRS+6*2)*4)(3) )
 	stw  r21,((JB_GPRS+7)*4)(3)
-	stfd fr21,((JB_FPRS+7*2)*4)(3)
+FP(	stfd f21,((JB_FPRS+7*2)*4)(3) )
 	stw  r22,((JB_GPRS+8)*4)(3)
-	stfd fr22,((JB_FPRS+8*2)*4)(3)
+FP(	stfd f22,((JB_FPRS+8*2)*4)(3) )
 	stw  r23,((JB_GPRS+9)*4)(3)
-	stfd fr23,((JB_FPRS+9*2)*4)(3)
+FP(	stfd f23,((JB_FPRS+9*2)*4)(3) )
 	stw  r24,((JB_GPRS+10)*4)(3)
-	stfd fr24,((JB_FPRS+10*2)*4)(3)
+FP(	stfd f24,((JB_FPRS+10*2)*4)(3) )
 	stw  r25,((JB_GPRS+11)*4)(3)
-	stfd fr25,((JB_FPRS+11*2)*4)(3)
+FP(	stfd f25,((JB_FPRS+11*2)*4)(3) )
 	stw  r26,((JB_GPRS+12)*4)(3)
-	stfd fr26,((JB_FPRS+12*2)*4)(3)
+FP(	stfd f26,((JB_FPRS+12*2)*4)(3) )
 	stw  r27,((JB_GPRS+13)*4)(3)
-	stfd fr27,((JB_FPRS+13*2)*4)(3)
+FP(	stfd f27,((JB_FPRS+13*2)*4)(3) )
 	stw  r28,((JB_GPRS+14)*4)(3)
-	stfd fr28,((JB_FPRS+14*2)*4)(3)
+FP(	stfd f28,((JB_FPRS+14*2)*4)(3) )
 	stw  r29,((JB_GPRS+15)*4)(3)
-	stfd fr29,((JB_FPRS+15*2)*4)(3)
+FP(	stfd f29,((JB_FPRS+15*2)*4)(3) )
 	stw  r30,((JB_GPRS+16)*4)(3)
-	stfd fr30,((JB_FPRS+16*2)*4)(3)
+FP(	stfd f30,((JB_FPRS+16*2)*4)(3) )
 	stw  r31,((JB_GPRS+17)*4)(3)
-	stfd fr31,((JB_FPRS+17*2)*4)(3)
+FP(	stfd f31,((JB_FPRS+17*2)*4)(3) )
+#ifdef __PIC__
+	b __sigjmp_save@PLT
+#else
 	b __sigjmp_save
+#endif
 .size __sigsetjmp,.-__sigsetjmp
 

+ 0 - 41
libc/sysdeps/linux/powerpc/vfork.S

@@ -1,41 +0,0 @@
-/*
- * uC-libc/sysdeps/linux/powerpc/vfork.S
- * vfork implementation for powerpc
- *
- * Copyright (C) 2001 by Lineo, Inc.
- * Author: David A. Schleef <ds@schleef.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Library General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program 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 Library General Public License
- * for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- */
-
-#include "ppc_asm.h"
-
-#define _SETJMP_H
-#define _ASM
-#include <bits/setjmp.h>
-
-
-.global	vfork;
-.align	4;
-
-vfork:
-	/* XXX not implemented */
-
-	/* return -1 */
-	li	r3,-1
-	blr
-
-.size vfork,.-vfork;

+ 38 - 0
libc/sysdeps/linux/powerpc/vfork.c

@@ -0,0 +1,38 @@
+
+#include <unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <errno.h>
+
+
+int vfork(void)
+{
+	unsigned long __sc_ret, __sc_err;
+	register unsigned long __sc_0 __asm__ ("r0");
+	register unsigned long __sc_3 __asm__ ("r3");
+
+	__sc_0 = __NR_vfork;
+	__asm__ __volatile__
+		("sc		\n\t"
+		 "mfcr %1	"
+		: "=&r" (__sc_3), "=&r" (__sc_0)
+		: "0"   (__sc_3), "1"   (__sc_0)
+		: __syscall_clobbers);
+	__sc_ret = __sc_3;
+	__sc_err = __sc_0;
+
+	if((__sc_err & 0x10000000) && (__sc_ret == ENOSYS)){ 
+		__sc_0 = __NR_fork;
+		__asm__ __volatile__
+			("sc		\n\t"
+			 "mfcr %1	"
+			: "=&r" (__sc_3), "=&r" (__sc_0)
+			: "0"   (__sc_3), "1"   (__sc_0)
+			: __syscall_clobbers);
+		__sc_ret = __sc_3;
+		__sc_err = __sc_0;
+	}
+
+	__syscall_return (pid_t);
+}
+