]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/uclibc/lib/contrib/uclibc/libc/sysdeps/linux/bfin/crt1.S
update
[l4.git] / l4 / pkg / uclibc / lib / contrib / uclibc / libc / sysdeps / linux / bfin / crt1.S
1 /* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
2
3 This file is part of the GNU C Library.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, see <http://www.gnu.org/licenses/>.  */
18
19
20 /* When we enter this piece of code, the user stack looks like this:
21 *      argc            argument counter (integer)
22 *      argv[0]         program name (pointer)
23 *      argv[1...N]     program args (pointers)
24 *      NULL
25 *      env[0...N]      environment variables (pointers)
26 *      NULL
27         
28 *   When we are done here, we want
29 *       R0=argc
30 *       R1=*argv[0]
31 *       R2=*envp[0]  
32 */
33
34 #include <features.h>
35
36 #undef USE_GOT
37 #if defined (__UCLIBC_FORMAT_SHARED_FLAT__) || defined (__UCLIBC_FORMAT_FLAT_SEP_DATA__)
38 #define USE_GOT
39 #endif
40
41 #if !(defined L_Scrt1 && defined __UCLIBC_FORMAT_SHARED_FLAT__)
42
43 .text
44 .align 2
45 .global __start;
46 .type   __start,STT_FUNC;
47 .weak   __init;
48 .weak   __fini;
49 .global ___uClibc_main;
50 .type   ___uClibc_main,STT_FUNC;
51
52 /* Stick in a dummy reference to main(), so that if an application
53  * is linking when the main() function is in a static library (.a)
54  * we can be sure that main() actually gets linked in */
55
56 .type   _main,STT_FUNC;
57
58 __start:
59
60 #if defined(__BFIN_FDPIC__) && !defined(L_Scrt1)
61         /* P0 contains a pointer to the program's load map.  */
62         call    .Lcall;
63 .Lcall:
64         R4 = RETS;
65         SP += -12;
66         R0.L = .Lcall;
67         R0.H = .Lcall;
68         R1.L = __ROFIXUP_LIST__;
69         R1.H = __ROFIXUP_LIST__;
70         R2.L = __ROFIXUP_END__;
71         R2.H = __ROFIXUP_END__;
72         R1 = R1 - R0;
73         R1 = R1 + R4;
74         R2 = R2 - R0;
75         R2 = R2 + R4;
76         R0 = P0;
77         CALL    ___self_reloc;
78         SP += 12;
79         P3 = R0;
80 #endif
81
82 /*      clear the frame pointer and the L registers.  */
83         FP = 0;
84         L0 = 0;
85         L1 = 0;
86         L2 = 0;
87         L3 = 0;
88
89 #ifdef __ID_SHARED_LIB__
90         /* We know we have a local copy, so we can avoid the GOT.  */
91         CALL ___shared_flat_add_library;
92 #endif
93 /*      Load register R1 (argc) from the stack to its final resting place */
94         P0 = SP;
95         R1 = [P0++];
96
97 /*      Copy argv pointer into R2 -- which its final resting place */
98         R2 = P0;
99
100         SP += -28;
101
102 #ifndef __BFIN_FDPIC__
103         R7 = 0;
104 #endif
105         /* Pass highest stack pointer to the app.  */
106         [SP + 24] = P2;
107         /* Store the pointer to ld.so's fini that we got in P1.  */
108         [SP + 20] = R7;
109
110 /*      Ok, now run uClibc's main() -- shouldn't return */
111 #if (defined L_crt1 || defined L_Scrt1) && defined __UCLIBC_CTOR_DTOR__
112
113 #ifdef __BFIN_FDPIC__
114         R3 = [P3 + __init@FUNCDESC_GOT17M4];
115 #elif defined USE_GOT
116         R3 = [P5 + ___shared_flat_init@GOT];
117 #else
118         R3.H = __init;
119         R3.L = __init;
120 #endif
121         [SP+12] = R3;
122
123
124 #ifdef __BFIN_FDPIC__
125         R3 = [P3 + __fini@FUNCDESC_GOT17M4];
126 #elif defined USE_GOT
127         R3 = [P5 + ___shared_flat_fini@GOT];
128 #else   
129         R3.H = __fini;
130         R3.L = __fini;
131 #endif
132         [SP+16] = R3;
133 #else /* no ctor/dtor handling */
134         R3 = 0;
135         [SP + 12] = R3;
136         [SP + 16] = R3;
137 #endif
138
139 #ifdef __BFIN_FDPIC__
140         R0 = [P3 + _main@FUNCDESC_GOT17M4];
141 #elif defined USE_GOT
142         R0 = [P5 + _main@GOT];
143 #else
144         R0.H = _main;
145         R0.L = _main;
146 #endif
147 #ifdef USE_GOT
148         P0 = [P5 + ___uClibc_main@GOT];
149         jump (P0)
150 #else
151         jump.l  ___uClibc_main;
152 #endif
153
154 #else
155         .text
156         .global lib_main
157         .hidden lib_main
158         .type lib_main,@function
159 lib_main:
160         RETS = [SP++];
161         /* We know we have a local copy, so we can avoid the GOT.  */
162         JUMP.L ___shared_flat_add_library;
163
164         .hidden _current_shared_library_p5_offset_
165 #endif
166
167 .section .note.GNU-stack,"",%progbits