diff options
author | Mike Frysinger <vapier@gentoo.org> | 2005-07-09 00:36:34 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2005-07-09 00:36:34 +0000 |
commit | e6929d28984ab4b0dedcd47c225a572617b836a2 (patch) | |
tree | 99328bb05cec7bf9251a90f564fbec64377afd29 /libc | |
parent | 6275ec5d02f4cdbcbc0de7c4f92b6cde5d1538c0 (diff) |
rewrite crt in asm using glibc as a basis
Diffstat (limited to 'libc')
-rw-r--r-- | libc/sysdeps/linux/sparc/Makefile | 4 | ||||
-rw-r--r-- | libc/sysdeps/linux/sparc/crt0.c | 44 | ||||
-rw-r--r-- | libc/sysdeps/linux/sparc/crt1.S | 139 |
3 files changed, 141 insertions, 46 deletions
diff --git a/libc/sysdeps/linux/sparc/Makefile b/libc/sysdeps/linux/sparc/Makefile index 614161f91..5c91176dd 100644 --- a/libc/sysdeps/linux/sparc/Makefile +++ b/libc/sysdeps/linux/sparc/Makefile @@ -19,8 +19,8 @@ TOPDIR=../../../../ include $(TOPDIR)Rules.mak -CRT_SRC = crt0.c -CRT_OBJ = crt0.o crt1.o +CRT_SRC = crt1.S +CRT_OBJ = crt1.o CTOR_TARGETS=$(TOPDIR)lib/crti.o $(TOPDIR)lib/crtn.o SSRC=__longjmp.S fork.S vfork.S clone.S setjmp.S bsd-setjmp.S bsd-_setjmp.S \ diff --git a/libc/sysdeps/linux/sparc/crt0.c b/libc/sysdeps/linux/sparc/crt0.c deleted file mode 100644 index 81caf1eed..000000000 --- a/libc/sysdeps/linux/sparc/crt0.c +++ /dev/null @@ -1,44 +0,0 @@ -/* vi: set sw=4 ts=4: */ -/* uClibc/sysdeps/linux/i386/crt0.S - * Pull stuff off the stack and get uClibc moving. - * - * Copyright (C) 2000,2001 by Erik Andersen <andersen@uclibc.org> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Library General Public License as published by - * the Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License - * for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* Stick in a dummy reference to main(), so that if an application - * is linking when the main() function is in a static library (.a) - * we can be sure that main() actually gets linked in */ -extern void main(int argc,void *argv,void *envp); -void (*mainp)(int argc,void *argv,void *envp) = main; - -extern void __uClibc_main(int argc,void *argv,void *envp); - - -void _start(void) -{ - unsigned int argc; - char **argv, **envp; - unsigned long *stack; - - stack = ((unsigned long*)__builtin_frame_address(0))+16; - argc = *stack; - argv = (char **)stack + 1; - envp = (char **)stack + argc + 2; - - __uClibc_main(argc, argv, envp); -} - diff --git a/libc/sysdeps/linux/sparc/crt1.S b/libc/sysdeps/linux/sparc/crt1.S new file mode 100644 index 000000000..9d88c0bdf --- /dev/null +++ b/libc/sysdeps/linux/sparc/crt1.S @@ -0,0 +1,139 @@ +/* Startup code for elf32-sparc + Copyright (C) 1997, 1998, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +/* Originally based on glibc's sysdeps/sparc/sparc{32,64}/elf/start.S */ + +#include <features.h> +#include <bits/wordsize.h> + +/* macro out the 32 / 64 bit differences */ +#if __WORDSIZE == 32 +# define STACK_BIAS 0 +# define ELE_SIZE 4 +# define LD ld +#else +# define STACK_BIAS 2047 /* see glibc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h */ +# define ELE_SIZE 8 +# define LD ldx +#endif + +.text +.align 4 +.global _start +.type _start,%function +#if defined(__UCLIBC_CTOR_DTOR__) +.type _init,%function +.type _fini,%function +#else +.weak _init +.weak _fini +#endif +.type __uClibc_main,%function +/* Stick in a dummy reference to main(), so that if an application + * is linking when the main() function is in a static library (.a) + * we can be sure that main() actually gets linked in */ +.global main +.type main,%function + +#ifdef __PIC__ +.LLGETPC0: + retl + add %o7, %l7, %l7 +#endif + +_start: +#ifdef __PIC__ + sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7 + call .LLGETPC0 + add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7 +#endif + + /* Terminate the stack frame, and reserve space for functions to + * drop their arguments. */ + mov %g0, %fp + sub %sp, 6*ELE_SIZE, %sp + + /* Extract the arguments and environment as encoded on the stack. The + * argument info starts after one register window (16 words) past the SP. */ + LD [%sp+STACK_BIAS+22*ELE_SIZE], %o1 /* %o1 = argc */ + add %sp, STACK_BIAS+23*ELE_SIZE, %o2 /* %o2 = argv */ +#if 0 + mov %o1, %o7 /* envp = argc */ + sll %o7, ELE_SIZE/2, %o7 /* envp *= 4 */ + add %o2, %o7, %o7 /* envp += argv */ +#endif + + /* Load the addresses of the user entry points. */ + sethi %hi(main), %o0 + sethi %hi(_init), %o3 + sethi %hi(_fini), %o4 + or %o0, %lo(main), %o0 + or %o3, %lo(_init), %o3 + or %o4, %lo(_fini), %o4 +#ifdef __PIC__ + /* Need a little more magic when building PIC to get addr of main */ + LD [%l7 + %o0], %o0 + LD [%l7 + %o3], %o3 + LD [%l7 + %o4], %o4 +#endif + + /* When starting a binary via the dynamic linker, %g1 contains the + * address of the shared library termination function, which will be + * registered with atexit(). If we are statically linked, this will + * be NULL. */ + mov %g1, %o5 + + /* Let libc do the rest of the initialization, and call main. */ + call __uClibc_main + nop + + /* Die very horribly if exit returns. */ +#if __WORDSIZE == 32 + unimp +#else + illtrap 0 +#endif + +.size _start,.-_start + +/* Define a symbol for the first piece of initialized data. */ +.data +.global __data_start +__data_start: +.long 0 +.weak data_start + data_start = __data_start |