source: soft/tp18/soft/reset.s @ 43

Last change on this file since 43 was 25, checked in by porquet, 14 years ago

corrections sur tp18

File size: 4.3 KB
Line 
1#################################################################################
2#       File : reset.s
3#       Author : Alain Greiner
4#       Date : 20/11/2009
5#################################################################################
6#       This boot code creates four tasks running on the same processor,
7#       and executing four different programs: main0, main1, main2, main3.
8#       Each Task has his own terminal, and his own stack.
9#       - It initializes the interrupt vector with 7 ISR addresses
10#         ( timer, tty0, tty1, tty2, tty3, io, dma )
11#       - It initializes  the _current_task_array & _task_number_array variables
12#       - It initializes contexts for tasks T1,T2,T3 : EPC, SR, SP, RA
13#       - It initializes registers for task T0 : EPC, SR, SP
14#       - It initializes the Timer & ICU components.
15#       - It jumps to  main in user mode.
16#################################################################################
17               
18        .section .reset,"ax",@progbits
19
20        .extern seg_stack_base
21        .extern seg_timer_base
22        .extern seg_icu_base
23
24        .extern _task_context
25        .extern _current_task_array             # running task index
26        .extern _task_number_array              # number of tasks
27
28        .extern main0
29        .extern main1
30        .extern main2
31        .extern main3
32
33        .extern _interrupt_vector
34        .extern _isr_tty_get
35        .extern _isr_ioc
36        .extern _isr_dma
37        .extern _isr_timer
38
39        .globl  reset                           # makes reset an external symbol
40        .ent    reset
41        .align  2
42
43reset:
44        .set noreorder
45
46# initializes interrupt vector
47        la      $27,    _interrupt_vector       # interrupt vector address
48        la      $26,    _isr_timer              # _isr_timer address
49        sw      $26,    0($27)                  # interrupt_vector[0] <= _isr_timer
50        la      $26,    _isr_tty_get            # _isr_tty_get address
51        sw      $26,    4($27)                  # interrupt_vector[1] <= _isr_tty_get
52        la      $26,    _isr_tty_get            # _isr_tty_get address
53        sw      $26,    8($27)                  # interrupt_vector[2] <= _isr_tty_get
54        la      $26,    _isr_tty_get            # _isr_tty_get address
55        sw      $26,    12($27)                 # interrupt_vector[3] <= _isr_tty_get
56        la      $26,    _isr_tty_get            # _isr_tty_get address
57        sw      $26,    16($27)                 # interrupt_vector[4] <= _isr_tty_get
58        la      $26,    _isr_ioc                # _isr_ioc address
59        sw      $26,    20($27)                 # interrupt_vector[5] <= _isr_ioc
60        la      $26,    _isr_dma                # _isr_dma address
61        sw      $26,    24($27)                 # interrupt_vector[6] <= _isr_dma
62
63# initializes task index & task number
64        la      $27,    _current_task_array
65        sw      $0,     0($27)                  # task_index <= 0                       
66        la      $27,    _task_number_array
67        li      $26,    4 
68        sw      $26,    0($27)                  # task_number <= 4                     
69
70# initializes stack pointers for tasks 1,2,3 (each stack is 64 KB)
71        la      $27,    _task_context_array     # $27 <= &ctx[]
72        la      $26,    seg_stack_base
73        li      $10,    0x00020000              # 128 K
74        add     $10,    $26,    $10
75        sw      $10,    4*(64+29)($27)          # SP for task 1
76        li      $10,    0x00030000              # 192 K
77        add     $10,    $26,    $10
78        sw      $10,    4*(128+29)($27)         # SP for task 2
79        li      $10,    0x00040000              # 256 K
80        add     $10,    $26,    $10
81        sw      $10,    4*(192+29)($27)         # SP for task 3
82
83# initializes EPC for tasks 1,2,3 (main1, main2, main3)
84        la      $26,    main1
85        sw      $26,    4*(64+32)($27)          # EPC for task 1
86        la      $26,    main2
87        sw      $26,    4*(128+32)($27)         # EPC for task 2
88        la      $26,    main3
89        sw      $26,    4*(192+32)($27)         # EPC for task 3
90
91# initializes RA for tasks 1,2,3 (to execute the eret instruction)
92        la      $26,    to_user                 
93        sw      $26,    4*(64+31)($27)          # $31 for task 1
94        sw      $26,    4*(128+31)($27)         # $31 for task 2
95        sw      $26,    4*(192+31)($27)         # $31 for task 3
96
97# initializes SR sor tasks 1,2,3 (set UM, EXL, IE)
98        li      $26,    0x0000FF13
99        sw      $26,    4*64($27)               # SR for task 1
100        sw      $26,    4*128($27)              # SR for task 2
101        sw      $26,    4*192($27)              # SR for task 3
102
103# ICU Configuration: 7 IRQs enabled : TIMER, IO, DMA
104        la      $27,    seg_icu_base
105        li      $26,    0x7F
106        sw      $26,    8($27)                  # ICU mask <= 0111 1111
107
108# TIMER Configuration: period = 10000 cycles
109        la      $27,    seg_timer_base
110        li      $26,    10000
111        sw      $26,    8($27)                  # period <= 10000
112        li      $26,    0x3
113        sw      $26,    4($27)                  # TIMER start
114
115# initializes Registers for T0 (size = 64K)
116        la      $26,    seg_stack_base
117        li      $27,    0x10000
118        add     $29,    $26,    $27             # SP for task 0
119        la      $26,    main0
120        mtc0    $26,    $14                     # EPC for task 0
121        li      $26,    0x0000FF13
122        mtc0    $26,    $12                     # SR for task 0
123
124# jump to address contained in EPC (in user mode)
125to_user:        eret
126
127        .end    reset
128
129        .set reorder
Note: See TracBrowser for help on using the repository browser.