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

4.104.11
Last change on this file since 81fb3d3 was 81fb3d3, checked in by Joel Sherrill <joel.sherrill@…>, on May 4, 2009 at 12:50:49 AM

2009-05-03 Joel Sherrill <joel.sherrill@…>

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