From 3a3af36f1bef68c9942e9ef3fb83cc15aeabfcc0 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 5 Jan 2007 09:09:22 +0000 Subject: 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. --- libc/sysdeps/linux/nios2/bits/mman.h | 9 + libc/sysdeps/linux/nios2/bits/syscalls.h | 290 ++++++++++++++++++++++++++++++- libc/sysdeps/linux/nios2/crt1.S | 6 +- libc/sysdeps/linux/nios2/crti.S | 25 +-- libc/sysdeps/linux/nios2/crtn.S | 24 +-- libc/sysdeps/linux/nios2/vfork.S | 2 +- 6 files changed, 312 insertions(+), 44 deletions(-) (limited to 'libc/sysdeps') 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 directly; include instead." #endif -#include +#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 +#include +#include +#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 .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 -#include +#include #ifndef __NR_vfork #define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */ -- cgit v1.2.3