Просмотр исходного кода

Fixup the pipe system call for the SH target.
The FD's are returned in registers.

David McCullough 23 лет назад
Родитель
Сommit
6996c5c482

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

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

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