fixes for host gcc 4.6.1
[zpugcc/jano.git] / toolchain / gcc / libgloss / m68k / crt0.S
blob321b97f036a26eeb909c15ebcfa04adc00e89c92
1 /*
2  * crt0.S -- startup file for m68k-coff
3  *
4  * Copyright (c) 1995, 1996, 1998 Cygnus Support
5  *
6  * The authors hereby grant permission to use, copy, modify, distribute,
7  * and license this software and its documentation for any purpose, provided
8  * that existing copyright notices are retained in all copies and that this
9  * notice is included verbatim in any distributions. No written agreement,
10  * license, or royalty fee is required for any of the authorized uses.
11  * Modifications to this software may be copyrighted by their authors
12  * and need not follow the licensing terms described here, provided that
13  * the new terms are clearly indicated on the first page of each file where
14  * they apply.
15  */
17 #include "asm.h"
19         .title "crt0.S for m68k-coff"
20 #define STACKSIZE       0x4000
23  * Define an empty environment.
24  */
25         .data
26         .align 2
27 SYM (environ):
28         .long 0
30         .align  2
31         .text
34  * These symbols are defined in C code, so they need to always be
35  * named with SYM because of the difference between object file formats.
36  */
38 /* These are defined in C code. */
39         .extern SYM (main)
40         .extern SYM (exit)
41         .extern SYM (hardware_init_hook)
42         .extern SYM (software_init_hook)
43         .extern SYM (atexit)
44         .extern SYM(__do_global_dtors)
46 /* 
47  * These values are set in the linker script, so they must be
48  * explicitly named here without SYM.
49  */
50         .extern __stack
51         .extern __bss_start
52         .extern _end
55  * set things up so the application will run. This *must* be called start.
56  */
57         .global SYM (start)
59 SYM (start):
60         /*
61          * put any hardware init code here
62          */
64         /* See if user supplied their own stack (__stack != 0).  If not, then
65          * default to using the value of %sp as set by the ROM monitor.
66          */
67         movel   IMM(__stack), a0
68         cmpl    IMM(0), a0
69         jbeq    1f
70         movel   a0, sp
72         /* set up initial stack frame */
73         link    a6, IMM(-8)
76  * zero out the bss section.
77  */
78         movel   IMM(__bss_start), d1
79         movel   IMM(_end), d0
80         cmpl    d0, d1
81         jbeq    3f
82         movl    d1, a0
83         subl    d1, d0
84         subql   IMM(1), d0
86         clrb    (a0)+
87 #if !defined(__mcoldfire__) && !defined(__mcf5200__)
88         dbra    d0, 2b
89         clrw    d0
90         subql   IMM(1), d0
91         jbcc    2b
92 #else
93         subql   IMM(1), d0
94         jbpl    2b
95 #endif
96         
100  * initialize target specific stuff. Only execute these
101  * functions it they exist.
102  */
103         PICLEA  SYM (hardware_init_hook), a0
104         cmpl    IMM(0),a0
105         jbeq    4f
106         jsr     (a0)
109         PICLEA  SYM (software_init_hook), a0
110         cmpl    IMM(0),a0
111         jbeq    5f
112         jsr     (a0)
116  * call the main routine from the application to get it going.
117  * main (argc, argv, environ)
118  * we pass argv as a pointer to NULL.
119  */
121 #ifdef ADD_DTORS
122         /* put __do_global_dtors in the atexit list so the destructors get run */
123         movel   IMM (SYM(__do_global_dtors)),(sp)
124         PICCALL SYM (atexit)
125 #endif
126         movel   IMM (__FINI_SECTION__),(sp)
127         PICCALL SYM (atexit)
129         PICCALL __INIT_SECTION__
131         pea     0
132         PICPEA  SYM (environ),a0
133         pea     sp@(4)
134         pea     0
135         PICCALL SYM (main)
136         movel   d0, sp@-
139  * drop down into exit incase the user doesn't. This should drop
140  * control back to the ROM monitor, if there is one. This calls the
141  * exit() from the C library so the C++ tables get cleaned up right.
142  */
143         PICCALL SYM (exit)