Browse Source

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.

Mike Frysinger 18 years ago
parent
commit
3a3af36f1b

+ 9 - 0
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.  */

+ 285 - 5
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 */
 

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

+ 8 - 17
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"

+ 4 - 20
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"

+ 1 - 1
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 */