فهرست منبع

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

David McCullough 23 سال پیش
والد
کامیت
6996c5c482
3فایلهای تغییر یافته به همراه36 افزوده شده و 1 حذف شده
  1. 5 0
      libc/sysdeps/linux/common/syscalls.c
  2. 1 1
      libc/sysdeps/linux/sh/Makefile
  3. 30 0
      libc/sysdeps/linux/sh/pipe.c

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