diff options
Diffstat (limited to 'libc')
-rw-r--r-- | libc/sysdeps/linux/mips/pipe.S | 52 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/pipe.c | 24 |
2 files changed, 32 insertions, 44 deletions
diff --git a/libc/sysdeps/linux/mips/pipe.S b/libc/sysdeps/linux/mips/pipe.S index fb8f7ef7f..f80002118 100644 --- a/libc/sysdeps/linux/mips/pipe.S +++ b/libc/sysdeps/linux/mips/pipe.S @@ -8,27 +8,39 @@ #include <asm/regdef.h> .globl pipe - .globl __pipe + .globl __pipe .hidden __pipe - .ent __pipe, 0 + .ent __pipe, 0 __pipe: - addiu sp,sp,-24 - sw a0,16(sp) - li v0,__NR_pipe - syscall - beqz a3, 1f - la t3, errno - sw v0, (t3) - li v0, -1 - b 2f + .frame sp, 24, sp +#ifdef __PIC__ + .set noreorder + .cpload $25 + .set reorder + addiu sp,sp,-24 + .cprestore 16 +#else + addiu sp,sp,-24 +#endif + sw a0,16(sp) + li v0,__NR_pipe + syscall + beqz a3, 1f +#ifdef __PIC__ + la t0, __syscall_error + jr t9 +#else + j __syscall_error +#endif 1: - lw a0, 16(sp) - sw v0, 0(a0) - sw v1, 4(a0) - li v0, 0 + lw a0, 16(sp) + sw v0, 0(a0) + sw v1, 4(a0) + li v0, 0 2: - addiu sp,sp,24 - j ra - .end __pipe - .size __pipe,.-__pipe - .weak pipe; pipe = __pipe + addiu sp,sp,24 + j ra + .end __pipe + .size __pipe,.-__pipe + .weak pipe + pipe = __pipe diff --git a/libc/sysdeps/linux/mips/pipe.c b/libc/sysdeps/linux/mips/pipe.c deleted file mode 100644 index fbc73b489..000000000 --- a/libc/sysdeps/linux/mips/pipe.c +++ /dev/null @@ -1,24 +0,0 @@ -/* 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 attribute_hidden __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); -} -strong_alias(__pipe,pipe) |