New sparc simulator from the ESA.
[deliverable/binutils-gdb.git] / sim / erc32 / examples / srt0.S
1 /*
2 * srt0.s for ERC32. This file is part of ERC32SIM.
3 *
4 * This program is free software; you can redistribute it and/or modify it under
5 * the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc., 675
16 * Mass Ave, Cambridge, MA 02139, USA.
17 *
18 */
19
20 /* The traptable has to be the first code in a boot PROM. */
21
22 /* Entry for traps which jump to a programmer-specified trap handler. */
23 #define TRAP(H) mov %psr, %l0; sethi %hi(H), %l4; jmp %l4+%lo(H); nop;
24
25 /* Unexcpected trap will halt the processor by forcing it to error state */
26 #define BAD_TRAP ta 0; nop; nop; nop;
27
28 /* Software trap. Treat as BAD_TRAP for the time being... */
29 #define SOFT_TRAP BAD_TRAP
30
31 #define PSR_INIT 0x10c0 /* Disable traps, set s and ps */
32 #define WIM_INIT 2
33 #define SP_INIT 0x02100000
34
35 WINDOWSIZE = (16 * 4)
36 ARGPUSHSIZE = (6 * 4)
37 ARGPUSH = (WINDOWSIZE + 4)
38 MINFRAME = (WINDOWSIZE + ARGPUSHSIZE + 4)
39 #define STACK_ALIGN 8
40 #define SA(X) (((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))
41
42 .seg "text"
43 .global _trap_table, _mecini, start
44
45 /* Hardware traps */
46 _trap_table:
47 TRAP(_mecini); ! 00 reset trap
48 BAD_TRAP; ! 01 instruction_access_exception
49 BAD_TRAP; ! 02 illegal_instruction
50 BAD_TRAP; ! 03 priveleged_instruction
51 BAD_TRAP; ! 04 fp_disabled
52 TRAP(_window_overflow); ! 05 window_overflow
53 TRAP(_window_underflow); ! 06 window_underflow
54 BAD_TRAP; ! 07 memory_address_not_aligned
55 BAD_TRAP; ! 08 fp_exception
56 BAD_TRAP; ! 09 data_access_exception
57 BAD_TRAP; ! 0A tag_overflow
58
59 /* Trap levels from 0B to 0x10 are not defined (used for MEC init) */
60
61 _mecini:
62 sethi %hi(0x01f80000), %g1 ! 0B
63 sethi %hi(0x001C1000), %g2
64 or %g1,%lo(0x001C1000),%g1
65 st %g2, [%g1 + 0x10]
66
67 st %g0, [%g1 + 0x18] ! 0C
68 nop
69 nop
70 nop
71
72 TRAP(_hardreset); ! 0D
73
74 BAD_TRAP; ! 0E undefined
75 BAD_TRAP; ! 0F undefined
76 BAD_TRAP; ! 10 undefined
77
78 /* Interrupt entries */
79 BAD_TRAP; ! 11 interrupt level 1
80 BAD_TRAP; ! 12 interrupt level 2
81 BAD_TRAP; ! 13 interrupt level 3
82 BAD_TRAP; ! 14 interrupt level 4
83 BAD_TRAP; ! 15 interrupt level 5
84 BAD_TRAP; ! 16 interrupt level 6
85 BAD_TRAP; ! 17 interrupt level 7
86 BAD_TRAP; ! 18 interrupt level 8
87 BAD_TRAP; ! 19 interrupt level 9
88 BAD_TRAP; ! 1A interrupt level 1
89 BAD_TRAP; ! 1B interrupt level 11
90 BAD_TRAP; ! 1C interrupt level 12
91 BAD_TRAP; ! 1D interrupt level 13
92 BAD_TRAP; ! 1E interrupt level 14
93 BAD_TRAP; ! 1F interrupt level 15
94 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 20 - 23 undefined
95 BAD_TRAP; ! 24 cp_disabled
96 BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 25 - 27 undefined
97 BAD_TRAP; ! 28 cp_exception
98 BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 29 - 2B undefined
99 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 2C - 2F undefined
100 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 30 - 33 undefined
101 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 34 - 37 undefined
102 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 38 - 3B undefined
103 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 3C - 3F undefined
104 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 40 - 43 undefined
105 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 44 - 47 undefined
106 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 48 - 4B undefined
107 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 4C - 4F undefined
108 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 50 - 53 undefined
109 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 54 - 57 undefined
110 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 58 - 5B undefined
111 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 5C - 5F undefined
112 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 60 - 63 undefined
113 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 64 - 67 undefined
114 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 68 - 6B undefined
115 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 6C - 6F undefined
116 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 70 - 73 undefined
117 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 74 - 77 undefined
118 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 78 - 7B undefined
119 BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 7C - 7F undefined
120
121 /* Software traps */
122 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 80 - 82
123 TRAP(_flush_windows) ! 83
124 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 84 - 87
125 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 88 - 8B
126 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 8C - 8F
127 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 90 - 93
128 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 94 - 97
129 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 98 - 9B
130 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! 9C - 9F
131 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A0 - A3
132 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A4 - A7
133 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! A8 - AB
134 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! AC - AF
135 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B0 - B3
136 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B4 - B7
137 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! B8 - BB
138 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! BC - BF
139 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C0 - C3
140 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C4 - C7
141 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! C8 - CB
142 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! CC - CF
143 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D0 - D3
144 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D4 - D7
145 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! D8 - DB
146 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! DC - DF
147 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E0 - E3
148 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E4 - E7
149 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! E8 - EB
150 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! EC - EF
151 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F0 - F3
152 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F4 - F7
153 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! F8 - FB
154 SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; ! FC - FF
155
156
157 !
158 ! Startup code for standalone system. Wash IU and FPU (if present) registers.
159 ! The registers have to be written to initiate the parity bits.
160 !
161
162 _hardreset:
163
164 sethi %hi(0x01FE0),%o0
165 or %o0,%lo(0x01FE0),%o0
166 wr %o0, %psr ! Set valid PSR
167 nop
168
169 wr %g0, %wim ! Set window invalid mask register
170 wr %g0, %y ! Init Y-register
171 nop
172 set _hardreset, %g1
173
174 wr %g1, %tbr ! Set TBR
175 sethi %hi(SP_INIT),%sp
176 or %g0, 1, %o0
177 ld [%g0], %f0 ! Check if FPU is present
178
179 tst %o0
180 bz fixiu
181 nop
182 ba fixfpu
183
184 ! FPU disabled trap address
185
186 clr %i0
187 jmpl %l2, %g0
188 rett %l2 + 4
189 nop
190
191
192 ! Wash register files (fix for 90C601E & 90C602E)
193
194 fixfpu:
195
196 ld [%g0], %f0
197 ld [%g0], %f1
198 ld [%g0], %f2
199 ld [%g0], %f3
200 ld [%g0], %f4
201 ld [%g0], %f5
202 ld [%g0], %f6
203 ld [%g0], %f7
204 ld [%g0], %f8
205 ld [%g0], %f9
206 ld [%g0], %f10
207 ld [%g0], %f11
208 ld [%g0], %f12
209 ld [%g0], %f13
210 ld [%g0], %f14
211 ld [%g0], %f15
212 ld [%g0], %f16
213 ld [%g0], %f17
214 ld [%g0], %f18
215 ld [%g0], %f19
216 ld [%g0], %f20
217 ld [%g0], %f21
218 ld [%g0], %f22
219 ld [%g0], %f23
220 ld [%g0], %f24
221 ld [%g0], %f25
222 ld [%g0], %f26
223 ld [%g0], %f27
224 ld [%g0], %f28
225 ld [%g0], %f29
226 ld [%g0], %f30
227 ld [%g0], %f31
228
229 fixiu:
230 clr %g1
231 clr %g2
232 clr %g3
233 clr %g4
234 clr %g5
235 clr %g6
236 clr %g7
237 set 8,%g1
238 wl0:
239 clr %i0
240 clr %i1
241 clr %i2
242 clr %i3
243 clr %i4
244 clr %i5
245 clr %i6
246 clr %i7
247 clr %l0
248 clr %l1
249 clr %l2
250 clr %l3
251 clr %l4
252 clr %l5
253 clr %l6
254 clr %l7
255 save
256 subcc %g1, 1, %g1
257 bne wl0
258 nop
259
260 !
261 ! Start the real-time clock with a tick of 150 clocks
262 !
263
264 rtc:
265
266 set 0x1f80000, %l0 ! MEC register base
267 set 149, %l1
268 st %l1, [%l0 + 0x84] ! RTC scaler = 149
269 set 0x0d00, %l1
270 st %l1, [%l0 + 0x98] ! Start RTC
271
272 st %g0, [%l0 + 0x64] ! Disable watchdog for now
273 ld [%l0], %g1
274 or %g1, 1, %g1
275 st %g1, [%l0] ! Enable power-down mode
276
277 ! Initialise some registers
278
279 _init:
280 set PSR_INIT, %g1 ! Initialize psr
281 wr %g1, %psr
282 set WIM_INIT, %g1 ! Initialize WIM
283 wr %g1, %wim
284 set _trap_table, %g1 ! Initialize TBR
285 wr %g1, %tbr
286 nop;nop;nop
287
288 set PSR_INIT, %g1
289 wr %g1, 0x20, %psr ! enable traps
290 nop; nop; nop;
291 set 0x02100000, %sp ! Set stack pointer
292 mov %sp, %fp
293 nop
294
295 start:
296 /* clear the bss */
297
298 sethi %hi(_edata),%g2
299 or %g2,%lo(_edata),%g2 ! g2 = start of bss
300 sethi %hi(_end),%g3
301 or %g3,%lo(_end),%g3 ! g3 = end of bss
302 mov %g0,%g1 ! so std has two zeros
303 zerobss:
304 std %g0,[%g2]
305 add %g2,8,%g2
306 cmp %g2,%g3
307 bleu,a zerobss
308 nop
309
310 /* move data segment to proper location */
311
312 relocd:
313 set (_etext),%g2 ! g2 = start of data in aout file
314 set (_environ),%g4 ! g4 = start of where data should go
315 set (_edata),%g3 ! g3 = end of where data should go
316 subcc %g3, %g4, %g5 ! g5 = length of data
317
318 subcc %g4, %g2, %g0 ! need to relocate data ?
319 ble initok
320 mvdata:
321 subcc %g5, 8, %g5
322 ldd [%g2 + %g5], %g6
323 bg mvdata
324 std %g6, [%g4 + %g5]
325
326 initok:
327
328 call _main
329 sub %sp, 0x40, %sp ! room for main to save args
330 nop
331
332 ta 0 ! Halt if _main would return ...
333 nop
334
335
336
337 /* Number of register windows */
338 #define NWINDOWS 8
339
340 !Window overflow trap handler.
341 .global _window_overflow
342
343 _window_overflow:
344
345 mov %wim, %l3 ! Calculate next WIM
346 mov %g1, %l7
347 srl %l3, 1, %g1
348 sll %l3, NWINDOWS-1 , %l4
349 or %l4, %g1, %g1
350
351 save ! Get into window to be saved.
352 mov %g1, %wim
353 nop; nop; nop
354 st %l0, [%sp + 0];
355 st %l1, [%sp + 4];
356 st %l2, [%sp + 8];
357 st %l3, [%sp + 12];
358 st %l4, [%sp + 16];
359 st %l5, [%sp + 20];
360 st %l6, [%sp + 24];
361 st %l7, [%sp + 28];
362 st %i0, [%sp + 32];
363 st %i1, [%sp + 36];
364 st %i2, [%sp + 40];
365 st %i3, [%sp + 44];
366 st %i4, [%sp + 48];
367 st %i5, [%sp + 52];
368 st %i6, [%sp + 56];
369 st %i7, [%sp + 60];
370 restore ! Go back to trap window.
371 mov %l7, %g1
372 jmp %l1 ! Re-execute save.
373 rett %l2
374
375 /* Window underflow trap handler. */
376
377 .global _window_underflow
378
379 _window_underflow:
380
381 mov %wim, %l3 ! Calculate next WIM
382 sll %l3, 1, %l4
383 srl %l3, NWINDOWS-1, %l5
384 or %l5, %l4, %l5
385 mov %l5, %wim
386 nop; nop; nop
387 restore ! Two restores to get into the
388 restore ! window to restore
389 ld [%sp + 0], %l0; ! Restore window from the stack
390 ld [%sp + 4], %l1;
391 ld [%sp + 8], %l2;
392 ld [%sp + 12], %l3;
393 ld [%sp + 16], %l4;
394 ld [%sp + 20], %l5;
395 ld [%sp + 24], %l6;
396 ld [%sp + 28], %l7;
397 ld [%sp + 32], %i0;
398 ld [%sp + 36], %i1;
399 ld [%sp + 40], %i2;
400 ld [%sp + 44], %i3;
401 ld [%sp + 48], %i4;
402 ld [%sp + 52], %i5;
403 ld [%sp + 56], %i6;
404 ld [%sp + 60], %i7;
405 save ! Get back to the trap window.
406 save
407 jmp %l1 ! Re-execute restore.
408 rett %l2
409
410 .global _flush_windows
411 _flush_windows:
412
413 mov %psr, %g1
414 or %g1, 0x0f00, %g2
415 restore ! enter previous frame (cannot trap)
416 wr %g2, 0x20, %psr ! enable traps, disable interrupts
417 nop; nop; nop
418 save ! 6 save to flush all windows
419 save
420 save
421 save
422 save
423 save
424 restore ! 5 restore to enter trapped frame
425 restore
426 restore
427 restore
428 restore
429 wr %g1, %psr ! restore %psr
430 nop; nop; nop
431 jmp %l2 ! Jump to nPC
432 rett %l2 + 4
433
434
435
436
437 .seg "data"
438 .global .bdata
439 .bdata:
440 .align 8
441 .global _environ ! first symbol in sdata
442 _environ:
443 .word 0
444 .global _errno ! not defined elsewhere ..?
445 _errno:
446 .word 0
447
448
449
This page took 0.039469 seconds and 4 git commands to generate.