Cygwin: lockf: Fix adding a new lock over multiple locks
[newlib-cygwin.git] / libgloss / rx / crt0.S
blob6d7089d4d273193d24bfc628ddda5ffc177fd44f
1 /* Copyright (c) 2008, 2009, 2011 Red Hat Incorporated.
2    All rights reserved.
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions
6    are met: 
8      Redistributions of source code must retain the above copyright 
9      notice, this list of conditions and the following disclaimer.
11      Redistributions in binary form must reproduce the above copyright
12      notice, this list of conditions and the following disclaimer in the
13      documentation and/or other materials provided with the distribution.
15      The name of Red Hat Incorporated may not be used to endorse 
16      or promote products derived from this software without specific 
17      prior written permission.
19    This software is provided by the copyright holders and contributors
20    "AS IS" and any express or implied warranties, including, but not
21    limited to, the implied warranties of merchantability and fitness for
22    a particular purpose are disclaimed.  In no event shall Red Hat
23    incorporated be liable for any direct, indirect, incidental, special,
24    exemplary, or consequential damages (including, but not limited to,
25    procurement of substitute goods or services; loss of use, data, or
26    profits; or business interruption) however caused and on any theory of
27    liability, whether in contract, strict liability, or tort (including
28    negligence or otherwise) arising in any way out of the use of this
29    software, even if advised of the possibility of such damage.  */
31         .text
33         .global _start
34 _start:
35 .LFB2:
36         mvtc    #0, psw
37         /* Enable the DN bit - this should have been done for us by
38            the CPU reset, but it is best to make sure for ourselves.  */        
39         mvtc    #0x100, fpsw
40         mov     #__stack, r0
41         mvtc    #__vectors, intb
43         /* Copy the .data section from ROM into RAM.  */
44         mov     #__datastart, r1
45         mov     #__romdatastart, r2
46         mov     #__romdatacopysize, r3
47 #ifdef __RX_DISALLOW_STRING_INSNS__
48         cmp     #0, r3
49         beq     2f
51 1:      mov.b   [r2+], r5
52         mov.b   r5, [r1+]
53         sub     #1, r3
54         bne     1b
55 2:      
56 #else
57         smovf
58 #endif
60         /* Initialise the contents of the .bss section.  */
61         mov     #__bssstart, r1
62         mov     #0, r2
63         mov     #__bsssize, r3
64         sstr.l
66         /* Initialize data pointer register(s).
67            Note: The registers used here should agree with the definition of
68            GP_BASE_REGNUM in gcc/config/rx/rx.h.
69            Note: We are assuming that -mint-register has not been used when
70            compiling the application.  */
71 #ifdef _RX_PID
72         /* Initialise the constant data pointer and small data pointers.  */
73         mov     #__pid_base, r13
74         mov     #__gp, r12
75 #else
76         /* Initialise the small data area pointer.  */
77         mov     #__gp, r13
78 #endif
79         
80         bsr.a   __rx_init
82 #ifdef PROFILE_SUPPORT  /* Defined in gcrt0.S.  */
83         mov     # _start, r1
84         mov     # _etext, r2
85         bsr.a   __monstartup
86 #endif
88         mov     #0, r1 /* argc */
89         mov     #0, r2 /* argv */
90         mov     #0, r3 /* envv */
91         bsr.a   _main
92 .LFE2:
94 #ifdef PROFILE_SUPPORT
95         mov      r1, r13       ; Save return code.
96         bsr.a   __mcleanup
97         mov     r13, r1
98 #endif
100         bsr.a   _exit
102         .global _rx_run_preinit_array
103         .type   _rx_run_preinit_array,@function
104 _rx_run_preinit_array:
105         mov     #__preinit_array_start,r1
106         mov     #__preinit_array_end,r2
107         bra.a   _rx_run_inilist
109         .global _rx_run_init_array
110         .type   _rx_run_init_array,@function
111 _rx_run_init_array:
112         mov     #__init_array_start,r1
113         mov     #__init_array_end,r2
114         mov     #4, r3
115         bra.a   _rx_run_inilist
117         .global _rx_run_fini_array
118         .type   _rx_run_fini_array,@function
119 _rx_run_fini_array:
120         mov     #__fini_array_start,r2
121         mov     #__fini_array_end,r1
122         mov     #-4, r3
123         /* fall through */
125 _rx_run_inilist:
126 next_inilist:
127         cmp     r1,r2
128         beq.b   done_inilist
129         mov.l   [r1],r4
130         cmp     #-1, r4
131         beq.b   skip_inilist
132         cmp     #0, r4
133         beq.b   skip_inilist
134         pushm   r1-r3
135         jsr     r4
136         popm    r1-r3
137 skip_inilist:
138         add     r3,r1
139         bra.b   next_inilist
140 done_inilist:
141         rts
143         .section        .init,"ax"
145         .global __rx_init
146 __rx_init:
148         .section        .fini,"ax"
150         .global __rx_fini
151 __rx_fini:
152         bsr.a   _rx_run_fini_array
154         .section .rodata
155         .balign 4
156         .global __pid_base
157         .weak   __pid_base
158 __pid_base:   
160         .section .sdata
161         .balign 4
162         .global __gp
163         .weak   __gp
164 __gp:   
166         .section .data
167         .global ___dso_handle
168         .weak   ___dso_handle
169 ___dso_handle:
170         .long   0
172 ;;; Provide Dwarf unwinding information that will help GDB stop
173 ;;; backtraces at the right place.  This is stolen from assembly
174 ;;; code generated by GCC with -dA.
175         .section        .debug_frame,"",@progbits
176 .Lframe0:
177         .4byte  .LECIE0-.LSCIE0 ; Length of Common Information Entry
178 .LSCIE0:
179         .4byte  0xffffffff      ; CIE Identifier Tag
180         .byte   0x1     ; CIE Version
181         .ascii "\0"     ; CIE Augmentation
182         .uleb128 0x1    ; CIE Code Alignment Factor
183         .sleb128 -1     ; CIE Data Alignment Factor
184         .byte   0xd     ; CIE RA Column
185         .byte   0xc     ; DW_CFA_def_cfa
186         .uleb128 0xc
187         .uleb128 0x3
188         .byte   0x8d    ; DW_CFA_offset, column 0xd
189         .uleb128 0x3
190         .p2align 2
191 .LECIE0:
192 .LSFDE0:
193         .4byte  .LEFDE0-.LASFDE0        ; FDE Length
194 .LASFDE0:
195         .4byte  .Lframe0        ; FDE CIE offset
196         .4byte  .LFB2           ; FDE initial location
197         .4byte  .LFE2-.LFB2     ; FDE address range
198         .byte   0xf             ; DW_CFA_def_cfa_expression
199         .uleb128 1              ; length of expression
200         .byte   0x30            ; DW_OP_lit0
201         .p2align 2
202 .LEFDE0:
204         .text