source: trunk/Softwares/Minimal_soft/src/sys/crt0.s

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