From e4cfe3fb823dc44c0e3e884e53d1ae7c05ae7416 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Mon, 26 Nov 2001 09:19:30 +0000 Subject: 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. --- libc/sysdeps/linux/powerpc/Makefile | 4 +-- libc/sysdeps/linux/powerpc/longjmp.S | 47 +++++++++++++++++------------ libc/sysdeps/linux/powerpc/setjmp.S | 57 ++++++++++++++++++++++-------------- libc/sysdeps/linux/powerpc/vfork.S | 41 -------------------------- libc/sysdeps/linux/powerpc/vfork.c | 38 ++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 84 deletions(-) delete mode 100644 libc/sysdeps/linux/powerpc/vfork.S create mode 100644 libc/sysdeps/linux/powerpc/vfork.c (limited to 'libc/sysdeps') diff --git a/libc/sysdeps/linux/powerpc/Makefile b/libc/sysdeps/linux/powerpc/Makefile index 0d52510e6..cf9783dbd 100644 --- a/libc/sysdeps/linux/powerpc/Makefile +++ b/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) diff --git a/libc/sysdeps/linux/powerpc/longjmp.S b/libc/sysdeps/linux/powerpc/longjmp.S index e30f7fd26..cc84cbe66 100644 --- a/libc/sysdeps/linux/powerpc/longjmp.S +++ b/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 +#define r1 1 +#define r2 2 #define _ASM #define _SETJMP_H #include +#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; diff --git a/libc/sysdeps/linux/powerpc/setjmp.S b/libc/sysdeps/linux/powerpc/setjmp.S index 290669cec..4b3c48a8c 100644 --- a/libc/sysdeps/linux/powerpc/setjmp.S +++ b/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 +#define r1 1 +#define r2 2 #define _ASM #define _SETJMP_H #include -.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 diff --git a/libc/sysdeps/linux/powerpc/vfork.S b/libc/sysdeps/linux/powerpc/vfork.S deleted file mode 100644 index 842bad1a7..000000000 --- a/libc/sysdeps/linux/powerpc/vfork.S +++ /dev/null @@ -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 - * - * 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 - - -.global vfork; -.align 4; - -vfork: - /* XXX not implemented */ - - /* return -1 */ - li r3,-1 - blr - -.size vfork,.-vfork; diff --git a/libc/sysdeps/linux/powerpc/vfork.c b/libc/sysdeps/linux/powerpc/vfork.c new file mode 100644 index 000000000..fcf020804 --- /dev/null +++ b/libc/sysdeps/linux/powerpc/vfork.c @@ -0,0 +1,38 @@ + +#include +#include +#include +#include + + +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); +} + -- cgit v1.2.3