source: rtems/c/src/lib/libbsp/sparc/shared/start/start.S @ ad56361

4.115
Last change on this file since ad56361 was ad56361, checked in by Sebastian Huber <sebastian.huber@…>, on 02/13/14 at 12:00:00

sparc: Add LEON3_ASR17_PROCESSOR_INDEX_SHIFT

Add _LEON3_Get_current_processor().

  • Property mode set to 100644
File size: 12.5 KB
Line 
1/**
2 *  Common start code for SPARC.
3 *
4 *  This is based on the file srt0.s provided with the binary
5 *  distribution of the SPARC Instruction Simulator (SIS) found
6 *  at ftp://ftp.estec.esa.nl/pub/ws/wsd/erc32.
7 */
8
9/*
10 *  COPYRIGHT (c) 1989-2011.
11 *  On-Line Applications Research Corporation (OAR).
12 *
13 *  The license and distribution terms for this file may be
14 *  found in the file LICENSE in this distribution or at
15 *  http://www.rtems.com/license/LICENSE.
16 */
17
18#include <rtems/asm.h>
19#include <rtems/score/percpu.h>
20#include <bspopts.h>
21
22#if defined(RTEMS_SMP) && defined(BSP_LEON3_SMP)
23  #define START_LEON3_ENABLE_SMP
24#endif
25
26/*
27 *  Unexpected trap will halt the processor by forcing it to error state
28 */
29#define BAD_TRAP \
30  ta 0; \
31  nop; \
32  nop; \
33  nop;
34
35/*
36 *  Software trap. Treat as BAD_TRAP for the time being...
37 */
38
39#define SOFT_TRAP BAD_TRAP
40
41  .seg    "text"
42  PUBLIC(start)
43  .global start, __bsp_mem_init
44
45SYM(start):
46start:
47
48/*
49 *  The trap table has to be the first code in a boot PROM.  But because
50 *  the Memory Configuration comes up thinking we only have 4K of PROM, we
51 *  cannot have a full trap table and still have room left over to
52 *  reprogram the Memory Configuration register correctly.  This file
53 *  uses an abbreviated trap which has every entry which might be used
54 *  before RTEMS installs its own trap table.
55 */
56
57  PUBLIC(trap_table)
58SYM(trap_table):
59
60  RTRAP( 0, SYM(hard_reset) );                  ! 00 reset trap
61  BAD_TRAP;                                     ! 01 instruction access
62                                                !    exception
63  BAD_TRAP;                                     ! 02 illegal instruction
64  BAD_TRAP;                                     ! 03 privileged instruction
65  BAD_TRAP;                                     ! 04 fp disabled
66  TRAP( 5, SYM(window_overflow_trap_handler) ); ! 05 window overflow
67  TRAP( 6, SYM(window_underflow_trap_handler) );! 06 window underflow
68  BAD_TRAP;                                     ! 07 memory address not aligned
69  BAD_TRAP;                                     ! 08 fp exception
70  BAD_TRAP;                                     ! 09 data access exception
71  BAD_TRAP;                                     ! 0A tag overflow
72  BAD_TRAP;                                     ! 0B undefined
73  BAD_TRAP;                                     ! 0C undefined
74  BAD_TRAP;                                     ! 0D undefined
75  BAD_TRAP;                                     ! 0E undefined
76  BAD_TRAP;                                     ! 0F undefined
77  BAD_TRAP;                                     ! 10 undefined
78
79  /*
80   *  ERC32 defined traps
81   */
82
83  BAD_TRAP;                                     ! 11 masked errors
84  BAD_TRAP;                                     ! 12 external 1
85  BAD_TRAP;                                     ! 13 external 2
86  BAD_TRAP;                                     ! 14 UART A RX/TX
87  BAD_TRAP;                                     ! 15 UART B RX/TX
88  BAD_TRAP;                                     ! 16 correctable memory error
89  BAD_TRAP;                                     ! 17 UART error
90  BAD_TRAP;                                     ! 18 DMA access error
91  BAD_TRAP;                                     ! 19 DMA timeout
92  BAD_TRAP;                                     ! 1A external 3
93  BAD_TRAP;                                     ! 1B external 4
94  BAD_TRAP;                                     ! 1C general purpose timer
95  BAD_TRAP;                                     ! 1D real time clock
96  BAD_TRAP;                                     ! 1E external 5
97  BAD_TRAP;                                     ! 1F watchdog timeout
98
99  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 20 - 23 undefined
100  BAD_TRAP;                                     ! 24 cp_disabled
101            BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 25 - 27 undefined
102  BAD_TRAP;                                     ! 28 cp_exception
103            BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 29 - 2B undefined
104  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 2C - 2F undefined
105  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 30 - 33 undefined
106  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 34 - 37 undefined
107  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 38 - 3B undefined
108  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 3C - 3F undefined
109  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 40 - 43 undefined
110  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 44 - 47 undefined
111  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 48 - 4B undefined
112  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 4C - 4F undefined
113  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 50 - 53 undefined
114  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 54 - 57 undefined
115  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 58 - 5B undefined
116  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 5C - 5F undefined
117  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 60 - 63 undefined
118  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 64 - 67 undefined
119  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 68 - 6B undefined
120  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 6C - 6F undefined
121  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 70 - 73 undefined
122  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 74 - 77 undefined
123  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 78 - 7B undefined
124
125/*
126   This is a sad patch to make sure that we know where the
127   MEC timer control register mirror is so we can stop the timers
128   from an external debugger. It is needed because the control
129   register is write-only. Trap 0x7C cannot occure in ERC32...
130
131   We also use this location to store the last location of the
132   usable RAM in order not to overwrite the remote debugger with
133   the RTEMS work-space area.
134
135*/
136
137        .global SYM(_ERC32_MEC_Timer_Control_Mirror), SYM(rdb_start), SYM(CLOCK_SPEED)
138
139SYM(rdb_start):
140SYM(_ERC32_MEC_Timer_Control_Mirror):
141
142  BAD_TRAP; BAD_TRAP;                           ! 7C - 7D undefined
143
144SYM(CLOCK_SPEED):
145
146  .word 0x0a, 0, 0, 0                           ! 7E (10 MHz default)
147
148  BAD_TRAP;                                     ! 7F undefined
149
150  /*
151   *  Software traps
152   *
153   *  NOTE: At the risk of being redundant... this is not a full
154   *        table.  The setjmp on the SPARC requires a window flush trap
155   *        handler and RTEMS will preserve the entries that were
156   *        installed before.
157   */
158
159  TRAP( 0x80, SYM(syscall) );                   ! 80 syscall SW trap
160  SOFT_TRAP; SOFT_TRAP;                         ! 81 - 82
161  TRAP( 0x83, SYM(window_flush_trap_handler) ); ! 83 flush windows SW trap
162
163  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 84 - 87
164  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 88 - 8B
165  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 8C - 8F
166  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 90 - 93
167  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 94 - 97
168  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 98 - 9B
169  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 9C - 9F
170  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A0 - A3
171  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A4 - A7
172  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A8 - AB
173  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! AC - AF
174  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B0 - B3
175  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B4 - B7
176  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B8 - BB
177  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! BC - BF
178  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C0 - C3
179  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C4 - C7
180  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C8 - CB
181  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! CC - CF
182  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D0 - D3
183  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D4 - D7
184  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D8 - DB
185  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! DC - DF
186  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E0 - E3
187  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E4 - E7
188  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E8 - EB
189  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! EC - EF
190  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F0 - F3
191  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F4 - F7
192  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F8 - FB
193  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! FC - FF
194
195/*
196 *  This is the hard reset code.
197 */
198
199#define PSR_INIT   0x10c0       /* Disable traps, set s and ps */
200#define WIM_INIT   2
201#define STACK_SIZE 16 * 1024
202
203        PUBLIC(hard_reset)
204SYM(hard_reset):
205
206/* Common initialisation */
207
208        set     SYM(trap_table), %g1    ! Initialize TBR
209        mov     %g1, %tbr
210
211        mov     %psr, %g1               ! Initialize WIM
212        add     %g1, 1, %g2
213        and     %g2, 0x7, %g2
214        set     1, %g3
215        sll     %g3, %g2, %g3
216        mov     %g3, %wim
217
218        or      %g1, 0xf20, %g1
219        wr      %g1, %psr               ! enable traps and disable ints
220
221        nop
222        nop
223        nop
224
225#if defined(START_LEON3_ENABLE_SMP)
226        rd      %asr17, %o0             ! get CPU identifier
227        srl     %o0, LEON3_ASR17_PROCESSOR_INDEX_SHIFT, %o0
228
229        cmp     %o0, 0
230        beq     cpu0
231         nop
232
233        sethi   %hi(_Per_CPU_Information), %o1 ! get per-CPU control
234        add     %o1, %lo(_Per_CPU_Information), %o1
235        sll     %o0, PER_CPU_CONTROL_SIZE_LOG2, %o2
236        add     %o1, %o2, %o1
237
238        ld      [%o1 + PER_CPU_INTERRUPT_STACK_HIGH], %sp ! set stack pointer
239        sub     %sp, 4, %sp             ! stack starts at end of area - 4
240        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
241        mov     %sp, %fp                ! set frame pointer
242
243        call    SYM(leon3_secondary_cpu_initialize) ! does not return
244         sub    %sp, CPU_MINIMUM_STACK_FRAME_SIZE, %sp
245        ba      SYM(bsp_reset)          ! just in case
246         nop
247cpu0:
248#endif
249
250        set     (SYM(rdb_start)), %g6   ! End of RAM
251        st      %sp, [%g6]
252        sub     %sp, 4, %sp             ! stack starts at end of RAM - 4
253        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
254        mov     %sp, %fp                ! Set frame pointer
255        nop
256
257#if ENABLE_SIS_QUIRKS==1
258
259#include <erc32.h>
260
261/* Check if MEC is initialised. If not, this means that we are
262   running on the simulator. Initiate some of the parameters
263   that are done by the boot-prom otherwise.
264*/
265
266        set     SYM(ERC32_MEC), %g3  ! g3 = base address of peripherals
267        ld      [%g3], %g2
268        set     0xfe080000, %g1
269        andcc   %g1, %g2, %g0
270        bne     2f
271
272 /* Set the correct memory size in MEC memory config register */
273
274        set     SYM(PROM_SIZE), %l0
275        set     0, %l1
276        srl     %l0, 18, %l0
2771:
278        tst     %l0
279        srl     %l0, 1, %l0
280        bne,a   1b
281        inc     %l1
282        sll     %l1, 8, %l1
283
284        set     SYM(RAM_SIZE), %l0
285        srl     %l0, 19, %l0
2861:
287        tst     %l0
288        srl     %l0, 1, %l0
289        bne,a   1b
290        inc     %l1
291        sll     %l1, 10, %l1
292
293        ! set the Memory Configuration
294        st     %l1, [ %g3 + ERC32_MEC_MEMORY_CONFIGURATION_OFFSET ]
295        !DISABLE THE HARDWARE WATCHDOG
296        st     %g0, [ %g3 + ERC32_MEC_WATCHDOG_TRAP_DOOR_SET_OFFSET ]
297        !Reduce the number of wait states to 0 for all memory areas.
298        st     %g0, [ %g3 + ERC32_MEC_WAIT_STATE_CONFIGURATION_OFFSET ]
299
300        set     SYM(RAM_START), %l1  ! Cannot use RAM_END due to bug in linker
301        set     SYM(RAM_SIZE), %l2
302        add     %l1, %l2, %sp
303        st      %sp, [%g6]
304
305
306        set     SYM(CLOCK_SPEED), %g6   ! Use 14 MHz in simulator
307        set     14, %g1
308        st      %g1, [%g6]
309
3102:
311#endif
312
313        /*
314         *  Copy the initialized data to RAM
315         *
316         *  FROM:   _endtext
317         *  TO:     _data_start
318         *  LENGTH: (__bss_start - _data_start) bytes
319         */
320
321        sethi %hi(_endtext),%g2
322        or    %g2,%lo(_endtext),%g2     ! g2 = start of initialized data in ROM
323
324        sethi %hi(_data_start),%g3
325        or    %g3,%lo(_data_start),%g3  ! g3 = start of initialized data in RAM
326
327        sethi %hi(__bss_start),%g4
328        or    %g4,%lo(__bss_start),%g4  ! g4 = end of initialized data in RAM
329
330        cmp   %g2, %g3
331        be    1f
332        nop
333
334copy_data:
335        ldd   [ %g2 ], %g6
336        std   %g6 , [ %g3 ]             ! copy this double word
337        add   %g3, 8, %g3               ! bump the destination pointer
338        add   %g2, 8, %g2               ! bump the source pointer
339        cmp   %g3, %g4                  ! Is the pointer past the end of dest?
340        bl    copy_data
341        nop
342
343        /* clear the bss */
3441:
345
346        sethi %hi(_edata),%g2
347        or    %g2,%lo(_edata),%g2       ! g2 = start of bss
348        sethi %hi(_end),%g3
349        or    %g3,%lo(_end),%g3         ! g3 = end of bss
350        mov   %g0,%g1                   ! so std has two zeros
351zerobss:
352        std    %g0,[%g2]
353        add    %g2,8,%g2
354        cmp    %g2,%g3
355        bleu,a zerobss
356        nop
357
358        mov     %0, %o0                 ! command line
359        call    SYM(boot_card)
360        sub     %sp, 0x60, %sp          ! room for boot_card to save args
361        nop
362
363        PUBLIC(BSP_fatal_return)
364        PUBLIC(bsp_reset)
365SYM(BSP_fatal_return):
366SYM(bsp_reset):
367        mov     1, %g1
368        ta      0                       ! Halt if _main returns ...
369        nop
370
371/* end of file */
Note: See TracBrowser for help on using the repository browser.