summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/nios2/bits/mman.h9
-rw-r--r--libc/sysdeps/linux/nios2/bits/syscalls.h290
-rw-r--r--libc/sysdeps/linux/nios2/crt1.S6
-rw-r--r--libc/sysdeps/linux/nios2/crti.S25
-rw-r--r--libc/sysdeps/linux/nios2/crtn.S24
-rw-r--r--libc/sysdeps/linux/nios2/vfork.S2
6 files changed, 312 insertions, 44 deletions
diff --git a/libc/sysdeps/linux/nios2/bits/mman.h b/libc/sysdeps/linux/nios2/bits/mman.h
index 7f644b99b..2fa35e663 100644
--- a/libc/sysdeps/linux/nios2/bits/mman.h
+++ b/libc/sysdeps/linux/nios2/bits/mman.h
@@ -59,6 +59,15 @@
# define MAP_NORESERVE 0x4000 /* Don't check for reservations. */
#endif
+/* Advice to `madvise'. */
+#ifdef __USE_BSD
+# define MADV_NORMAL 0 /* No further special treatment. */
+# define MADV_RANDOM 1 /* Expect random page references. */
+# define MADV_SEQUENTIAL 2 /* Expect sequential page references. */
+# define MADV_WILLNEED 3 /* Will need these pages. */
+# define MADV_DONTNEED 4 /* Don't need these pages. */
+#endif
+
/* Flags to `msync'. */
#define MS_ASYNC 1 /* Sync memory asynchronously. */
#define MS_SYNC 4 /* Synchronous memory sync. */
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 */
diff --git a/libc/sysdeps/linux/nios2/crt1.S b/libc/sysdeps/linux/nios2/crt1.S
index d5e1bd7c2..0ba8d59e6 100644
--- a/libc/sysdeps/linux/nios2/crt1.S
+++ b/libc/sysdeps/linux/nios2/crt1.S
@@ -16,9 +16,13 @@
#include <asm/unistd.h>
.global _start
- .type __start,@function
+ .type _start,@function
+ .type _init,%function
+ .type _fini,%function
+#ifndef __UCLIBC_CTOR_DTOR__
.weak _init
.weak _fini
+#endif
.type main,@function
.type __uClibc_main,@function
.type __h_errno_location, @function
diff --git a/libc/sysdeps/linux/nios2/crti.S b/libc/sysdeps/linux/nios2/crti.S
index 7867c21c0..26c55c970 100644
--- a/libc/sysdeps/linux/nios2/crti.S
+++ b/libc/sysdeps/linux/nios2/crti.S
@@ -1,31 +1,22 @@
- .file "initfini.c"
-#APP
-
+
.section .init
-#NO_APP
.balign 4
- .global __init
- .type __init, @function
-__init:
+ .global _init
+ .type _init, @function
+_init:
addi sp, sp, -8
stw ra, 0(sp)
stw fp, 4(sp)
-#APP
-
+
.balign 4
.section .fini
-#NO_APP
.balign 4
- .global __fini
- .type __fini, @function
-__fini:
+ .global _fini
+ .type _fini, @function
+_fini:
addi sp, sp, -8
stw ra, 0(sp)
stw fp, 4(sp)
-#APP
.balign 4
-
-
- .ident "GCC: (GNU) 3.3.2"
diff --git a/libc/sysdeps/linux/nios2/crtn.S b/libc/sysdeps/linux/nios2/crtn.S
index dfac2ab22..de00fd132 100644
--- a/libc/sysdeps/linux/nios2/crtn.S
+++ b/libc/sysdeps/linux/nios2/crtn.S
@@ -1,30 +1,14 @@
- .file "initfini.c"
-#APP
-
+
.section .init
-#NO_APP
- .balign 4
- .globl _init
- .type _init, @function
-#NO_APP
+
ldw ra, 0(sp)
ldw fp, 4(sp)
addi sp, sp, 8
ret
- .size _init, .-_init
-#APP
-
+
.section .fini
-#NO_APP
- .balign 4
- .globl _fini
- .type _fini, @function
-#NO_APP
+
ldw ra, 0(sp)
ldw fp, 4(sp)
addi sp, sp, 8
ret
- .size _fini, .-_fini
-#APP
-
- .ident "GCC: (GNU) 3.3.2"
diff --git a/libc/sysdeps/linux/nios2/vfork.S b/libc/sysdeps/linux/nios2/vfork.S
index ca8811a4f..5d275ffdd 100644
--- a/libc/sysdeps/linux/nios2/vfork.S
+++ b/libc/sysdeps/linux/nios2/vfork.S
@@ -14,7 +14,7 @@
#define _ERRNO_H
#include <bits/errno.h>
-#include <sys/syscall.h>
+#include <asm/unistd.h>
#ifndef __NR_vfork
#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */