summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/common/syscalls.c5
-rw-r--r--libc/sysdeps/linux/sh/Makefile2
-rw-r--r--libc/sysdeps/linux/sh/pipe.c30
3 files changed, 36 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/common/syscalls.c b/libc/sysdeps/linux/common/syscalls.c
index e7da59b63..2d2062686 100644
--- a/libc/sysdeps/linux/common/syscalls.c
+++ b/libc/sysdeps/linux/common/syscalls.c
@@ -312,8 +312,13 @@ _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/sh/Makefile b/libc/sysdeps/linux/sh/Makefile
index f24856ade..4f76b49a5 100644
--- a/libc/sysdeps/linux/sh/Makefile
+++ b/libc/sysdeps/linux/sh/Makefile
@@ -35,7 +35,7 @@ CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0))
SSRC=setjmp.S bsd-setjmp.S bsd-_setjmp.S __longjmp.S vfork.S
SOBJS=$(patsubst %.S,%.o, $(SSRC))
-CSRC=_mmap.c longjmp.c
+CSRC=_mmap.c longjmp.c pipe.c
COBJS=$(patsubst %.c,%.o, $(CSRC))
OBJS=$(SOBJS) $(MOBJ) $(COBJS)
diff --git a/libc/sysdeps/linux/sh/pipe.c b/libc/sysdeps/linux/sh/pipe.c
new file mode 100644
index 000000000..1fb399afc
--- /dev/null
+++ b/libc/sysdeps/linux/sh/pipe.c
@@ -0,0 +1,30 @@
+
+/* Copyright (C) 2001 Lineo, <davidm@lineo.com> */
+
+#include <unistd.h>
+#include <syscall.h>
+
+int pipe(int *fd)
+{
+ long __res, __res2;
+ __asm__ __volatile__ (
+ "mov %2, r3;"
+ "mov %3, r4;"
+ "trapa #0x13;"
+ "mov r1, %1;"
+ : "=z" (__res),
+ "=r" ((long) __res2)
+ : "r" ((long) __NR_pipe),
+ "r" ((long) fd)
+ : "cc", "memory", "r1", "r3", "r4");
+ if ((unsigned long)(__res) >= (unsigned long)(-125)) {
+ int __err = -(__res);
+ errno = __err;
+ return(-1);
+ }
+ fd[0] = __res;
+ fd[1] = __res2;
+ return(0);
+}
+
+