diff options
-rw-r--r-- | libc/sysdeps/linux/common/syscalls.c | 5 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/_mmap.c | 8 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/pipe.c | 23 |
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); +} |