Browse Source

ldso specific syscalls and userspace syscalls all in one file now.

"Steven J. Hill" 22 years ago
parent
commit
a91e3b0a22
4 changed files with 230 additions and 355 deletions
  1. 6 4
      ldso/ldso/mips/README
  2. 5 173
      ldso/ldso/mips/dl-syscalls.h
  3. 5 173
      ldso/ldso/mips/ld_syscalls.h
  4. 214 5
      libc/sysdeps/linux/mips/bits/syscalls.h

+ 6 - 4
ldso/ldso/mips/README

@@ -20,10 +20,12 @@ function 'elf_machine_rel' in 'sysdeps/mips/dl-machine.h'.
 
 ld_syscalls.h
 -------------
-Contains all the macro functions for the system calls as well
-as the list of system calls supported. The functions were taken
-from the Linux kernel source 2.4.17 and can be found in the
-file 'include/asm-mips/unistd.h'.
+Used to contain all the macro functions for the system calls
+as well as the list of system calls supported. We now include
+<sys/syscall.h> but with the __set_errno macro defined empty
+so we can use the same file for the linker as well as userspace.
+Original code was taken from the Linux kernel source 2.4.17 and
+can be found in the file 'include/asm-mips/unistd.h'.
 
 ld_sysdep.h
 -----------

+ 5 - 173
ldso/ldso/mips/dl-syscalls.h

@@ -1,175 +1,7 @@
-/*
- * This file contains the system call macros and syscall
- * numbers used by the shared library loader. Taken from
- * Linux/MIPS 2.4.17 version kernel.
- */
+/* Define the __set_errno macro as nothing so that we don't bother
+ * setting errno, which is important since we make system calls
+ * before the errno symbol is dynamicly linked. */
 
-#ifndef _SYS_STAT_H
-#define _SYS_STAT_H
+#define __set_errno(X)
+#include "sys/syscall.h"
 
-#define new_stat stat
-#include <asm/stat.h>
-
-#define __NR_SYSCALL_BASE		4000
-
-#define __NR_exit			(__NR_SYSCALL_BASE +   1)
-#define __NR_read			(__NR_SYSCALL_BASE +   3)
-#define __NR_write			(__NR_SYSCALL_BASE +   4)
-#define __NR_open			(__NR_SYSCALL_BASE +   5)
-#define __NR_close			(__NR_SYSCALL_BASE +   6)
-#define __NR_getuid			(__NR_SYSCALL_BASE +  24)
-#define __NR_getgid			(__NR_SYSCALL_BASE +  47)
-#define __NR_geteuid			(__NR_SYSCALL_BASE +  49)
-#define __NR_getegid			(__NR_SYSCALL_BASE +  50)
-#define __NR_readlink			(__NR_SYSCALL_BASE +  85)
-#define __NR_mmap			(__NR_SYSCALL_BASE +  90)
-#define __NR_munmap			(__NR_SYSCALL_BASE +  91)
-#define __NR_stat			(__NR_SYSCALL_BASE + 106)
-#define __NR_mprotect			(__NR_SYSCALL_BASE + 125)
-
-/* Here are the macros which define how this platform makes
- * system calls.  This particular variant does _not_ set
- * errno (note how it is disabled in __syscall_return) since
- * these will get called before the errno symbol is dynamicly
- * linked. */
-
-#define _syscall0(type,name) \
-type name(void) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %2\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return -1; \
-}
-
-#define _syscall1(type,name,atype,a) \
-type name(atype a) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %3\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall2(type,name,atype,a,btype,b) \
-type name(atype a, btype b) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %4\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "r" (__a1), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
-type name(atype a, btype b, ctype c) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
-type name(atype a, btype b, ctype c, dtype d) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7") = (unsigned long) d; \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "+r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
-type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7") = (unsigned long) d; \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"lw\t$2, %6\n\t" \
-	"lw\t$8, %7\n\t" \
-	"subu\t$29, 32\n\t" \
-	"sw\t$2, 16($29)\n\t" \
-	"sw\t$8, 20($29)\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	"addiu\t$29, 32\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "+r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name), \
-	  "m" ((unsigned long)e), "m" ((unsigned long)f) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#endif

+ 5 - 173
ldso/ldso/mips/ld_syscalls.h

@@ -1,175 +1,7 @@
-/*
- * This file contains the system call macros and syscall
- * numbers used by the shared library loader. Taken from
- * Linux/MIPS 2.4.17 version kernel.
- */
+/* Define the __set_errno macro as nothing so that we don't bother
+ * setting errno, which is important since we make system calls
+ * before the errno symbol is dynamicly linked. */
 
