source: rtems/bsps/sparc/shared/start/start.S @ a87964d

5
Last change on this file since a87964d was a87964d, checked in by Daniel Hellstrom <daniel@…>, on 08/23/18 at 09:13:44

sparc,smp: typo in start.S causing SMP not working

  • Property mode set to 100644
File size: 13.0 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.org/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 * System call optimized trap table entry
37 */
38#define FPDIS_TRAP(_handler)  \
39  mov   %psr, %l0 ; \
40  sethi %hi(_handler), %l4 ; \
41  jmp   %l4+%lo(_handler); \
42   sethi %hi(SPARC_PSR_EF_MASK), %l3
43
44/*
45 * System call optimized trap table entry
46 */
47#define IRQDIS_TRAP(_handler)  \
48  mov   %psr, %l0 ; \
49  sethi %hi(_handler), %l4 ; \
50  jmp   %l4+%lo(_handler); \
51   or   %l0, 0x0f00, %l3; ! Set PIL=0xf to disable IRQ
52
53/*
54 * System call optimized trap table entry
55 */
56#define IRQEN_TRAP(_handler)  \
57  mov   %psr, %l0 ; \
58  sethi %hi(_handler), %l4 ; \
59  jmp   %l4+%lo(_handler); \
60   andn %l0, 0xf00, %l3; ! Set PIL=0 to Enable IRQ
61
62/*
63 * Window Overflow optimized trap table entry
64 */
65#define WOTRAP(_vector, _handler)  \
66  sethi %hi(_handler), %l4; \
67  jmp   %l4+%lo(_handler); \
68    save; \
69  nop
70
71/*
72 * Window Underflow optimized trap table entry
73 */
74#define WUTRAP(_vector, _handler)  \
75  mov   %wim, %l3 ; \
76  sethi %hi(_handler), %l4 ; \
77  jmp   %l4+%lo(_handler); \
78   sll  %l3, 1, %l4 ! l4 = WIM << 1
79
80/*
81 *  Software trap. Treat as BAD_TRAP for the time being...
82 */
83
84#define SOFT_TRAP BAD_TRAP
85
86  .section    ".text"
87  PUBLIC(start)
88  .global start, __bsp_mem_init
89
90SYM(start):
91#if SYM(start) != start
92start:
93#endif
94
95/*
96 *  The trap table has to be the first code in a boot PROM.  But because
97 *  the Memory Configuration comes up thinking we only have 4K of PROM, we
98 *  cannot have a full trap table and still have room left over to
99 *  reprogram the Memory Configuration register correctly.  This file
100 *  uses an abbreviated trap which has every entry which might be used
101 *  before RTEMS installs its own trap table.
102 */
103
104  PUBLIC(trap_table)
105SYM(trap_table):
106
107  RTRAP( 0, SYM(hard_reset) );                  ! 00 reset trap
108  BAD_TRAP;                                     ! 01 instruction access
109                                                !    exception
110  BAD_TRAP;                                     ! 02 illegal instruction
111  BAD_TRAP;                                     ! 03 privileged instruction
112#if defined(SPARC_USE_LAZY_FP_SWITCH)
113  FPDIS_TRAP(SYM(syscall_lazy_fp_switch));      ! 04 fp disabled
114#else
115  BAD_TRAP;                                     ! 04 fp disabled
116#endif
117  WOTRAP(5, SYM(window_overflow_trap_handler)); ! 05 window overflow
118  WUTRAP(6, SYM(window_underflow_trap_handler));! 06 window underflow
119  BAD_TRAP;                                     ! 07 memory address not aligned
120  BAD_TRAP;                                     ! 08 fp exception
121  BAD_TRAP;                                     ! 09 data access exception
122  BAD_TRAP;                                     ! 0A tag overflow
123  BAD_TRAP;                                     ! 0B undefined
124  BAD_TRAP;                                     ! 0C undefined
125  BAD_TRAP;                                     ! 0D undefined
126  BAD_TRAP;                                     ! 0E undefined
127  BAD_TRAP;                                     ! 0F undefined
128  BAD_TRAP;                                     ! 10 undefined
129
130  /*
131   *  ERC32 defined traps
132   */
133
134  BAD_TRAP;                                     ! 11 masked errors
135  BAD_TRAP;                                     ! 12 external 1
136  BAD_TRAP;                                     ! 13 external 2
137  BAD_TRAP;                                     ! 14 UART A RX/TX
138  BAD_TRAP;                                     ! 15 UART B RX/TX
139  BAD_TRAP;                                     ! 16 correctable memory error
140  BAD_TRAP;                                     ! 17 UART error
141  BAD_TRAP;                                     ! 18 DMA access error
142  BAD_TRAP;                                     ! 19 DMA timeout
143  BAD_TRAP;                                     ! 1A external 3
144  BAD_TRAP;                                     ! 1B external 4
145  BAD_TRAP;                                     ! 1C general purpose timer
146  BAD_TRAP;                                     ! 1D real time clock
147  BAD_TRAP;                                     ! 1E external 5
148  BAD_TRAP;                                     ! 1F watchdog timeout
149
150  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 20 - 23 undefined
151  BAD_TRAP;                                     ! 24 cp_disabled
152            BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 25 - 27 undefined
153  BAD_TRAP;                                     ! 28 cp_exception
154            BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 29 - 2B undefined
155  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 2C - 2F undefined
156  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 30 - 33 undefined
157  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 34 - 37 undefined
158  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 38 - 3B undefined
159  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 3C - 3F undefined
160  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 40 - 43 undefined
161  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 44 - 47 undefined
162  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 48 - 4B undefined
163  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 4C - 4F undefined
164  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 50 - 53 undefined
165  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 54 - 57 undefined
166  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 58 - 5B undefined
167  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 5C - 5F undefined
168  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 60 - 63 undefined
169  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 64 - 67 undefined
170  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 68 - 6B undefined
171  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 6C - 6F undefined
172  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 70 - 73 undefined
173  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 74 - 77 undefined
174  BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP;       ! 78 - 7B undefined
175
176/*
177   This is a sad patch to make sure that we know where the
178   MEC timer control register mirror is so we can stop the timers
179   from an external debugger. It is needed because the control
180   register is write-only. Trap 0x7C cannot occure in ERC32...
181
182   We also use this location to store the last location of the
183   usable RAM in order not to overwrite the remote debugger with
184   the RTEMS work-space area.
185
186*/
187
188        .global SYM(_ERC32_MEC_Timer_Control_Mirror), SYM(rdb_start), SYM(CLOCK_SPEED)
189
190SYM(rdb_start):
191SYM(_ERC32_MEC_Timer_Control_Mirror):
192
193  BAD_TRAP; BAD_TRAP;                           ! 7C - 7D undefined
194
195SYM(CLOCK_SPEED):
196
197  .word 0x0a, 0, 0, 0                           ! 7E (10 MHz default)
198
199  BAD_TRAP;                                     ! 7F undefined
200
201  /*
202   *  Software traps
203   *
204   *  NOTE: At the risk of being redundant... this is not a full
205   *        table.  The setjmp on the SPARC requires a window flush trap
206   *        handler and RTEMS will preserve the entries that were
207   *        installed before.
208   */
209
210  TRAP( 0x80, SYM(syscall) );                   ! 80 halt syscall SW trap
211  SOFT_TRAP; SOFT_TRAP;                         ! 81 - 82
212  TRAP( 0x83, SYM(window_flush_trap_handler) ); ! 83 flush windows SW trap
213
214  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 84 - 87
215  SOFT_TRAP;                                    ! 88
216
217  /*
218   *  SW Trap 9-15 Reserved for Operating System
219   * 
220   *  SPARC_SWTRAP_IRQDIS
221   *  SPARC_SWTRAP_IRQEN
222   */
223  IRQDIS_TRAP(SYM(syscall_irqdis));             ! 89 IRQ Disable syscall trap
224  IRQEN_TRAP(SYM(syscall_irqen));               ! 8A IRQ Enable syscall trap
225#if defined(SPARC_USE_SYNCHRONOUS_FP_SWITCH)
226  IRQDIS_TRAP(SYM(syscall_irqdis_fp));          ! 8B IRQ disable
227                                                ! and set PSR[EF] syscall trap
228#else
229  SOFT_TRAP;                                    ! 8B
230#endif
231  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 8C - 8F
232
233  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 90 - 93
234  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 94 - 97
235  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 98 - 9B
236  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! 9C - 9F
237  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A0 - A3
238  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A4 - A7
239  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! A8 - AB
240  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! AC - AF
241  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B0 - B3
242  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B4 - B7
243  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! B8 - BB
244  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! BC - BF
245  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C0 - C3
246  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C4 - C7
247  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! C8 - CB
248  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! CC - CF
249  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D0 - D3
250  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D4 - D7
251  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! D8 - DB
252  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! DC - DF
253  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E0 - E3
254  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E4 - E7
255  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! E8 - EB
256  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! EC - EF
257  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F0 - F3
258  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F4 - F7
259  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! F8 - FB
260  SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;   ! FC - FF
261
262/*
263 *  This is the hard reset code.
264 */
265
266#define PSR_INIT   0x10c0       /* Disable traps, set s and ps */
267#define WIM_INIT   2
268
269        PUBLIC(hard_reset)
270SYM(hard_reset):
271
272/* Common initialisation */
273
274        set     SYM(trap_table), %g1    ! Initialize TBR
275        mov     %g1, %tbr
276
277        mov     %psr, %g1               ! Initialize WIM
278        add     %g1, 1, %g2
279        and     %g2, 0x7, %g2
280        set     1, %g3
281        sll     %g3, %g2, %g3
282        mov     %g3, %wim
283
284        or      %g1, 0xf20, %g1
285        wr      %g1, %psr               ! enable traps and disable ints
286
287        nop
288        nop
289        nop
290
291        sethi   %hi(_Per_CPU_Information), %g6 ! get per-CPU control
292        add     %g6, %lo(_Per_CPU_Information), %g6
293
294#if defined(START_LEON3_ENABLE_SMP)
295        rd      %asr17, %o0             ! get CPU identifier
296        srl     %o0, LEON3_ASR17_PROCESSOR_INDEX_SHIFT, %o0
297
298        sll     %o0, PER_CPU_CONTROL_SIZE_LOG2, %l0
299        add     %g6, %l0, %g6
300
301        /* If LEON3_Boot_Cpu < 0 then assign us as boot CPU and continue. */
302        set     SYM(LEON3_Boot_Cpu), %o1
303        ld      [%o1], %o2
304        tst     %o2
305        bneg    .Lbootcpu
306         nop
307
308        ld      [%g6 + PER_CPU_INTERRUPT_STACK_HIGH], %sp ! set stack pointer
309        sub     %sp, 4, %sp             ! stack starts at end of area - 4
310        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
311        mov     %sp, %fp                ! set frame pointer
312
313        mov     %g6, %o0
314        call    SYM(bsp_start_on_secondary_processor) ! does not return
315         sub    %sp, SPARC_MINIMUM_STACK_FRAME_SIZE, %sp
316.Lbootcpu:
317        st      %o0, [%o1]
318#endif
319
320        set     SYM(rdb_start), %g5     ! End of RAM
321        st      %sp, [%g5]
322        set     SYM(_Configuration_Interrupt_stack_size), %g5
323#if defined(START_LEON3_ENABLE_SMP)
324        add     %o0, 1, %o0
325        smul    %o0, %g5, %g5
326#endif
327        set     SYM(_Configuration_Interrupt_stack_area_begin), %sp
328        add     %sp, %g5, %sp
329        sub     %sp, 4, %sp             ! stack starts at end of area - 4
330        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
331        mov     %sp, %fp                ! Set frame pointer
332        nop
333
334        /*
335         *  Copy the initialized data to RAM
336         *
337         *  FROM:   _data_load_start
338         *  TO:     _data_start
339         *  LENGTH: (__bss_start - _data_start) bytes
340         */
341
342        sethi %hi(_data_load_start),%g1 ! g1 = start of initialized data in ROM
343        or    %g1,%lo(_data_load_start),%g1
344
345        sethi %hi(_data_start),%g3      ! g3 = start of initialized data in RAM
346        or    %g3,%lo(_data_start),%g3
347
348        sethi %hi(__bss_start), %g2     ! g2 = end of initialized data in RAM
349        or    %g2,%lo(__bss_start),%g2
350
351        cmp   %g1, %g3
352        be    1f
353        nop
354
355copy_data:
356        ldd   [%g1], %g4
357        std   %g4 , [%g3]               ! copy this double word
358        add   %g3, 8, %g3               ! bump the destination pointer
359        add   %g1, 8, %g1               ! bump the source pointer
360        cmp   %g3, %g2                  ! Is the pointer past the end of dest?
361        bl    copy_data
362        nop
363
364        /* clear the bss */
3651:
366
367        sethi %hi(_end),%g3
368        or    %g3,%lo(_end),%g3         ! g3 = end of bss
369        mov   %g0,%g1                   ! so std has two zeros
370zerobss:
371        std    %g0,[%g2]
372        add    %g2,8,%g2
373        cmp    %g2,%g3
374        bleu,a zerobss
375        nop
376
377        mov     %g0, %o0                ! command line
378        call    SYM(boot_card)          ! does not return
379         sub     %sp, 0x60, %sp         ! room for boot_card to save args
380
381/* end of file */
Note: See TracBrowser for help on using the repository browser.