OSDN Git Service

sync with blackfin cvs
authorMike Frysinger <vapier@gentoo.org>
Wed, 1 Mar 2006 05:27:37 +0000 (05:27 -0000)
committerMike Frysinger <vapier@gentoo.org>
Wed, 1 Mar 2006 05:27:37 +0000 (05:27 -0000)
libc/sysdeps/linux/bfin/crt1.S

index 7b6a99d..dd30370 100644 (file)
@@ -6,7 +6,7 @@
  */
 
 /* When we enter this piece of code, the user stack looks like this:
-*      argc            argument counter (integer)
+* [SP] argc            argument counter (integer)
 *      argv[0]         program name (pointer)
 *      argv[1...N]     program args (pointers)
 *      NULL
@@ -15,8 +15,9 @@
 
 *   When we are done here, we want
 *      R0=argc
-*      R1=*argv[0]
-*      R2=*envp[0]
+*      R1=argv
+*      R2=__init
+*   SP=__fini
 */
 
 #include <features.h>
 .global ___uClibc_main;
 .type  ___uClibc_main,STT_FUNC;
 
+#define __UCLIBC_CTOR_DTOR__
 #if defined(__UCLIBC_CTOR_DTOR__)
-.type   __init,%function
-.type   __fini,%function
-#else
-.weak   __init
-.weak   __fini
+.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 */
+/*     clear the frame pointer and the L registers.  */
        FP = 0;
+       L0 = 0;
+       L1 = 0;
+       L2 = 0;
+       L3 = 0;
 
 /*     Load register R0 (argc) from the stack to its final resting place */
        P0 = SP;
@@ -61,14 +51,22 @@ __start:
 /*     Copy argv pointer into R1 */
        R1 = P0;
 
+#if defined(__UCLIBC_CTOR_DTOR__)
 /*     Load __init into R2 */
-       R2 = __init;
+       R2.H = __init;
+       R2.L = __init;
 
 /*     Load __fini onto the stack */
-       P0 = __fini;
-       [SP--] = P0;
+       SP += -16;
+       R3.H = __fini;
+       R3.L = __fini;
+       [SP+12] = R3;
+#else
+/*     Just fixup the stack */
+       sp += -12;
+#endif
 
 /*     Ok, now run uClibc's main() -- shouldn't return */
-       sp += -8;
        jump.l  ___uClibc_main;
+
 .size __start,.-__start