@@ -356,13 +356,8 @@ _syscall1(int, dup, int, oldfd);
//#define __NR_pipe 42
#ifdef L_pipe
#include <unistd.h>
-/*
- * SH has a weird register calling mechanism for pipe, see pipe.c
- */
-#if !defined(__sh__)
_syscall1(int, pipe, int *, filedes);
#endif
-#endif
//#define __NR_times 43
#ifdef L_times
@@ -33,7 +33,7 @@ CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
SSRC=bsd-_setjmp.S bsd-setjmp.S setjmp.S #fork.S clone.S
SOBJS=$(patsubst %.S,%.o, $(SSRC))
-CSRC=__longjmp.c brk.c vfork.c setjmp_aux.c
+CSRC=__longjmp.c brk.c vfork.c setjmp_aux.c _mmap.c pipe.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(SOBJS) $(MOBJ) $(COBJS)
@@ -0,0 +1,8 @@
+/* Use new style mmap for mips */
+#include <unistd.h>
+#include <errno.h>
+#include <sys/mman.h>
+#include <sys/syscall.h>
+
+_syscall6 (__ptr_t, mmap, __ptr_t, addr, size_t, len, int, prot,
+ int, flags, int, fd, __off_t, offset);
@@ -0,0 +1,23 @@
+/* pipe system call for Linux/MIPS */
+/*see uClibc's sh/pipe.c and glibc-2.2.4's mips/pipe.S */
+#include <syscall.h>
+int pipe(int *fd)
+{
+ register long int res __asm__ ("$2"); // v0
+ register long int res2 __asm__ ("$3"); // v1
+ asm ("move\t$4,%2\n\t" // $4 = a0
+ "syscall" /* Perform the system call. */
+ : "=r" (res)
+ : "0" (__NR_pipe), "r" (fd)
+ : "$4", "$7");
+ fd[0] = res;
+ fd[1] = res2;
+ return(0);
+}