From: Bradley Smith <brad at brad-smith.co.uk> This patch is from http://git.brad-smith.co.uk/?p=avr32/klibc.git;a=summary It squashes together and includes those commits: * Fix ld flags such that shared builds actually run. * Fix setjmp. * Fix sigaction/sigrestorer. * Tidy everything up. * Fix lseek mess. Cc: H?vard_Skinnemoen <hskinnemoen at gmail.com> Cc: Hans-Christian Egtvedt <hans-christian.egtvedt at atmel.com> Signed-off-by: Bradley Smith <brad at brad-smith.co.uk> [ minor whitespace adjusting ] Signed-off-by: maximilian attems <max at stro.at> --- I am unsure of the state of testing of that branch: 1) Do the klibc tests compile and run? 2) Does initramfs-tools boot in Debian avr32 port with that klibc patch (that is a strong hint that klibc works on said port)? As I don't have such testboards around maybe arch Maintainers could give that patch a go. Also I saw that the signal handling gets an axe, so maybe less is needed against latest linux git? latest klibc git can be found here: http://git.kernel.org/?p=libs/klibc/klibc.git;a=summary At the current state of not ported, I thought belows might be a first step. thank you for any information. maks usr/include/arch/avr32/klibc/archconfig.h | 14 ++++ usr/include/arch/avr32/klibc/archsetjmp.h | 14 ++++ usr/include/arch/avr32/klibc/archsignal.h | 110 +++++++++++++++++++++++++++++ usr/include/arch/avr32/klibc/archstat.h | 40 +++++++++++ usr/include/arch/avr32/klibc/asmmacros.h | 10 +++ usr/klibc/README.klibc | 2 +- usr/klibc/arch/avr32/Kbuild | 8 ++ usr/klibc/arch/avr32/MCONFIG | 16 ++++ usr/klibc/arch/avr32/crt0.S | 20 +++++ usr/klibc/arch/avr32/setjmp.S | 30 ++++++++ usr/klibc/arch/avr32/sigreturn.S | 15 ++++ usr/klibc/arch/avr32/syscall.S | 24 ++++++ usr/klibc/arch/avr32/sysstub.ph | 31 ++++++++ usr/klibc/arch/avr32/vfork.S | 26 +++++++ 14 files changed, 359 insertions(+), 1 deletions(-) create mode 100644 usr/include/arch/avr32/klibc/archconfig.h create mode 100644 usr/include/arch/avr32/klibc/archsetjmp.h create mode 100644 usr/include/arch/avr32/klibc/archsignal.h create mode 100644 usr/include/arch/avr32/klibc/archstat.h create mode 100644 usr/include/arch/avr32/klibc/asmmacros.h create mode 100644 usr/klibc/arch/avr32/Kbuild create mode 100644 usr/klibc/arch/avr32/MCONFIG create mode 100644 usr/klibc/arch/avr32/crt0.S create mode 100644 usr/klibc/arch/avr32/setjmp.S create mode 100644 usr/klibc/arch/avr32/sigreturn.S create mode 100644 usr/klibc/arch/avr32/syscall.S create mode 100644 usr/klibc/arch/avr32/sysstub.ph create mode 100644 usr/klibc/arch/avr32/vfork.S diff --git a/usr/include/arch/avr32/klibc/archconfig.h b/usr/include/arch/avr32/klibc/archconfig.h new file mode 100644 index 0000000..6876922 --- /dev/null +++ b/usr/include/arch/avr32/klibc/archconfig.h @@ -0,0 +1,14 @@ +/* + * include/arch/avr32/klibc/archconfig.h + * + * See include/klibc/sysconfig.h for the options that can be set in + * this file. + * + */ + +#ifndef _KLIBC_ARCHCONFIG_H +#define _KLIBC_ARCHCONFIG_H + +#define _KLIBC_NEEDS_SA_RESTORER 1 + +#endif /* _KLIBC_ARCHCONFIG_H */ diff --git a/usr/include/arch/avr32/klibc/archsetjmp.h b/usr/include/arch/avr32/klibc/archsetjmp.h new file mode 100644 index 0000000..da59124 --- /dev/null +++ b/usr/include/arch/avr32/klibc/archsetjmp.h @@ -0,0 +1,14 @@ +/* + * arch/avr32/include/klibc/archsetjmp.h + */ + +#ifndef _KLIBC_ARCHSETJMP_H +#define _KLIBC_ARCHSETJMP_H + +struct __jmp_buf { + unsigned int regs[11]; +}; + +typedef struct __jmp_buf jmp_buf[1]; + +#endif /* _SETJMP_H */ diff --git a/usr/include/arch/avr32/klibc/archsignal.h b/usr/include/arch/avr32/klibc/archsignal.h new file mode 100644 index 0000000..a3fafff --- /dev/null +++ b/usr/include/arch/avr32/klibc/archsignal.h @@ -0,0 +1,110 @@ +/* + * arch/avr32/include/klibc/archsignal.h + * + * Architecture-specific signal definitions + * + */ + +#ifndef _KLIBC_ARCHSIGNAL_H +#define _KLIBC_ARCHSIGNAL_H + +#define _NSIG 64 +#define _NSIG_BPW 32 +#define _NSIG_WORDS (_NSIG / _NSIG_BPW) + +typedef struct { + unsigned long sig[_NSIG_WORDS]; +} sigset_t; + +#define SIGHUP 1 +#define SIGINT 2 +#define SIGQUIT 3 +#define SIGILL 4 +#define SIGTRAP 5 +#define SIGABRT 6 +#define SIGIOT 6 +#define SIGBUS 7 +#define SIGFPE 8 +#define SIGKILL 9 +#define SIGUSR1 10 +#define SIGSEGV 11 +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +#define SIGTERM 15 +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGURG 23 +#define SIGXCPU 24 +#define SIGXFSZ 25 +#define SIGVTALRM 26 +#define SIGPROF 27 +#define SIGWINCH 28 +#define SIGIO 29 +#define SIGPOLL SIGIO +/* +#define SIGLOST 29 +*/ +#define SIGPWR 30 +#define SIGSYS 31 +#define SIGUNUSED 31 + +/* These should not be considered constants from userland. */ +#define SIGRTMIN 32 +#define SIGRTMAX (_NSIG-1) + +/* + * SA_FLAGS values: + * + * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. + * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. + * SA_SIGINFO deliver the signal with SIGINFO structs + * SA_ONSTACK indicates that a registered stack_t will be used. + * SA_RESTART flag to get restarting signals (which were the default long ago) + * SA_NODEFER prevents the current signal from being masked in the handler. + * SA_RESETHAND clears the handler when the signal is delivered. + * + * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single + * Unix names RESETHAND and NODEFER respectively. + */ +#define SA_NOCLDSTOP 0x00000001 +#define SA_NOCLDWAIT 0x00000002 +#define SA_SIGINFO 0x00000004 +#define SA_RESTORER 0x04000000 +#define SA_ONSTACK 0x08000000 +#define SA_RESTART 0x10000000 +#define SA_NODEFER 0x40000000 +#define SA_RESETHAND 0x80000000 + +#define SA_NOMASK SA_NODEFER +#define SA_ONESHOT SA_RESETHAND + +/* + * sigaltstack controls + */ +#define SS_ONSTACK 1 +#define SS_DISABLE 2 + +#define MINSIGSTKSZ 2048 +#define SIGSTKSZ 8192 + +#include <asm-generic/signal.h> + +struct siginfo; + +struct sigaction { + union { + __sighandler_t sa_handler; + void (*sa_sigaction)(int, struct siginfo *, void *); + }; + unsigned long sa_flags; + __sigrestore_t sa_restorer; + sigset_t sa_mask; +}; + +#endif diff --git a/usr/include/arch/avr32/klibc/archstat.h b/usr/include/arch/avr32/klibc/archstat.h new file mode 100644 index 0000000..347c4a0 --- /dev/null +++ b/usr/include/arch/avr32/klibc/archstat.h @@ -0,0 +1,40 @@ +#ifndef _KLIBC_ARCHSTAT_H +#define _KLIBC_ARCHSTAT_H + +#include <klibc/stathelp.h> + +#define _STATBUF_ST_NSEC + +/* This matches struct stat64 in glibc2.1, hence the absolutely + * insane amounts of padding around dev_t's. + * Note: The kernel zero's the padded region because glibc might read them + * in the hope that the kernel has stretched to using larger sizes. + */ + +struct stat { + __stdev64 (st_dev); + unsigned char __pad0[4]; + + unsigned long __st_ino; + unsigned int st_mode; + unsigned int st_nlink; + + unsigned long st_uid; + unsigned long st_gid; + + __stdev64(st_rdev); + unsigned char __pad3[4]; + + long long st_size; + unsigned long st_blksize; + + unsigned long long st_blocks; /* Number 512-byte blocks allocated. */ + + struct timespec st_atim; + struct timespec st_mtim; + struct timespec st_ctim; + + unsigned long long st_ino; +}; + +#endif diff --git a/usr/include/arch/avr32/klibc/asmmacros.h b/usr/include/arch/avr32/klibc/asmmacros.h new file mode 100644 index 0000000..32bc2d3 --- /dev/null +++ b/usr/include/arch/avr32/klibc/asmmacros.h @@ -0,0 +1,10 @@ +/* + * usr/include/arch/avr32/klibc/asmmacros.h + * + * Assembly macros used by AVR32 system call stubs + */ + +#ifndef _KLIBC_ASMMACROS_H +#define _KLIBC_ASMMACROS_H + +#endif /* _KLIBC_ASMMACROS_H */ diff --git a/usr/klibc/README.klibc b/usr/klibc/README.klibc index b4135cb..81b28ba 100644 --- a/usr/klibc/README.klibc +++ b/usr/klibc/README.klibc @@ -38,7 +38,7 @@ b) If you're cross-compiling, you need to set KLIBCARCH to the arm-thumb: Untested arm: Working arm26: Not yet ported - avr32: Not yet ported + avr32: Untested cris: Working h8300: Not yet ported i386: Working diff --git a/usr/klibc/arch/avr32/Kbuild b/usr/klibc/arch/avr32/Kbuild new file mode 100644 index 0000000..e631e32 --- /dev/null +++ b/usr/klibc/arch/avr32/Kbuild @@ -0,0 +1,8 @@ +# +# klibc files for avr32 +# + +klib-y := setjmp.o syscall.o vfork.o sigreturn.o + +always := crt0.o +targets := crt0.o diff --git a/usr/klibc/arch/avr32/MCONFIG b/usr/klibc/arch/avr32/MCONFIG new file mode 100644 index 0000000..5f2570c --- /dev/null +++ b/usr/klibc/arch/avr32/MCONFIG @@ -0,0 +1,16 @@ +# -*- makefile -*- +# +# arch/avr32/MCONFIG +# +# Special rules for this architecture. Note that this is actually +# included from the main Makefile, and that pathnames should be +# accordingly. +# + +KLIBCOPTFLAGS += -Os -fomit-frame-pointer +KLIBCBITSIZE = 32 + +# Extra linkflags when building the shared version of the library +# This address needs to be reachable using normal inter-module +# calls, and work on the memory models for this architecture +KLIBCSHAREDFLAGS = -Ttext 0x2aaab600 --section-start .rela.dyn=0x2aaa0000 diff --git a/usr/klibc/arch/avr32/crt0.S b/usr/klibc/arch/avr32/crt0.S new file mode 100644 index 0000000..d3527c0 --- /dev/null +++ b/usr/klibc/arch/avr32/crt0.S @@ -0,0 +1,20 @@ +# +# arch/avr32/crt0.S +# +# void _start(void) +# { +# __libc_init(elf_structure, atexit_ptr); +# } +# + + .text + .align 4 + .type _start, at function + .globl _start + +_start: + mov r12, sp + mov r11, 0 + bral __libc_init + + .size _start, . - _start diff --git a/usr/klibc/arch/avr32/setjmp.S b/usr/klibc/arch/avr32/setjmp.S new file mode 100644 index 0000000..2115ea1 --- /dev/null +++ b/usr/klibc/arch/avr32/setjmp.S @@ -0,0 +1,30 @@ +# +# arch/avr32/setjmp.S +# +# setjmp/longjmp for the AVR32 architecture +# + + .text + .align 4 + .globl setjmp + .type setjmp, @function +setjmp: + mustr r8 + stm r12, r0-r8,sp,lr + mov r12, 0 + retal r12 + .size setjmp, . - setjmp + + .text + .align 4 + .globl longjmp + .type longjmp, @function +longjmp: + ldm r12++, r0-r8,sp,lr + mustr r8 + mov r12, r11 + cp r12, 0 + frs + moveq r12, 1 + retal r12 + .size longjmp, . - longjmp diff --git a/usr/klibc/arch/avr32/sigreturn.S b/usr/klibc/arch/avr32/sigreturn.S new file mode 100644 index 0000000..6627694 --- /dev/null +++ b/usr/klibc/arch/avr32/sigreturn.S @@ -0,0 +1,15 @@ +/* + * arch/avr32/sigreturn.S + */ + +#include <asm/unistd.h> + + .text + .align 4 + .globl __sigreturn + .type __sigreturn, @function +__sigreturn: + mov r8, __NR_rt_sigreturn + scall + + .size __sigreturn, . - __sigreturn diff --git a/usr/klibc/arch/avr32/syscall.S b/usr/klibc/arch/avr32/syscall.S new file mode 100644 index 0000000..230542f --- /dev/null +++ b/usr/klibc/arch/avr32/syscall.S @@ -0,0 +1,24 @@ +/* + * arch/avr32/syscall.S + * + * System call common handling + */ + + .type __syscall_common, at function + .globl __syscall_common + + .align 4 +__syscall_common: + ld.w r3, sp[16] + scall + cp.w r12, -4095 + brlo .Ldone + neg r12 + lddpc r3, .Lerrno + st.w r3[0], r12 +.Ldone: + ldm sp++, r3,r5,r6,pc + + .align 4 +.Lerrno: + .long errno diff --git a/usr/klibc/arch/avr32/sysstub.ph b/usr/klibc/arch/avr32/sysstub.ph new file mode 100644 index 0000000..912cc7b --- /dev/null +++ b/usr/klibc/arch/avr32/sysstub.ph @@ -0,0 +1,31 @@ +# -*- perl -*- +# +# arch/avr32/sysstub.ph +# +# Script to generate system call stubs +# + + +sub make_sysstub($$$$$@) { + my($outputdir, $fname, $type, $sname, $stype, @args) = @_; + + open(OUT, '>', "${outputdir}/${fname}.S"); + print OUT "#include <asm/unistd.h>\n"; + print OUT "#include <klibc/asmmacros.h>\n"; + + print OUT " .text\n"; + print OUT " .type ${fname}, \@function\n"; + print OUT " .globl ${fname}\n"; + + + print OUT " .align 4\n"; + print OUT "${fname}:\n"; + print OUT " stm --sp, r3,r5,r6,lr\n"; + print OUT " mov r5, r8\n"; + print OUT " mov r8, __NR_${sname}\n"; + print OUT " bral __syscall_common\n"; + + print OUT " .size __syscall${i}, . - __syscall${i}\n"; +} + +1; diff --git a/usr/klibc/arch/avr32/vfork.S b/usr/klibc/arch/avr32/vfork.S new file mode 100644 index 0000000..5397582 --- /dev/null +++ b/usr/klibc/arch/avr32/vfork.S @@ -0,0 +1,26 @@ +/* + * arch/avr32/vfork.S + * + * vfork - nasty system call which must not use the stack. + */ + +#include <asm/unistd.h> + + .type vfork, at function + .globl vfork + + .align 4 +vfork: + mov r8, __NR_vfork + scall + cp.w r12, -4095 + brlo .Ldone + neg r12 + lddpc r8, .Lerrno + st.w r8, r12 +.Ldone: + retal r12 + + .align 4 +.Lerrno: + .word errno -- 1.7.5.4