summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/sysdeps/linux/common/syscalls.c5
-rw-r--r--libc/sysdeps/linux/mips/Makefile2
-rw-r--r--libc/sysdeps/linux/mips/_mmap.c8
-rw-r--r--libc/sysdeps/linux/mips/pipe.c23
4 files changed, 32 insertions, 6 deletions
diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c
index 30426a419..f0e54b344 100644
--- a/libc/sysdeps/linux/common/syscalls.c
+++ b/libc/sysdeps/linux/common/syscalls.c
@@ -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
diff --git a/libc/sysdeps/linux/mips/Makefile b/libc/sysdeps/linux/mips/Makefile
index 4875f334f..b73679da8 100644
--- a/libc/sysdeps/linux/mips/Makefile
+++ b/libc/sysdeps/linux/mips/Makefile
@@ -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)
diff --git a/libc/sysdeps/linux/mips/_mmap.c b/libc/sysdeps/linux/mips/_mmap.c
new file mode 100644
index 000000000..43fb0be74
--- /dev/null
+++ b/libc/sysdeps/linux/mips/_mmap.c
@@ -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);
diff --git a/libc/sysdeps/linux/mips/pipe.c b/libc/sysdeps/linux/mips/pipe.c
new file mode 100644
index 000000000..65e335964
--- /dev/null
+++ b/libc/sysdeps/linux/mips/pipe.c
@@ -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 <errno.h>
+#include <unistd.h>
+#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);
+}