瀏覽代碼

Several mips fixes from Geoffrey Espin. With these, busybox with
ash/vi/etc now works just fine with uClibc on mips.

Eric Andersen 23 年之前
父節點
當前提交
5640182e96

+ 0 - 5
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

+ 1 - 1
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)

+ 8 - 0
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);

+ 23 - 0
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);
+}