OSDN Git Service

Fix arm so it actually works.
authorEric Andersen <andersen@codepoet.org>
Tue, 16 Jan 2001 19:00:46 +0000 (19:00 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 16 Jan 2001 19:00:46 +0000 (19:00 -0000)
libc/sysdeps/linux/arm/crt0.S

index 90478fa..115650f 100644 (file)
-/* 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