source: trunk/Softwares/Min.or32/src/sys/crt0.s @ 2

Last change on this file since 2 was 2, checked in by kane, 17 years ago

Import Morpheo

File size: 12.0 KB
Line 
1/*
2 * Routine system dependant
3 *  - reset
4 *  - exception handler
5 *  - start / exit
6 */
7
8/*             
9#define DEFAULT_EXCEPTION_HANDLER     \
10        l.addi  r1, r1, -128         ;\
11        l.sw    4(r1), r3            ;\
12        l.sw    8(r1), r4            ;\
13        l.mfspr r3,r0,16             ;\
14        l.mfspr r4,r0,32             ;\
15        l.j default_exception_handler;\
16        l.nop   0                    ;
17*/
18        .file   "crt0.s"
19        /*
20        .section .vector
21        */
22        .section .text
23        .align  4       
24
25/* ---[ 0x0  : Print a error ]------------------------------------------- */
26
27        .org 0x0
28
29        l.movhi r3,   0xdead
30        l.jal   _quit
31        l.ori   r3,r3,0xdead
32               
33/* ---[ 0x100: RESET exception ]----------------------------------------- */
34        .org 0x100
35        .global _exception_reset
36_exception_reset:
37
38        l.movhi r2,   hi(_start)
39        l.ori   r2,r2,lo(_start)
40        l.jr    r2               /* Go _start */
41        l.nop   0
42
43/* ---[ 0x200: BUS exception ]------------------------------------------- */
44        .org 0x200
45        /*DEFAULT_EXCEPTION_HANDLER*/
46        l.addi  r1, r1, -128         
47        l.sw    4(r1), r3             
48        l.sw    8(r1), r4           
49        l.mfspr r3,r0,16             
50        l.mfspr r4,r0,32             
51        l.j default_exception_handler
52        l.nop   0                   
53       
54
55/* ---[ 0x300: Data Page Fault exception ]------------------------------- */
56        .org 0x300
57        /*DEFAULT_EXCEPTION_HANDLER*/
58        l.addi  r1, r1, -128         
59        l.sw    4(r1), r3             
60        l.sw    8(r1), r4           
61        l.mfspr r3,r0,16             
62        l.mfspr r4,r0,32             
63        l.j default_exception_handler
64        l.nop   0                   
65
66       
67/* ---[ 0x400: Insn Page Fault exception ]------------------------------- */
68        .org 0x400
69        /*DEFAULT_EXCEPTION_HANDLER*/
70        l.addi  r1, r1, -128         
71        l.sw    4(r1), r3             
72        l.sw    8(r1), r4           
73        l.mfspr r3,r0,16             
74        l.mfspr r4,r0,32             
75        l.j default_exception_handler
76        l.nop   0                   
77
78
79/* ---[ 0x500: Timer exception ]----------------------------------------- */
80        .org 0x500
81        /*DEFAULT_EXCEPTION_HANDLER*/
82        l.addi  r1, r1, -128         
83        l.sw    4(r1), r3             
84        l.sw    8(r1), r4           
85        l.mfspr r3,r0,16             
86        l.mfspr r4,r0,32             
87        l.j default_exception_handler
88        l.nop   0                   
89
90
91/* ---[ 0x600: Aligment exception ]-------------------------------------- */
92        .org 0x600
93        /*DEFAULT_EXCEPTION_HANDLER*/
94        l.addi  r1, r1, -128         
95        l.sw    4(r1), r3             
96        l.sw    8(r1), r4           
97        l.mfspr r3,r0,16             
98        l.mfspr r4,r0,32             
99        l.j default_exception_handler
100        l.nop   0                   
101
102       
103/* ---[ 0x700: Illegal insn exception ]---------------------------------- */
104        .org 0x700
105        /*DEFAULT_EXCEPTION_HANDLER*/
106        l.addi  r1, r1, -128         
107        l.sw    4(r1), r3             
108        l.sw    8(r1), r4           
109        l.mfspr r3,r0,16             
110        l.mfspr r4,r0,32             
111        l.j default_exception_handler
112        l.nop   0                   
113
114
115/* ---[ 0x800: External interrupt exception ]---------------------------- */
116        .org 0x800
117        /*DEFAULT_EXCEPTION_HANDLER*/
118        l.addi  r1, r1, -128         
119        l.sw    4(r1), r3             
120        l.sw    8(r1), r4           
121        l.mfspr r3,r0,16             
122        l.mfspr r4,r0,32             
123        l.j default_exception_handler
124        l.nop   0                   
125
126
127/* ---[ 0x900: DTLB miss exception ]------------------------------------- */
128        .org 0x900
129        /*DEFAULT_EXCEPTION_HANDLER*/
130        l.addi  r1, r1, -128         
131        l.sw    4(r1), r3             
132        l.sw    8(r1), r4           
133        l.mfspr r3,r0,16             
134        l.mfspr r4,r0,32             
135        l.j default_exception_handler
136        l.nop   0                   
137
138       
139/* ---[ 0xa00: ITLB miss exception ]------------------------------------- */
140        .org 0xa00
141        /*DEFAULT_EXCEPTION_HANDLER*/
142        l.addi  r1, r1, -128         
143        l.sw    4(r1), r3             
144        l.sw    8(r1), r4           
145        l.mfspr r3,r0,16             
146        l.mfspr r4,r0,32             
147        l.j default_exception_handler
148        l.nop   0                   
149
150       
151               
152/* ---[ 0xb00: Range exception ]----------------------------------------- */
153        .org 0xb00
154        /*DEFAULT_EXCEPTION_HANDLER*/
155        l.addi  r1, r1, -128         
156        l.sw    4(r1), r3             
157        l.sw    8(r1), r4           
158        l.mfspr r3,r0,16             
159        l.mfspr r4,r0,32             
160        l.j default_exception_handler
161        l.nop   0                   
162
163       
164
165/* ---[ 0xc00: Syscall exception ]--------------------------------------- */
166        .org 0xc00
167        /*DEFAULT_EXCEPTION_HANDLER*/
168        l.addi  r1, r1, -128         
169        l.sw    4(r1), r3             
170        l.sw    8(r1), r4           
171        l.mfspr r3,r0,16             
172        l.mfspr r4,r0,32             
173        l.j default_exception_handler
174        l.nop   0                   
175
176       
177
178/* ---[ 0xd00: Trap exception ]------------------------------------------ */
179        .org 0xd00
180        /*DEFAULT_EXCEPTION_HANDLER*/
181        l.addi  r1, r1, -128         
182        l.sw    4(r1), r3             
183        l.sw    8(r1), r4           
184        l.mfspr r3,r0,16             
185        l.mfspr r4,r0,32             
186        l.j default_exception_handler
187        l.nop   0                   
188
189       
190
191/* ---[ 0xe00: Trap exception ]------------------------------------------ */
192        .org 0xe00
193        /*DEFAULT_EXCEPTION_HANDLER*/
194        l.addi  r1, r1, -128         
195        l.sw    4(r1), r3             
196        l.sw    8(r1), r4           
197        l.mfspr r3,r0,16             
198        l.mfspr r4,r0,32             
199        l.j default_exception_handler
200        l.nop   0                   
201
202       
203       
204/* ---[ 0xf00: Reserved exceptions ]------------------------------------- */
205        .org 0xf00
206        /*DEFAULT_EXCEPTION_HANDLER*/
207        l.addi  r1, r1, -128         
208        l.sw    4(r1), r3             
209        l.sw    8(r1), r4           
210        l.mfspr r3,r0,16             
211        l.mfspr r4,r0,32             
212        l.j default_exception_handler
213        l.nop   0                   
214
215       
216        .org 0x1000
217        /*DEFAULT_EXCEPTION_HANDLER*/
218        l.addi  r1, r1, -128         
219        l.sw    4(r1), r3             
220        l.sw    8(r1), r4           
221        l.mfspr r3,r0,16             
222        l.mfspr r4,r0,32             
223        l.j default_exception_handler
224        l.nop   0                   
225
226       
227        .org 0x1100
228        /*DEFAULT_EXCEPTION_HANDLER*/
229        l.addi  r1, r1, -128         
230        l.sw    4(r1), r3             
231        l.sw    8(r1), r4           
232        l.mfspr r3,r0,16             
233        l.mfspr r4,r0,32             
234        l.j default_exception_handler
235        l.nop   0                   
236
237       
238        .org 0x1200
239        /*DEFAULT_EXCEPTION_HANDLER*/
240        l.addi  r1, r1, -128         
241        l.sw    4(r1), r3             
242        l.sw    8(r1), r4           
243        l.mfspr r3,r0,16             
244        l.mfspr r4,r0,32             
245        l.j default_exception_handler
246        l.nop   0                   
247
248       
249        .org 0x1300
250        /*DEFAULT_EXCEPTION_HANDLER*/
251        l.addi  r1, r1, -128         
252        l.sw    4(r1), r3             
253        l.sw    8(r1), r4           
254        l.mfspr r3,r0,16             
255        l.mfspr r4,r0,32             
256        l.j default_exception_handler
257        l.nop   0                   
258
259       
260        .org 0x1400
261        /*DEFAULT_EXCEPTION_HANDLER*/
262        l.addi  r1, r1, -128         
263        l.sw    4(r1), r3             
264        l.sw    8(r1), r4           
265        l.mfspr r3,r0,16             
266        l.mfspr r4,r0,32             
267        l.j default_exception_handler
268        l.nop   0                   
269
270       
271        .org 0x1500
272        /*DEFAULT_EXCEPTION_HANDLER*/
273        l.addi  r1, r1, -128         
274        l.sw    4(r1), r3             
275        l.sw    8(r1), r4           
276        l.mfspr r3,r0,16             
277        l.mfspr r4,r0,32             
278        l.j default_exception_handler
279        l.nop   0                   
280
281       
282        .org 0x1600
283        /*DEFAULT_EXCEPTION_HANDLER*/
284        l.addi  r1, r1, -128         
285        l.sw    4(r1), r3             
286        l.sw    8(r1), r4           
287        l.mfspr r3,r0,16             
288        l.mfspr r4,r0,32             
289        l.j default_exception_handler
290        l.nop   0                   
291
292       
293        .org 0x1700
294        /*DEFAULT_EXCEPTION_HANDLER*/
295        l.addi  r1, r1, -128         
296        l.sw    4(r1), r3             
297        l.sw    8(r1), r4           
298        l.mfspr r3,r0,16             
299        l.mfspr r4,r0,32             
300        l.j default_exception_handler
301        l.nop   0                   
302
303       
304        .org 0x1800
305        /*DEFAULT_EXCEPTION_HANDLER*/
306        l.addi  r1, r1, -128         
307        l.sw    4(r1), r3             
308        l.sw    8(r1), r4           
309        l.mfspr r3,r0,16             
310        l.mfspr r4,r0,32             
311        l.j default_exception_handler
312        l.nop   0                   
313
314       
315        .org 0x1900
316        /*DEFAULT_EXCEPTION_HANDLER*/
317        l.addi  r1, r1, -128         
318        l.sw    4(r1), r3             
319        l.sw    8(r1), r4           
320        l.mfspr r3,r0,16             
321        l.mfspr r4,r0,32             
322        l.j default_exception_handler
323        l.nop   0                   
324
325       
326        .org 0x1a00
327        /*DEFAULT_EXCEPTION_HANDLER*/
328        l.addi  r1, r1, -128         
329        l.sw    4(r1), r3             
330        l.sw    8(r1), r4           
331        l.mfspr r3,r0,16             
332        l.mfspr r4,r0,32             
333        l.j default_exception_handler
334        l.nop   0                   
335
336       
337        .org 0x1b00
338        /*DEFAULT_EXCEPTION_HANDLER*/
339        l.addi  r1, r1, -128         
340        l.sw    4(r1), r3             
341        l.sw    8(r1), r4           
342        l.mfspr r3,r0,16             
343        l.mfspr r4,r0,32             
344        l.j default_exception_handler
345        l.nop   0                   
346
347       
348        .org 0x1c00
349        /*DEFAULT_EXCEPTION_HANDLER*/
350        l.addi  r1, r1, -128         
351        l.sw    4(r1), r3             
352        l.sw    8(r1), r4           
353        l.mfspr r3,r0,16             
354        l.mfspr r4,r0,32             
355        l.j default_exception_handler
356        l.nop   0                   
357
358       
359        .org 0x1d00
360        /*DEFAULT_EXCEPTION_HANDLER*/
361        l.addi  r1, r1, -128         
362        l.sw    4(r1), r3             
363        l.sw    8(r1), r4           
364        l.mfspr r3,r0,16             
365        l.mfspr r4,r0,32             
366        l.j default_exception_handler
367        l.nop   0                   
368
369       
370        .org 0x1e00
371        /*DEFAULT_EXCEPTION_HANDLER*/
372        l.addi  r1, r1, -128         
373        l.sw    4(r1), r3             
374        l.sw    8(r1), r4           
375        l.mfspr r3,r0,16             
376        l.mfspr r4,r0,32             
377        l.j default_exception_handler
378        l.nop   0                   
379
380       
381        .org 0x1f00
382        /*DEFAULT_EXCEPTION_HANDLER*/
383        l.addi  r1, r1, -128         
384        l.sw    4(r1), r3             
385        l.sw    8(r1), r4           
386        l.mfspr r3,r0,16             
387        l.mfspr r4,r0,32             
388        l.j default_exception_handler
389        l.nop   0                   
390
391
392/* ========================================================= [ entry ] === */
393
394        .org 0x2000
395        .global _start
396       
397_start:
398        /* Initialise stack */
399
400        l.movhi r1,     hi(_stack)
401        l.ori   r1, r1, lo(_stack)
402        l.addi  r2, r0, -3                /* 0xFFFF_FFFC */
403
404        l.jal   _get_cpu_id               /* give the id of the cpu */
405        l.and   r1, r1, r2
406
407        l.movhi r4,     hi(_stack_alloc)
408        l.ori   r4, r4, lo(_stack_alloc)
409
410        l.mul   r4, r11,r4
411        l.sub   r1, r1 ,r4                /* each thread have a <<_stack>> with a size <<_stack_alloc>> */
412        l.or    r2, r1, r0                /* copy in frame_pointer register */
413
414        /* Clear BSS */
415/*
416        l.movhi r28,      hi(___bss_start)
417        l.ori   r28, r28, lo(___bss_start)
418        l.movhi r30,      hi(__end)
419        l.ori   r30, r30, lo(__end)
4201:
421        l.sw    (0)(r28), r0
422        l.sfltu r28, r30
423        l.bf    1b
424        l.addi  r28, r28, 4
425*/
426        /* Jump to main program entry point (argc = argv = 0) */
427        l.and   r3,r0,r0
428        l.jal   _main
429        l.and   r4,r0,r0
430       
431        /* If program exits, call exit routine */
432/*
433        l.addi  r3, r11, 0
434        l.jal   __exit
435        l.nop   0
436*/
437/* ====================================== [ default exception handler ] === */
438
439default_exception_handler:
440        l.sw    0x00(r1), r2
441        l.sw    0x0c(r1), r5
442        l.sw    0x10(r1), r6
443        l.sw    0x14(r1), r7
444        l.sw    0x18(r1), r8
445        l.sw    0x1c(r1), r9
446        l.sw    0x20(r1), r10
447        l.sw    0x24(r1), r11
448        l.sw    0x28(r1), r12
449        l.sw    0x2c(r1), r13
450        l.sw    0x30(r1), r14
451        l.sw    0x34(r1), r15
452        l.sw    0x38(r1), r16
453        l.sw    0x3c(r1), r17
454        l.sw    0x40(r1), r18
455        l.sw    0x44(r1), r19
456        l.sw    0x48(r1), r20
457        l.sw    0x4c(r1), r21
458        l.sw    0x50(r1), r22
459        l.sw    0x54(r1), r23
460        l.sw    0x58(r1), r24
461        l.sw    0x5c(r1), r25
462        l.sw    0x60(r1), r26
463        l.sw    0x64(r1), r27
464        l.sw    0x68(r1), r28
465        l.sw    0x6c(r1), r29
466        l.sw    0x70(r1), r30
467        l.sw    0x74(r1), r31
468        l.sw    0x78(r1), r32
469       
470        /*
471         * Jump to a handler (write in C by example)
472         */
473       
474        l.jal   _exception_handler
475        l.nop   0
476       
477        l.lwz   r2 , 0x00(r1)
478        l.lwz   r3 , 0x04(r1)
479        l.lwz   r4 , 0x08(r1)
480        l.lwz   r5 , 0x0c(r1)
481        l.lwz   r6 , 0x10(r1)
482        l.lwz   r7 , 0x14(r1)
483        l.lwz   r8 , 0x18(r1)
484        l.lwz   r9 , 0x1c(r1)
485        l.lwz   r10, 0x20(r1)
486        l.lwz   r11, 0x24(r1)
487        l.lwz   r12, 0x28(r1)
488        l.lwz   r13, 0x2c(r1)
489        l.lwz   r14, 0x30(r1)
490        l.lwz   r15, 0x34(r1)
491        l.lwz   r16, 0x38(r1)
492        l.lwz   r17, 0x3c(r1)
493        l.lwz   r18, 0x40(r1)
494        l.lwz   r19, 0x44(r1)
495        l.lwz   r20, 0x48(r1)
496        l.lwz   r21, 0x4c(r1)
497        l.lwz   r22, 0x50(r1)
498        l.lwz   r23, 0x54(r1)
499        l.lwz   r24, 0x58(r1)
500        l.lwz   r25, 0x5c(r1)
501        l.lwz   r26, 0x60(r1)
502        l.lwz   r27, 0x64(r1)
503        l.lwz   r28, 0x68(r1)
504        l.lwz   r29, 0x6c(r1)
505        l.lwz   r30, 0x70(r1)
506        l.lwz   r31, 0x74(r1)
507        l.lwz   r32, 0x78(r1)
508
509        l.addi  r1, r1, 128
510
511        l.rfe
512        l.nop   0
513
Note: See TracBrowser for help on using the repository browser.