Cygwin: lockf: Fix adding a new lock over multiple locks
[newlib-cygwin.git] / libgloss / sparc / erc32-crt0.S
blob10b4fbc5885ae8c64b902a9425bd6041c4bba0bb
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  */
7 #include "asm.h"
9         .register %g2, #scratch
10         .register %g3, #scratch
12         .data
13         .align  8
14 SYM(environ):
15         .long   0
17         .text
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
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
39         /* move data segment to proper location */
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
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]
59 initok:
60 #endif
62         call    SYM(__fix_ctors)
63         nop
64         call    SYM(main)
65         nop
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
73         .globl  SYM(_exit)
74 SYM(_exit):
75         set     0xdeadd00d, %o1         ! Magic number for simulator.
76         ta      0                       ! Halt if _main returns ...
77         nop