-#ifndef _SYS_STAT_H
-#define _SYS_STAT_H
+#define __set_errno(X)
+#include "sys/syscall.h"
 
-#define new_stat stat
-#include <asm/stat.h>
-
-#define __NR_SYSCALL_BASE		4000
-
-#define __NR_exit			(__NR_SYSCALL_BASE +   1)
-#define __NR_read			(__NR_SYSCALL_BASE +   3)
-#define __NR_write			(__NR_SYSCALL_BASE +   4)
-#define __NR_open			(__NR_SYSCALL_BASE +   5)
-#define __NR_close			(__NR_SYSCALL_BASE +   6)
-#define __NR_getuid			(__NR_SYSCALL_BASE +  24)
-#define __NR_getgid			(__NR_SYSCALL_BASE +  47)
-#define __NR_geteuid			(__NR_SYSCALL_BASE +  49)
-#define __NR_getegid			(__NR_SYSCALL_BASE +  50)
-#define __NR_readlink			(__NR_SYSCALL_BASE +  85)
-#define __NR_mmap			(__NR_SYSCALL_BASE +  90)
-#define __NR_munmap			(__NR_SYSCALL_BASE +  91)
-#define __NR_stat			(__NR_SYSCALL_BASE + 106)
-#define __NR_mprotect			(__NR_SYSCALL_BASE + 125)
-
-/* Here are the macros which define how this platform makes
- * system calls.  This particular variant does _not_ set
- * errno (note how it is disabled in __syscall_return) since
- * these will get called before the errno symbol is dynamicly
- * linked. */
-
-#define _syscall0(type,name) \
-type name(void) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %2\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return -1; \
-}
-
-#define _syscall1(type,name,atype,a) \
-type name(atype a) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %3\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall2(type,name,atype,a,btype,b) \
-type name(atype a, btype b) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %4\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "r" (__a1), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
-type name(atype a, btype b, ctype c) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7"); \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "=r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
-type name(atype a, btype b, ctype c, dtype d) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7") = (unsigned long) d; \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "+r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
-type name(atype a, btype b, ctype c, dtype d, etype e, ftype f) \
-{ \
-	register unsigned long __v0 asm("$2") = __NR_##name; \
-	register unsigned long __a0 asm("$4") = (unsigned long) a; \
-	register unsigned long __a1 asm("$5") = (unsigned long) b; \
-	register unsigned long __a2 asm("$6") = (unsigned long) c; \
-	register unsigned long __a3 asm("$7") = (unsigned long) d; \
-	\
-	__asm__ volatile ( \
-	".set\tnoreorder\n\t" \
-	"lw\t$2, %6\n\t" \
-	"lw\t$8, %7\n\t" \
-	"subu\t$29, 32\n\t" \
-	"sw\t$2, 16($29)\n\t" \
-	"sw\t$8, 20($29)\n\t" \
-	"li\t$2, %5\t\t\t# " #name "\n\t" \
-	"syscall\n\t" \
-	"addiu\t$29, 32\n\t" \
-	".set\treorder" \
-	: "=&r" (__v0), "+r" (__a3) \
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_##name), \
-	  "m" ((unsigned long)e), "m" ((unsigned long)f) \
-	: "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15", "$24"); \
-	\
-	if (__a3 == 0) \
-		return (type) __v0; \
-	return (type) -1; \
-}
-
-#endif

+ 214 - 5
libc/sysdeps/linux/mips/bits/syscalls.h

@@ -4,11 +4,220 @@
 # error "Never use <bits/syscall.h> directly; include <sys/syscall.h> instead."
 #endif
 
-#include <features.h>
+/* This includes the `__NR_<name>' syscall numbers taken from the Linux kernel
+ * header files.  It also defines the traditional `SYS_<name>' macros for older
+ * programs.  */
+#include <bits/syscall.h>
 
