blob: dd30370b3bdd165e89f45e31e221f7bf656f5382 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/* Initial C runtime code for Blackfin
*
* Copyright (C) 2004-2006 Erik Andersen <andersen@uclibc.org>
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
/* When we enter this piece of code, the user stack looks like this:
* [SP] argc argument counter (integer)
* argv[0] program name (pointer)
* argv[1...N] program args (pointers)
* NULL
* env[0...N] environment variables (pointers)
* NULL
* When we are done here, we want
* R0=argc
* R1=argv
* R2=__init
* SP=__fini
*/
#include <features.h>
.text
.align 2
.global __start;
.type __start,STT_FUNC;
.global ___uClibc_main;
.type ___uClibc_main,STT_FUNC;
#define __UCLIBC_CTOR_DTOR__
#if defined(__UCLIBC_CTOR_DTOR__)
.weak __init;
.weak __fini;
#endif
__start:
/* 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;
R0 = [P0++];
/* Copy argv pointer into R1 */
R1 = P0;
#if defined(__UCLIBC_CTOR_DTOR__)
/* Load __init into R2 */
R2.H = __init;
R2.L = __init;
/* Load __fini onto the stack */
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 */
jump.l ___uClibc_main;
.size __start,.-__start
|