Update and reformat copyright, remove trailing white spaces and send
[kopensolaris-gnu/glibc.git] / sysdeps / standalone / m68k / m68020 / start.S
1 /* Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc.
2    Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
3      On-Line Applications Research Corporation.
4    This file is part of the GNU C Library.
5
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Library General Public License as
8    published by the Free Software Foundation; either version 2 of the
9    License, or (at your option) any later version.
10
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Library General Public License for more details.
15
16    You should have received a copy of the GNU Library General Public
17    License along with the GNU C Library; see the file COPYING.LIB.  If not,
18    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /*  entry.s
22  *
23  *  This file contains the entry point for the application.
24  *  The name of this entry point is compiler dependent.
25  *  It jumps to the BSP which is responsible for performing
26  *  all initialization.
27  */
28
29         .text
30               .globl   start                        | Default entry point
31               .globl   _start                       | Default entry point
32               .globl   M68Kvec                      | Vector Table
33               .globl   _M68Kvec                     | Vector Table
34
35 start:
36 _start:
37 M68Kvec:                               | standard location for vectors
38 _M68Kvec:                               | standard location for vectors
39         nop                             | for linkers with problem
40                                         |   using location zero as entry
41         jmp      around
42         .space   4088                   | to avoid initial intr stack
43                                         |   from 135BUG on MVME13? as entry
44                                         |   and start code at 0x4000
45 around:
46         move.w  %sr,initial_sr          | save initial values
47         movec   %isp,%a0
48         movel   %a0,initial_isp
49         movec   %usp,%a0
50         movel   %a0,initial_usp
51         movec   %msp,%a0
52         movel   %a0,initial_msp
53         oriw    #0x0700,%sr             | INTERRUPTS OFF!!!
54
55
56
57         |
58         | zero out uninitialized data area
59         |
60 zerobss:
61         moveal  #end,%a0                | find end of .bss
62         moveal  #_bss_start,%a1         | find beginning of .bss
63         movel   #0,%d0
64
65 loop:   movel   #0,%a1@+                | to zero out uninitialized
66         cmpal   %a0,%a1
67         jlt     loop                    | loop until _end reached
68
69         movel   #heap_size,__C_heap_size | set ___C_heap_size
70         movel   #heap_memory,__C_heap_start | set ___C_heap_start
71         moveal  #interrupt_stack_end,%a0 | set interrupt stack pointer
72         movec   %a0,%isp
73         moveal  #stack_end,%a0          | set master stack pointer
74         movec   %a0,%msp
75         moveal  #stack_end,%a6          | set base pointer
76         movw    #0x3000,%sr             | SUPV MODE,INTERRUPTS ON!!!
77
78 #ifdef NEED_UNDERSCORES
79         jsr     __Board_Initialize      | initialize the board
80 #else
81         jsr     _Board_Initialize       | initialize the board
82 #endif
83
84         move.l  #0,%sp@-                | envp = NULL
85         move.l  #0,%sp@-                | argv = NULL
86         move.l  #0,%sp@-                | argc = NULL
87 #ifdef NEED_UNDERSCORES
88         jsr     ___libc_init            | initialize the library and
89                                         |   call main
90 #else
91         jsr     __libc_init             | initialize the library and
92                                         |   call main
93 #endif
94         add.l   #12,%sp
95
96         move.l  #0,%sp@-                | argc = NULL
97         jsr     __exit                  | call the Board specific exit
98         addq.l  #4,%sp
99
100         move.l  initial_isp,%a0         | if __exit returns then we can
101         movec   %a0,%isp                |   restore the initial values
102         move.l  initial_usp,%a0
103         movec   %a0,%usp
104         move.l  initial_msp,%a0
105         movec   %a0,%msp
106         move.w  initial_sr,%sr
107         rts
108
109
110         .bss
111
112 /*
113  *  So initial stack registers and status register can be saved.
114  */
115
116 #define DECLARE_SPACE(_name,_space,_align) \
117           .globl   _name ; \
118           .align   _align ; \
119 _name##:  .space _space
120
121 #define DECLARE_LABEL(_name) \
122           .globl   _name ; \
123 _name##:
124
125 #define DECLARE_PTR(_name) DECLARE_SPACE(_name,4,2)
126 #define DECLARE_U32(_name) DECLARE_SPACE(_name,4,2)
127 #define DECLARE_U16(_name) DECLARE_SPACE(_name,2,1)
128
129 DECLARE_U32(initial_isp)
130 DECLARE_U32(initial_msp)
131 DECLARE_U32(initial_usp)
132 DECLARE_U16(initial_sr)
133
134 /*
135  *  Require environment stuff
136  */
137
138 DECLARE_LABEL(_environ)
139 DECLARE_PTR(environ)
140
141 DECLARE_LABEL(__errno)
142 DECLARE_LABEL(_errno)
143 DECLARE_U32(errno)
144
145 /*
146  *  Stack Size and Space
147  */
148
149         .set stack_size, 0x20000
150
151 DECLARE_SPACE(stack_memory,stack_size,4)
152 DECLARE_LABEL(stack_end)
153
154 DECLARE_SPACE(interrupt_stack_memory,0x1000,4)
155 DECLARE_LABEL(interrupt_stack_end)