summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/nios2/bits/syscalls.h
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2007-01-05 09:09:22 +0000
committerMike Frysinger <vapier@gentoo.org>2007-01-05 09:09:22 +0000
commit3a3af36f1bef68c9942e9ef3fb83cc15aeabfcc0 (patch)
treecb5b06dfd527980b1b5cc6df57c5a46cf4f7953c /libc/sysdeps/linux/nios2/bits/syscalls.h
parent385a0b9d4fa0806c0f22e21d01f42b523c1b43cf (diff)
Atle Nissestad writes: The attached patch fixes compilation of the current svn on the nios2 platform, and updates the crt1/n/i.S files to get CTOR/DTOR-support to work.
Diffstat (limited to 'libc/sysdeps/linux/nios2/bits/syscalls.h')
-rw-r--r--libc/sysdeps/linux/nios2/bits/syscalls.h290
1 files changed, 285 insertions, 5 deletions
diff --git a/libc/sysdeps/linux/nios2/bits/syscalls.h b/libc/sysdeps/linux/nios2/bits/syscalls.h
index b21851333..ec5370712 100644
--- a/libc/sysdeps/linux/nios2/bits/syscalls.h
+++ b/libc/sysdeps/linux/nios2/bits/syscalls.h
@@ -4,12 +4,292 @@
# error "Never use <bits/syscalls.h> directly; include <sys/syscall.h> instead."
#endif
-#include <features.h>
+#ifndef __ASSEMBLER__
-/* Do something very evil for now. Until we create our own syscall
- * macros, short circuit bits/sysnum.h and use asm/unistd.h instead */
-#warning "fixme -- add arch specific syscall macros.h"
-#include <asm/unistd.h>
+#include <errno.h>
+#include <asm/traps.h>
+#define __syscall_return(type, res) \
+do { \
+ if ((unsigned long)(res) >= (unsigned long)(-125)) { \
+ \
+ /* avoid using res which is declared to be in \
+ register r2; errno might expand to a function \
+ call and clobber it. */ \
+ \
+ int __err = -(res); \
+ errno = __err; \
+ res = -1; \
+ } \
+ return (type) (res); \
+} while (0)
+
+#define _syscall0(type,name) \
+type name(void) \
+{ \
+ long __res; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__res); \
+}
+
+#define _syscall1(type,name,atype,a) \
+type name(atype a) \
+{ \
+ long __res; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__res); \
+}
+
+#define _syscall2(type,name,atype,a,btype,b) \
+type name(atype a,btype b) \
+{ \
+ long __res; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ " mov r5, %4\n\t" /* (long) b */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ , "r" ((long) b) /* %4 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ , "r5" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__res); \
+}
+
+#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
+type name(atype a,btype b,ctype c) \
+{ \
+ long __res; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ " mov r5, %4\n\t" /* (long) b */ \
+ " mov r6, %5\n\t" /* (long) c */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ , "r" ((long) b) /* %4 */ \
+ , "r" ((long) c) /* %5 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ , "r5" /* Clobbered */ \
+ , "r6" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__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; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ " mov r5, %4\n\t" /* (long) b */ \
+ " mov r6, %5\n\t" /* (long) c */ \
+ " mov r7, %6\n\t" /* (long) d */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ , "r" ((long) b) /* %4 */ \
+ , "r" ((long) c) /* %5 */ \
+ , "r" ((long) d) /* %6 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ , "r5" /* Clobbered */ \
+ , "r6" /* Clobbered */ \
+ , "r7" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__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; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ " mov r5, %4\n\t" /* (long) b */ \
+ " mov r6, %5\n\t" /* (long) c */ \
+ " mov r7, %6\n\t" /* (long) c */ \
+ " mov r8, %7\n\t" /* (long) e */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ , "r" ((long) b) /* %4 */ \
+ , "r" ((long) c) /* %5 */ \
+ , "r" ((long) d) /* %6 */ \
+ , "r" ((long) e) /* %7 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ , "r5" /* Clobbered */ \
+ , "r6" /* Clobbered */ \
+ , "r7" /* Clobbered */ \
+ , "r8" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__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; \
+ \
+ __asm__ __volatile__ ( \
+ \
+ " \n\t" \
+ \
+ " movi r2, %2\n\t" /* TRAP_ID_SYSCALL */ \
+ " movi r3, %1\n\t" /* __NR_##name */ \
+ " mov r4, %3\n\t" /* (long) a */ \
+ " mov r5, %4\n\t" /* (long) b */ \
+ " mov r6, %5\n\t" /* (long) c */ \
+ " mov r7, %6\n\t" /* (long) c */ \
+ " mov r8, %7\n\t" /* (long) e */ \
+ " mov r9, %8\n\t" /* (long) f */ \
+ \
+ " trap\n\t" \
+ " mov %0, r2\n\t" /* syscall rtn */ \
+ \
+ " \n\t" \
+ \
+ : "=r" (__res) /* %0 */ \
+ \
+ : "i" (__NR_##name) /* %1 */ \
+ , "i" (TRAP_ID_SYSCALL) /* %2 */ \
+ , "r" ((long) a) /* %3 */ \
+ , "r" ((long) b) /* %4 */ \
+ , "r" ((long) c) /* %5 */ \
+ , "r" ((long) d) /* %6 */ \
+ , "r" ((long) e) /* %7 */ \
+ , "r" ((long) f) /* %8 */ \
+ \
+ : "r2" /* Clobbered */ \
+ , "r3" /* Clobbered */ \
+ , "r4" /* Clobbered */ \
+ , "r5" /* Clobbered */ \
+ , "r6" /* Clobbered */ \
+ , "r7" /* Clobbered */ \
+ , "r8" /* Clobbered */ \
+ , "r9" /* Clobbered */ \
+ ); \
+ \
+__syscall_return(type,__res); \
+}
+
+#endif /* __ASSEMBLER__ */
#endif /* _BITS_SYSCALLS_H */