OSDN Git Service

rewrite crt in asm using glibc as a basis
authorMike Frysinger <vapier@gentoo.org>
Sat, 9 Jul 2005 00:36:34 +0000 (00:36 -0000)
committerMike Frysinger <vapier@gentoo.org>
Sat, 9 Jul 2005 00:36:34 +0000 (00:36 -0000)
libc/sysdeps/linux/sparc/Makefile
libc/sysdeps/linux/sparc/crt0.c [deleted file]
libc/sysdeps/linux/sparc/crt1.S [new file with mode: 0644]

index 614161f..5c91176 100644 (file)
@@ -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 (file)
index 81caf1e..0000000
+++ /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 (file)
index 0000000..9d88c0b
--- /dev/null
@@ -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