summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux')
-rw-r--r--libc/sysdeps/linux/bfin/crt0.S68
-rw-r--r--libc/sysdeps/linux/bfin/crt1.S74
2 files changed, 74 insertions, 68 deletions
diff --git a/libc/sysdeps/linux/bfin/crt0.S b/libc/sysdeps/linux/bfin/crt0.S
deleted file mode 100644
index 4ddfd16b9..000000000
--- a/libc/sysdeps/linux/bfin/crt0.S
+++ /dev/null
@@ -1,68 +0,0 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
-
-This file is part of the GNU C Library.
-
-The GNU C Library 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.
-
-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
-Library General Public License for more details.
-
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB. If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA. */
-
-
-/* When we enter this piece of code, the user stack looks like this:
-* argc argument counter (integer)
-* argv[0] program name (pointer)
-* argv[1...N] program args (pointers)
-* NULL
-* env[0...N] environment variables (pointers)
-* NULL
-
-* When we are done here, we want
-* R0=argc
-* R1=*argv[0]
-* R2=*envp[0]
-*/
-
-.text
-.align 2
-.global _start;
-.type _start,STT_FUNC;
-.global ___uClibc_main;
-.type ___uClibc_main,STT_FUNC;
-
-/* 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 */
-
-.type _main,STT_FUNC;
-
-_start:
-
-/* clear the frame pointer */
- FP = 0;
-/* Load register R0 (argc) from the stack to its final resting place */
- P0 = SP;
- R0 = [P0++];
-
-/* Copy argv pointer into R1 -- which its final resting place */
- R1 = P0;
-
-/* Skip to the end of argv and put a pointer to the environment in R2 */
- R2 = R0;
- R2 <<= 2;
- R2 += 4;
- R2 = R1+R2;
-
-/* Ok, now run uClibc's main() -- shouldn't return */
- sp += -12;
- jump.l ___uClibc_main;
-
diff --git a/libc/sysdeps/linux/bfin/crt1.S b/libc/sysdeps/linux/bfin/crt1.S
new file mode 100644
index 000000000..7b6a99de0
--- /dev/null
+++ b/libc/sysdeps/linux/bfin/crt1.S
@@ -0,0 +1,74 @@
+/* Initial C runtime code for Blackfin
+ *
+ * Copyright (C) 2004-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+
+/* When we enter this piece of code, the user stack looks like this:
+* argc argument counter (integer)
+* argv[0] program name (pointer)
+* argv[1...N] program args (pointers)
+* NULL
+* env[0...N] environment variables (pointers)
+* NULL
+
+* When we are done here, we want
+* R0=argc
+* R1=*argv[0]
+* R2=*envp[0]
+*/
+
+#include <features.h>
+
+.text
+.align 2
+.global __start;
+.type __start,STT_FUNC;
+.global ___uClibc_main;
+.type ___uClibc_main,STT_FUNC;
+
+#if defined(__UCLIBC_CTOR_DTOR__)
+.type __init,%function
+.type __fini,%function
+#else
+.weak __init
+.weak __fini
+#endif
+
+/*
+ When we enter, our stack looks like:
+ [ SP ]
+ [argc][argv]...
+
+ Call ___uClibc_main(argc, argv, __init, __fini)
+ R0 R1 R2 stack
+
+ Before we call main, we want:
+ [ SP ]
+ [fini][argc][argv]
+*/
+
+__start:
+
+/* clear the frame pointer */
+ FP = 0;
+
+/* Load register R0 (argc) from the stack to its final resting place */
+ P0 = SP;
+ R0 = [P0++];
+
+/* Copy argv pointer into R1 */
+ R1 = P0;
+
+/* Load __init into R2 */
+ R2 = __init;
+
+/* Load __fini onto the stack */
+ P0 = __fini;
+ [SP--] = P0;
+
+/* Ok, now run uClibc's main() -- shouldn't return */
+ sp += -8;
+ jump.l ___uClibc_main;
+.size __start,.-__start