diff options
Diffstat (limited to 'libc/sysdeps/linux/sparc')
| -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 | 
