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