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

4.11
Last change on this file since b3211b5a was b3211b5a, checked in by Daniel Hellstrom <daniel@…>, on Oct 31, 2013 at 2:23:23 PM

SPARC BSPs: disable interrupts as early as possible

There is no point having interrupts enabled before reaching
boot_card() that disables interrupt. We better have it off
all the time.

It is required to turn off interrupt on secondary CPUs in an
SMP system.

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