1 | /* |
---|
2 | * This is based on the file srt0.s provided with the binary |
---|
3 | * distribution of the SPARC Instruction Simulator (SIS) found |
---|
4 | * at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32. |
---|
5 | */ |
---|
6 | |
---|
7 | #include "asm.h" |
---|
8 | |
---|
9 | .register %g2, #scratch |
---|
10 | .register %g3, #scratch |
---|
11 | |
---|
12 | .data |
---|
13 | .align 8 |
---|
14 | SYM(environ): |
---|
15 | .long 0 |
---|
16 | |
---|
17 | .text |
---|
18 | |
---|
19 | .globl SYM(start) |
---|
20 | SYM(start): |
---|
21 | sethi %hi(__stack), %g1 |
---|
22 | or %g1,%lo(__stack),%g1 |
---|
23 | mov %g1, %sp ! set the stack pointer |
---|
24 | mov %sp, %fp |
---|
25 | |
---|
26 | /* clear the bss */ |
---|
27 | sethi %hi(__bss_start),%g2 |
---|
28 | or %g2,%lo(__bss_start),%g2 ! start of bss |
---|
29 | sethi %hi(_end),%g3 |
---|
30 | or %g3,%lo(_end),%g3 ! end of bss |
---|
31 | mov %g0,%g1 ! so std has two zeros |
---|
32 | zerobss: |
---|
33 | std %g0,[%g2] |
---|
34 | add %g2,8,%g2 |
---|
35 | cmp %g2,%g3 |
---|
36 | bleu,a zerobss |
---|
37 | nop |
---|
38 | |
---|
39 | /* move data segment to proper location */ |
---|
40 | |
---|
41 | #if 0 |
---|
42 | relocd: |
---|
43 | set (_endtext),%g2 ! g2 = start of data in aout file |
---|
44 | set (_environ),%g4 ! g4 = start of where data should go |
---|
45 | set (_edata),%g3 ! g3 = end of where data should go |
---|
46 | subcc %g3, %g4, %g5 ! g5 = length of data |
---|
47 | |
---|
48 | subcc %g4, %g2, %g0 ! need to relocate data ? |
---|
49 | ble initok |
---|
50 | ld [%g4], %g6 |
---|
51 | subcc %g6, 1, %g0 |
---|
52 | be initok |
---|
53 | mvdata: |
---|
54 | subcc %g5, 8, %g5 |
---|
55 | ldd [%g2 + %g5], %g6 |
---|
56 | bg mvdata |
---|
57 | std %g6, [%g4 + %g5] |
---|
58 | |
---|
59 | initok: |
---|
60 | #endif |
---|
61 | |
---|
62 | call SYM(__fix_ctors) |
---|
63 | nop |
---|
64 | call SYM(main) |
---|
65 | nop |
---|
66 | |
---|
67 | /* call exit from the C library so atexit gets called, and the |
---|
68 | * C++ destructors get run. This calls our exit routine below * when it's done. |
---|
69 | */ |
---|
70 | call SYM(exit) |
---|
71 | nop |
---|
72 | |
---|
73 | .globl SYM(_exit) |
---|
74 | SYM(_exit): |
---|
75 | set 0xdeadd00d, %o1 ! Magic number for simulator. |
---|
76 | ta 0 ! Halt if _main returns ... |
---|
77 | nop |
---|
78 | |
---|