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

4.115
Last change on this file since b2d191e was b2d191e, checked in by Sebastian Huber <sebastian.huber@…>, on 05/14/14 at 08:23:18

bsps/sparc: Fix data copy in start procedure

Use the register %g4 for the data content since it must be an even
numbered register due to the std/ldd. Use the register %g2 for the BSS
start address, so that it can be later re-used for the BSS zero loop.

  • 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.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 *  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        sethi   %hi(_Per_CPU_Information), %g6 ! get per-CPU control
226        add     %g6, %lo(_Per_CPU_Information), %g6
227
228#if defined(START_LEON3_ENABLE_SMP)
229        rd      %asr17, %o0             ! get CPU identifier
230        srl     %o0, LEON3_ASR17_PROCESSOR_INDEX_SHIFT, %o0
231
232        cmp     %o0, 0
233        beq     cpu0
234         nop
235
236        sll     %o0, PER_CPU_CONTROL_SIZE_LOG2, %l0
237        add     %g6, %l0, %g6
238
239        ld      [%g6 + PER_CPU_INTERRUPT_STACK_HIGH], %sp ! set stack pointer
240        sub     %sp, 4, %sp             ! stack starts at end of area - 4
241        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
242        mov     %sp, %fp                ! set frame pointer
243
244        call    SYM(bsp_start_on_secondary_processor) ! does not return
245         sub    %sp, CPU_MINIMUM_STACK_FRAME_SIZE, %sp
246        ba      SYM(bsp_reset)          ! just in case
247         nop
248cpu0:
249#endif
250
251        set     (SYM(rdb_start)), %g5   ! End of RAM
252        st      %sp, [%g5]
253        sub     %sp, 4, %sp             ! stack starts at end of RAM - 4
254        andn    %sp, 0x0f, %sp          ! align stack on 16-byte boundary
255        mov     %sp, %fp                ! Set frame pointer
256        nop
257
258#if ENABLE_SIS_QUIRKS==1
259
260#include <erc32.h>
261
262/* Check if MEC is initialised. If not, this means that we are
263   running on the simulator. Initiate some of the parameters
264   that are done by the boot-prom otherwise.
265*/
266
267        set     SYM(ERC32_MEC), %g3  ! g3 = base address of peripherals
268        ld      [%g3], %g2
269        set     0xfe080000, %g1
270        andcc   %g1, %g2, %g0
271        bne     2f
272
273 /* Set the correct memory size in MEC memory config register */
274
275        set     SYM(PROM_SIZE), %l0
276        set     0, %l1
277        srl     %l0, 18, %l0
2781:
279        tst     %l0
280        srl     %l0, 1, %l0
281        bne,a   1b
282        inc     %l1
283        sll     %l1, 8, %l1
284
285        set     SYM(RAM_SIZE), %l0
286        srl     %l0, 19, %l0
2871:
288        tst     %l0
289        srl     %l0, 1, %l0
290        bne,a   1b
291        inc     %l1
292        sll     %l1, 10, %l1
293
294        ! set the Memory Configuration
295        st     %l1, [ %g3 + ERC32_MEC_MEMORY_CONFIGURATION_OFFSET ]
296        !DISABLE THE HARDWARE WATCHDOG
297        st     %g0, [ %g3 + ERC32_MEC_WATCHDOG_TRAP_DOOR_SET_OFFSET ]
298        !Reduce the number of wait states to 0 for all memory areas.
299        st     %g0, [ %g3 + ERC32_MEC_WAIT_STATE_CONFIGURATION_OFFSET ]
300
301        set     SYM(RAM_START), %l1  ! Cannot use RAM_END due to bug in linker
302        set     SYM(RAM_SIZE), %l2
303        add     %l1, %l2, %sp
304        st      %sp, [%g5]
305
306
307        set     SYM(CLOCK_SPEED), %g5   ! Use 14 MHz in simulator
308        set     14, %g1
309        st      %g1, [%g5]
310
3112:
312#endif
313
314        /*
315         *  Copy the initialized data to RAM
316         *
317         *  FROM:   _endtext
318         *  TO:     _data_start
319         *  LENGTH: (__bss_start - _data_start) bytes
320         */
321
322        sethi %hi(_endtext),%g1
323        or    %g1,%lo(_endtext),%g1     ! g1 = start of initialized data in ROM
324
325        sethi %hi(_data_start),%g3
326        or    %g3,%lo(_data_start),%g3  ! g3 = start of initialized data in RAM
327
328        sethi %hi(__bss_start), %g2
329        or    %g2,%lo(__bss_start),%g2  ! g2 = end of initialized data in RAM
330
331        cmp   %g1, %g3
332        be    1f
333        nop
334
335copy_data:
336        ldd   [%g1], %g4
337        std   %g4 , [%g3]               ! copy this double word
338        add   %g3, 8, %g3               ! bump the destination pointer
339        add   %g1, 8, %g1               ! bump the source pointer
340        cmp   %g3, %g2                  ! Is the pointer past the end of dest?
341        bl    copy_data
342        nop
343
344        /* clear the bss */
3451:
346
347        sethi %hi(_edata),%g2
348        or    %g2,%lo(_edata),%g2       ! g2 = start of bss
349        sethi %hi(_end),%g3
350        or    %g3,%lo(_end),%g3         ! g3 = end of bss
351        mov   %g0,%g1                   ! so std has two zeros
352zerobss:
353        std    %g0,[%g2]
354        add    %g2,8,%g2
355        cmp    %g2,%g3
356        bleu,a zerobss
357        nop
358
359        mov     %0, %o0                 ! command line
360        call    SYM(boot_card)
361        sub     %sp, 0x60, %sp          ! room for boot_card to save args
362        nop
363
364#if !defined(START_LEON3_ENABLE_SMP)
365        PUBLIC(BSP_fatal_return)
366        PUBLIC(bsp_reset)
367SYM(BSP_fatal_return):
368SYM(bsp_reset):
369        mov     1, %g1
370        ta      0                       ! Halt if _main returns ...
371        nop
372#endif
373
374/* end of file */
Note: See TracBrowser for help on using the repository browser.