summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/arm/crt0.S
diff options
context:
space:
mode:
authorDavid McCullough <davidm@snapgear.com>2001-12-19 03:43:54 +0000
committerDavid McCullough <davidm@snapgear.com>2001-12-19 03:43:54 +0000
commitbf126cb24e809f36067ce43f9186cbe53b906cad (patch)
treee9612ead69662cd0cd642829041195b06750b2d3 /libc/sysdeps/linux/arm/crt0.S
parent41b035e634135310bca3381877120981d7b248a4 (diff)
merged the two startup files so that uClinux people always get the correct
arg processing whether they are using PIC or not, and vice-versa for the MMU folks.
Diffstat (limited to 'libc/sysdeps/linux/arm/crt0.S')
-rw-r--r--libc/sysdeps/linux/arm/crt0.S30
1 files changed, 30 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S
index 65253881c..de7ef7848 100644
--- a/libc/sysdeps/linux/arm/crt0.S
+++ b/libc/sysdeps/linux/arm/crt0.S
@@ -6,6 +6,18 @@
NULL
env[0...N] environment variables (pointers)
NULL
+
+ For uClinux it looks like this:
+
+ argc argument counter (integer)
+ argv char *argv[]
+ envp char *envp[]
+ argv[0] program name (pointer)
+ argv[1...N] program args (pointers)
+ argv[argc-1] end of args (integer)
+ NULL
+ env[0...N] environment variables (pointers)
+ NULL
When we are done here, we want
a1=argc
@@ -34,6 +46,7 @@ ARM register quick reference:
pc r15 program counter
*/
+#include <features.h>
.text
.global _start
@@ -44,10 +57,17 @@ ARM register quick reference:
.text
_start:
+#if 0 /* some old code the I feel should not be here - davidm */
+ @ adjust the data segment base pointer
+ ldr r3,=__data_start
+ sub sl,sl,r3
+ mov BASEREG,sl
+#endif
/* clear the frame pointer */
mov fp, #0
+#ifdef __UCLIBC_HAS_MMU__
/* Load register r0 (argc) from the stack to its final resting place */
ldr r0, [sp], #4
@@ -58,6 +78,16 @@ _start:
we find there (hopefully the environment) in r2 */
add r2, r1, r0, lsl #2
add r2, r2, #4
+#else
+ /*
+ * uClinux stacks look a little different to MMU stacks
+ * for no good reason
+ */
+ /* pull argc, argv and envp off the stack */
+ ldr r0,[sp, #0]
+ ldr r1,[sp, #4]
+ ldr r2,[sp, #8]
+#endif
/* Ok, now run uClibc's main() -- shouldn't return */
bl __uClibc_main