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

5
Last change on this file since 8639685 was 8639685, checked in by Jacob Hansen <jacob.hansen@…>, on 10/28/16 at 14:05:56

sparc: Adjust assembly to improve compability with LLVM

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