-/* Do something very evil for now.  Until we create our own syscall
- * macros, short circuit bits/syscall.h  and use asm/unistd.h instead */
-#define _BITS_SYSCALL_H
-#include <asm/unistd.h>
+#ifndef __set_errno
+# define __set_errno(val)  { (*__errno_location ()) = (val); return -1; }
+#endif
+#ifndef SYS_ify
+# define SYS_ify(syscall_name)  (__NR_##syscall_name)
+#endif
+
+#ifndef __ASSEMBLER__
+
+/* XXX - _foo needs to be __foo, while __NR_bar could be _NR_bar. */
+#define _syscall0(type,name) \
+type name(void) \
+{ \
+long __res, __err; \
+__asm__ volatile ("li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name) \
+                  : "$2","$7","$8","$9","$10","$11","$12","$13","$14","$15", \
+		    "$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+/*
+ * DANGER: This macro isn't usable for the pipe(2) call
+ * which has a unusual return convention.
+ */
+#define _syscall1(type,name,atype,a) \
+type name(atype a) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7" \
+		  : "=r" (__res), "=r" (__err) \
+		  : "i" (__NR_##name),"r" ((long)(a)) \
+		  : "$2","$4","$7","$8","$9","$10","$11","$12","$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall2(type,name,atype,a,btype,b) \
+type name(atype a,btype b) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)) \
+                  : "$2","$4","$5","$7","$8","$9","$10","$11","$12","$13", \
+		    "$14","$15", "$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
+type name (atype a, btype b, ctype c) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+                  "move\t$6,%5\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)), \
+                                      "r" ((long)(c)) \
+                  : "$2","$4","$5","$6","$7","$8","$9","$10","$11","$12", \
+		    "$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
+type name (atype a, btype b, ctype c, dtype d) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+                  "move\t$6,%5\n\t" \
+                  "move\t$7,%6\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)), \
+                                      "r" ((long)(c)), \
+                                      "r" ((long)(d)) \
+                  : "$2","$4","$5","$6","$7","$8","$9","$10","$11","$12", \
+		    "$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
+type name (atype a,btype b,ctype c,dtype d,etype e) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+                  "move\t$6,%5\n\t" \
+		  "lw\t$2,%7\n\t" \
+                  "move\t$7,%6\n\t" \
+		  "subu\t$29,24\n\t" \
+		  "sw\t$2,16($29)\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7\n\t" \
+		  "addiu\t$29,24" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)), \
+                                      "r" ((long)(c)), \
+                                      "r" ((long)(d)), \
+                                      "m" ((long)(e)) \
+                  : "$2","$4","$5","$6","$7","$8","$9","$10","$11","$12", \
+                    "$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
+type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+                  "move\t$6,%5\n\t" \
+		  "lw\t$2,%7\n\t" \
+		  "lw\t$3,%8\n\t" \
+                  "move\t$7,%6\n\t" \
+		  "subu\t$29,24\n\t" \
+		  "sw\t$2,16($29)\n\t" \
+		  "sw\t$3,20($29)\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7\n\t" \
+		  "addiu\t$29,24" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)), \
+                                      "r" ((long)(c)), \
+                                      "r" ((long)(d)), \
+                                      "m" ((long)(e)), \
+                                      "m" ((long)(f)) \
+                  : "$2","$3","$4","$5","$6","$7","$8","$9","$10","$11", \
+                    "$12","$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
+
+#define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
+type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
+{ \
+long __res, __err; \
+__asm__ volatile ("move\t$4,%3\n\t" \
+                  "move\t$5,%4\n\t" \
+                  "move\t$6,%5\n\t" \
+		  "lw\t$2,%7\n\t" \
+		  "lw\t$3,%8\n\t" \
+                  "move\t$7,%6\n\t" \
+		  "subu\t$29,32\n\t" \
+		  "sw\t$2,16($29)\n\t" \
+		  "lw\t$2,%9\n\t" \
+		  "sw\t$3,20($29)\n\t" \
+		  "sw\t$2,24($29)\n\t" \
+		  "li\t$2,%2\n\t" \
+		  "syscall\n\t" \
+		  "move\t%0, $2\n\t" \
+		  "move\t%1, $7\n\t" \
+		  "addiu\t$29,32" \
+                  : "=r" (__res), "=r" (__err) \
+                  : "i" (__NR_##name),"r" ((long)(a)), \
+                                      "r" ((long)(b)), \
+                                      "r" ((long)(c)), \
+                                      "r" ((long)(d)), \
+                                      "m" ((long)(e)), \
+                                      "m" ((long)(f)), \
+                                      "m" ((long)(g)) \
+                  : "$2","$3","$4","$5","$6","$7","$8","$9","$10","$11", \
+                    "$12","$13","$14","$15","$24"); \
+if (__err == 0) \
+	return (type) __res; \
+__set_errno(__res); \
+}
 
+#endif /* __ASSEMBLER__ */
 #endif /* _BITS_SYSCALLS_H */