source: rtems/c/src/lib/libbsp/m68k/uC5282/start/start.S @ 7c7184a

4.104.114.84.9
Last change on this file since 7c7184a was 7c7184a, checked in by Eric Norum <WENorum@…>, on Feb 1, 2005 at 3:12:55 PM

Place FEC buffer descriptors in static RAM. No more cache concerns.

  • Property mode set to 100644
File size: 14.0 KB
Line 
1/*
2 *  uC5282 startup code
3 *
4 *  This file contains the entry point for the application.
5 *  The name of this entry point is compiler dependent.
6 *  It jumps to the BSP which is responsible for performing
7 *  all initialization.
8 *
9 *  COPYRIGHT (c) 1989-1998.
10 *  On-Line Applications Research Corporation (OAR).
11 *  Copyright assigned to U.S. Government, 1994.
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *
16 *  http://www.OARcorp.com/rtems/license.html.
17 *
18 *  $Id$
19 */
20
21#include <rtems/asm.h>
22
23#define SRAM_SIZE (64*1024)
24#define DEFAULT_IPSBAR  0x40000000
25
26BEGIN_CODE
27
28/***************************************************************************
29   Function : Entry
30
31   Description : Entry point to the system. In a raw system we would have
32   put the initial stack pointer as the first 4 bytes.  Instead we have to
33   provide a real instruction at the first location since we might be getting
34   started by dBUG after downloading from TFTP or FLASH.   Hack in an
35   'initial stack pointer' that actually is a jump to the start address!
36 ***************************************************************************/
37Entry:
38
39
40    nop ; jmp SYM(start)    |   0: Initial 'SSP'    1: Initial PC
41    .long   SYM(_uhoh)      |   2: Bus error
42    .long   SYM(_uhoh)      |   3: Address error
43    .long   SYM(_uhoh)      |   4: Illegal instruction
44    .long   SYM(_uhoh)      |   5: Zero division
45    .long   SYM(_uhoh)      |   6: CHK, CHK2 instruction
46    .long   SYM(_uhoh)      |   7: TRAPcc, TRAPV instructions
47    .long   SYM(_uhoh)      |   8: Privilege violation
48    .long   SYM(_uhoh)      |   9: Trace
49    .long   SYM(_uhoh)      |  10: Line 1010 emulator
50    .long   SYM(_uhoh)      |  11: Line 1111 emulator
51    .long   SYM(_uhoh)      |  12: Hardware breakpoint
52    .long   SYM(_uhoh)      |  13: Reserved for coprocessor violation
53    .long   SYM(_uhoh)      |  14: Format error
54    .long   SYM(_uhoh)      |  15: Uninitialized interrupt
55    .long   SYM(_uhoh)      |  16: Unassigned, reserved
56    .long   SYM(_uhoh)      |  17:
57    .long   SYM(_uhoh)      |  18:
58    .long   SYM(_uhoh)      |  19:
59    .long   SYM(_uhoh)      |  20:
60    .long   SYM(_uhoh)      |  21:
61    .long   SYM(_uhoh)      |  22:
62    .long   SYM(_uhoh)      |  23:
63    .long   SYM(_spuriousInterrupt) |  24: Spurious interrupt
64    .long   SYM(_uhoh)      |  25: Level 1 interrupt autovector
65    .long   SYM(_uhoh)      |  26: Level 2 interrupt autovector
66    .long   SYM(_uhoh)      |  27: Level 3 interrupt autovector
67    .long   SYM(_uhoh)      |  28: Level 4 interrupt autovector
68    .long   SYM(_uhoh)      |  29: Level 5 interrupt autovector
69    .long   SYM(_uhoh)      |  30: Level 6 interrupt autovector
70    .long   SYM(_uhoh)      |  31: Level 7 interrupt autovector
71    .long   SYM(_uhoh)      |  32: Trap instruction (0-15)
72    .long   SYM(_uhoh)      |  33:
73    .long   SYM(_uhoh)      |  34:
74    .long   SYM(_uhoh)      |  35:
75    .long   SYM(_uhoh)      |  36:
76    .long   SYM(_uhoh)      |  37:
77    .long   SYM(_uhoh)      |  38:
78    .long   SYM(_uhoh)      |  39:
79    .long   SYM(_uhoh)      |  40:
80    .long   SYM(_uhoh)      |  41:
81    .long   SYM(_uhoh)      |  42:
82    .long   SYM(_uhoh)      |  43:
83    .long   SYM(_uhoh)      |  44:
84    .long   SYM(_uhoh)      |  45:
85    .long   SYM(_uhoh)      |  46:
86    .long   SYM(_uhoh)      |  47:
87    .long   SYM(_uhoh)      |  48: Reserved for coprocessor
88    .long   SYM(_uhoh)      |  49:
89    .long   SYM(_uhoh)      |  50:
90    .long   SYM(_uhoh)      |  51:
91    .long   SYM(_uhoh)      |  52:
92    .long   SYM(_uhoh)      |  53:
93    .long   SYM(_uhoh)      |  54:
94    .long   SYM(_uhoh)      |  55:
95    .long   SYM(_uhoh)      |  56:
96    .long   SYM(_uhoh)      |  57:
97    .long   SYM(_uhoh)      |  58:
98    .long   SYM(_uhoh)      |  59: Unassigned, reserved
99    .long   SYM(_uhoh)      |  60:
100    .long   SYM(_uhoh)      |  61:
101    .long   SYM(_uhoh)      |  62:
102    .long   SYM(_uhoh)      |  63:
103    .long   SYM(_spuriousInterrupt) |  64: User spurious handler
104    .long   SYM(_uhoh)      |  65:
105    .long   SYM(_uhoh)      |  66:
106    .long   SYM(_uhoh)      |  67:
107    .long   SYM(_uhoh)      |  68:
108    .long   SYM(_uhoh)      |  69:
109    .long   SYM(_uhoh)      |  70:
110    .long   SYM(_uhoh)      |  71:
111    .long   SYM(_uhoh)      |  72:
112    .long   SYM(_uhoh)      |  73:
113    .long   SYM(_uhoh)      |  74:
114    .long   SYM(_uhoh)      |  75:
115    .long   SYM(_uhoh)      |  76:
116    .long   SYM(_uhoh)      |  77:
117    .long   SYM(_uhoh)      |  78:
118    .long   SYM(_uhoh)      |  79:
119    .long   SYM(_uhoh)      |  80:
120    .long   SYM(_uhoh)      |  81:
121    .long   SYM(_uhoh)      |  82:
122    .long   SYM(_uhoh)      |  83:
123    .long   SYM(_uhoh)      |  84:
124    .long   SYM(_uhoh)      |  85:
125    .long   SYM(_uhoh)      |  86:
126    .long   SYM(_uhoh)      |  87:
127    .long   SYM(_uhoh)      |  88:
128    .long   SYM(_uhoh)      |  89:
129    .long   SYM(_uhoh)      |  90:
130    .long   SYM(_uhoh)      |  91:
131    .long   SYM(_uhoh)      |  92:
132    .long   SYM(_uhoh)      |  93:
133    .long   SYM(_uhoh)      |  94:
134    .long   SYM(_uhoh)      |  95:
135    .long   SYM(_uhoh)      |  96:
136    .long   SYM(_uhoh)      |  97:
137    .long   SYM(_uhoh)      |  98:
138    .long   SYM(_uhoh)      |  99:
139    .long   SYM(_uhoh)      | 100:
140    .long   SYM(_uhoh)      | 101:
141    .long   SYM(_uhoh)      | 102:
142    .long   SYM(_uhoh)      | 103:
143    .long   SYM(_uhoh)      | 104:
144    .long   SYM(_uhoh)      | 105:
145    .long   SYM(_uhoh)      | 106:
146    .long   SYM(_uhoh)      | 107:
147    .long   SYM(_uhoh)      | 108:
148    .long   SYM(_uhoh)      | 109:
149    .long   SYM(_uhoh)      | 110:
150    .long   SYM(_uhoh)      | 111:
151    .long   SYM(_uhoh)      | 112:
152    .long   SYM(_uhoh)      | 113:
153    .long   SYM(_uhoh)      | 114:
154    .long   SYM(_uhoh)      | 115:
155    .long   SYM(_uhoh)      | 116:
156    .long   SYM(_uhoh)      | 117:
157    .long   SYM(_uhoh)      | 118:
158    .long   SYM(_uhoh)      | 119:
159    .long   SYM(_uhoh)      | 120:
160    .long   SYM(_uhoh)      | 121:
161    .long   SYM(_uhoh)      | 122:
162    .long   SYM(_uhoh)      | 123:
163    .long   SYM(_uhoh)      | 124:
164    .long   SYM(_uhoh)      | 125:
165    .long   SYM(_uhoh)      | 126:
166    .long   SYM(_uhoh)      | 127:
167    .long   SYM(_uhoh)      | 128:
168    .long   SYM(_uhoh)      | 129:
169    .long   SYM(_uhoh)      | 130:
170    .long   SYM(_uhoh)      | 131:
171    .long   SYM(_uhoh)      | 132:
172    .long   SYM(_uhoh)      | 133:
173    .long   SYM(_uhoh)      | 134:
174    .long   SYM(_uhoh)      | 135:
175    .long   SYM(_uhoh)      | 136:
176    .long   SYM(_uhoh)      | 137:
177    .long   SYM(_uhoh)      | 138:
178    .long   SYM(_uhoh)      | 139:
179    .long   SYM(_uhoh)      | 140:
180    .long   SYM(_uhoh)      | 141:
181    .long   SYM(_uhoh)      | 142:
182    .long   SYM(_uhoh)      | 143:
183    .long   SYM(_uhoh)      | 144:
184    .long   SYM(_uhoh)      | 145:
185    .long   SYM(_uhoh)      | 146:
186    .long   SYM(_uhoh)      | 147:
187    .long   SYM(_uhoh)      | 148:
188    .long   SYM(_uhoh)      | 149:
189    .long   SYM(_uhoh)      | 150:
190    .long   SYM(_uhoh)      | 151:
191    .long   SYM(_uhoh)      | 152:
192    .long   SYM(_uhoh)      | 153:
193    .long   SYM(_uhoh)      | 154:
194    .long   SYM(_uhoh)      | 155:
195    .long   SYM(_uhoh)      | 156:
196    .long   SYM(_uhoh)      | 157:
197    .long   SYM(_uhoh)      | 158:
198    .long   SYM(_uhoh)      | 159:
199    .long   SYM(_uhoh)      | 160:
200    .long   SYM(_uhoh)      | 161:
201    .long   SYM(_uhoh)      | 162:
202    .long   SYM(_uhoh)      | 163:
203    .long   SYM(_uhoh)      | 164:
204    .long   SYM(_uhoh)      | 165:
205    .long   SYM(_uhoh)      | 166:
206    .long   SYM(_uhoh)      | 167:
207    .long   SYM(_uhoh)      | 168:
208    .long   SYM(_uhoh)      | 169:
209    .long   SYM(_uhoh)      | 170:
210    .long   SYM(_uhoh)      | 171:
211    .long   SYM(_uhoh)      | 172:
212    .long   SYM(_uhoh)      | 173:
213    .long   SYM(_uhoh)      | 174:
214    .long   SYM(_uhoh)      | 175:
215    .long   SYM(_uhoh)      | 176:
216    .long   SYM(_uhoh)      | 177:
217    .long   SYM(_uhoh)      | 178:
218    .long   SYM(_uhoh)      | 179:
219    .long   SYM(_uhoh)      | 180:
220    .long   SYM(_uhoh)      | 181:
221    .long   SYM(_uhoh)      | 182:
222    .long   SYM(_uhoh)      | 183:
223    .long   SYM(_uhoh)      | 184:
224    .long   SYM(_uhoh)      | 185:
225    .long   SYM(_uhoh)      | 186:
226    .long   SYM(_uhoh)      | 187:
227    .long   SYM(_uhoh)      | 188:
228    .long   SYM(_uhoh)      | 189:
229    .long   SYM(_uhoh)      | 190:
230    .long   SYM(_uhoh)      | 191:
231    .long   SYM(_uhoh)      | 192:
232    .long   SYM(_uhoh)      | 193:
233    .long   SYM(_uhoh)      | 194:
234    .long   SYM(_uhoh)      | 195:
235    .long   SYM(_uhoh)      | 196:
236    .long   SYM(_uhoh)      | 197:
237    .long   SYM(_uhoh)      | 198:
238    .long   SYM(_uhoh)      | 199:
239    .long   SYM(_uhoh)      | 200:
240    .long   SYM(_uhoh)      | 201:
241    .long   SYM(_uhoh)      | 202:
242    .long   SYM(_uhoh)      | 203:
243    .long   SYM(_uhoh)      | 204:
244    .long   SYM(_uhoh)      | 205:
245    .long   SYM(_uhoh)      | 206:
246    .long   SYM(_uhoh)      | 207:
247    .long   SYM(_uhoh)      | 208:
248    .long   SYM(_uhoh)      | 209:
249    .long   SYM(_uhoh)      | 210:
250    .long   SYM(_uhoh)      | 211:
251    .long   SYM(_uhoh)      | 212:
252    .long   SYM(_uhoh)      | 213:
253    .long   SYM(_uhoh)      | 214:
254    .long   SYM(_uhoh)      | 215:
255    .long   SYM(_uhoh)      | 216:
256    .long   SYM(_uhoh)      | 217:
257    .long   SYM(_uhoh)      | 218:
258    .long   SYM(_uhoh)      | 219:
259    .long   SYM(_uhoh)      | 220:
260    .long   SYM(_uhoh)      | 221:
261    .long   SYM(_uhoh)      | 222:
262    .long   SYM(_uhoh)      | 223:
263    .long   SYM(_uhoh)      | 224:
264    .long   SYM(_uhoh)      | 225:
265    .long   SYM(_uhoh)      | 226:
266    .long   SYM(_uhoh)      | 227:
267    .long   SYM(_uhoh)      | 228:
268    .long   SYM(_uhoh)      | 229:
269    .long   SYM(_uhoh)      | 230:
270    .long   SYM(_uhoh)      | 231:
271    .long   SYM(_uhoh)      | 232:
272    .long   SYM(_uhoh)      | 233:
273    .long   SYM(_uhoh)      | 234:
274    .long   SYM(_uhoh)      | 235:
275    .long   SYM(_uhoh)      | 236:
276    .long   SYM(_uhoh)      | 237:
277    .long   SYM(_uhoh)      | 238:
278    .long   SYM(_uhoh)      | 239:
279    .long   SYM(_uhoh)      | 240:
280    .long   SYM(_uhoh)      | 241:
281    .long   SYM(_uhoh)      | 242:
282    .long   SYM(_uhoh)      | 243:
283    .long   SYM(_uhoh)      | 244:
284    .long   SYM(_uhoh)      | 245:
285    .long   SYM(_uhoh)      | 246:
286    .long   SYM(_uhoh)      | 247:
287    .long   SYM(_uhoh)      | 248:
288    .long   SYM(_uhoh)      | 249:
289    .long   SYM(_uhoh)      | 250:
290    .long   SYM(_uhoh)      | 251:
291    .long   SYM(_uhoh)      | 252:
292    .long   SYM(_uhoh)      | 253:
293    .long   SYM(_uhoh)      | 254:
294    .long   SYM(_uhoh)      | 255:
295
296/*
297 * Default trap handler
298 * With an oscilloscope you can see AS* stop
299 */
300.align 4
301    PUBLIC (_uhoh)
302SYM(_uhoh):
303    nop                 | Leave spot for breakpoint
304    stop    #0x2700             | Stop with interrupts disabled
305    bra.w   SYM(_uhoh)          | Stuck forever
306
307.align 4
308    PUBLIC (_spuriousInterrupt)
309SYM(_spuriousInterrupt):
310    addql   #1,SYM(_M68kSpuriousInterruptCount)
311    rte
312
313.align 4
314    PUBLIC (start)
315SYM(start):
316    move.w  #0x2700,sr                 | Disable interrupts
317
318    /*
319     * If we're being started by the debugger, and the debugger has
320     * moved the IPSBAR, we're doomed........
321     */
322    move.l  #__IPSBAR+1,d0             | Enable the MCF5282 internal peripherals
323    move.l  d0,DEFAULT_IPSBAR
324    move.l  #__SRAMBASE+0x201,d0       | Enable the MCF5282 internal SRAM
325    movec   d0,%rambar                 | CPU-space copy of RAMBAR
326    move.l  d0,DEFAULT_IPSBAR+8        | Memory-space copy of RAMBAR
327    move.l  #__SRAMBASE+SRAM_SIZE-4,sp | Overwrite the fake stack pointer
328
329    /*
330     * Copy the vector table to address 0 (VBR must be 0 mod 2^20)
331     * Leave the dBUG vectors (0-63) alone
332     */
333    lea.l  (64*4)+Entry,a0
334    lea.l  (64*4),a1
335    move.l #(256-64)-1,d0
336vectcpy:
337    move.l a0@+,a1@+       | Copy the vector table
338    sub.l  #1,d0
339    bne.s  vectcpy
340     
341    /*
342     * Remainder of the startup code is handled by C code
343     */
344    jmp SYM(Init5282)       | Start C code (which never returns)
345   
346/***************************************************************************
347   Function : CopyDataClearBSSAndStart
348
349   Description : Copy DATA segment, Copy SRAM segment, clear BSS segment,
350   start C program. Assume that DATA and BSS sizes are multiples of 4.
351 ***************************************************************************/
352.align 4
353
354    PUBLIC (CopyDataClearBSSAndStart)
355SYM(CopyDataClearBSSAndStart):
356    lea SYM(_data_dest_start),a0        | Get start of DATA in RAM
357    lea SYM(_data_src_start),a2     | Get start of DATA in ROM
358        sub.l   #SYM(_header_offset),a2          | Change source by the amount of the header offset
359    cmpl    a0,a2                   | Are they the same?
360    beq.s   NODATACOPY              | Yes, no copy necessary
361    lea SYM(_data_dest_end),a1      | Get end of DATA in RAM
362    bra.s   DATACOPYLOOPTEST            | Branch into copy loop
363DATACOPYLOOP:
364    movel   a2@+,a0@+               | Copy word from ROM to RAM
365DATACOPYLOOPTEST:
366    cmpl    a1,a0                   | Done?
367    bcs.s   DATACOPYLOOP                | No, skip
368NODATACOPY:
369       
370/* Now, clear BSS */
371        lea _clear_start,a0     | Get start of BSS
372    lea _clear_end,a1       | Get end of BSS
373    clrl    d0          | Value to set
374    bra.s   ZEROLOOPTEST        | Branch into clear loop
375ZEROLOOP:
376    movel   d0,a0@+         | Clear a word
377ZEROLOOPTEST:
378    cmpl    a1,a0           | Done?
379    bcs.s   ZEROLOOP        | No, skip
380
381
382    /*
383     * Right : Now we're ready to boot RTEMS
384     */
385    clrl    d0          | Pass in null to all boot_card() params
386    movel   d0,a7@-         | environp
387    movel   d0,a7@-         | argv
388    movel   d0,a7@-         | argc
389    jsr SYM(boot_card)      | Call C boot_card function to startup RTEMS
390        movel   a7@+,d0
391        movel   a7@+,d0
392        movel   a7@+,d0
393MULTI_TASK_EXIT:
394        nop
395        nop
396        trap    #14
397        bra     MULTI_TASK_EXIT     
398
399
400END_CODE
401
402        .align 2
403BEGIN_DATA_DCL
404        .align 2
405    PUBLIC (_M68kSpuriousInterruptCount)
406SYM (_M68kSpuriousInterruptCount):
407    .long   0
408END_DATA_DCL
409
410END
411
Note: See TracBrowser for help on using the repository browser.