summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libc/sysdeps/linux/arm/crt0.S122
1 files changed, 82 insertions, 40 deletions
diff --git a/libc/sysdeps/linux/arm/crt0.S b/libc/sysdeps/linux/arm/crt0.S
index 90478fa59..115650f98 100644
--- a/libc/sysdeps/linux/arm/crt0.S
+++ b/libc/sysdeps/linux/arm/crt0.S
@@ -1,61 +1,103 @@
-/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+/* When we enter this piece of code, the program stack looks like this:
+ argc argument counter (integer)
+ argv[0] program name (pointer)
+ argv[1...N] program args (pointers)
+ argv[argc-1] end of args (integer)
+ env[0...N] environment variables (pointers)
+ NULL
+
+This file now uses the register naming from the ARM Procedure Calling Standard
+
+ Name Number APCS Role
+
+ a1 0 argument 1 / integer result / scratch register / argc
+ a2 1 argument 2 / scratch register / argv
+ a3 2 argument 3 / scratch register / envp
+ a4 3 argument 4 / scratch register
+ v1 4 register variable
+ v2 5 register variable
+ v3 6 register variable
+ v4 7 register variable
+ v5 8 register variable
+ sb/v6 9 static base / register variable
+ sl/v7 10 stack limit / stack chunk handle / reg. variable
+ fp 11 frame pointer
+ ip 12 scratch register / new-sb in inter-link-unit calls
+ sp 13 lower end of current stack frame
+ lr 14 link address / scratch register
+ pc 15 program counter
+*/
-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.
+.text
+ .align 2
+ .global __environ
+ .global _start
+ .global exit
+ .global main
+ .global __libc_init
+ .global __init_stdio
+ .global __stdio_close_all
+ .global _void_void_null_func
+
+ .type _start,%function
+ .type exit,%function
+ .type main,%function
+ .type __libc_init,%function
+ .type __init_stdio,%function
+ .type __stdio_close_all,%function
+ .type _void_void_null_func,%function
-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. */
+.text
+_start:
+ /* clear the frame pointer */
+ mov fp, #0
-#define BASEREG r9
+ /* Load argc into a1 -- its final resting place */
+ ldr a1, [sp], #4
-@ r0 = argc
-@ r1 = argv
-@ r2 = envp
-@ sl = data segment
+ /* Load argv into a2 -- which its final resting place */
+ mov a2, sp
+ /* Set up environ, skip to the end of argv, and put
+ * a pointer to whatever we find there (hopefully the
+ environment) in a3 */
+ ldr a4, .L3
+ add a3, a2, a1, lsl #2
+ add a3, a3, #4
+ str a3, [a4, #0]
+ /* Tell libc to initialize whatever it needs */
+ bl __libc_init
+ bl __init_stdio
+ bl main
+ bl exit
- .text
- .align 2
- .global _start, exit, main
- .type _start,%function
+_void_void_null_func:
+ nop
-.text
-_start:
- @ adjust the data sgement base pointer
- ldr r3,=__data_start
- sub sl,sl,r3
- mov BASEREG,sl
+.weak __libc_init
+__libc_init = _void_void_null_func
- ldr r3, .L3
- str r2,[BASEREG,r3]
- ldr r0,[sp, #0]
- ldr r1,[sp, #4]
- ldr r2,[sp, #8]
- bl main
- ldr r0,=0
- bl exit
+.weak __init_stdio
+__init_stdio = _void_void_null_func
+.weak __stdio_close_all
+__stdio_close_all = _void_void_null_func
-.L3: .word environ
+.align 2
+.L3:
+ .word environ
- .data
+.data
.align 2
.global __environ
-__environ: .long 0
+__environ:
+ .long 0
+
.weak environ
environ = __environ