2 * srt0.s for ERC32. This file is part of ERC32SIM.
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)
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
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.
20 /* The traptable has to be the first code in a boot PROM. */
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;
25 /* Unexcpected trap will halt the processor by forcing it to error state */
26 #define BAD_TRAP ta 0; nop; nop; nop;
28 /* Software trap. Treat as BAD_TRAP for the time being... */
29 #define SOFT_TRAP BAD_TRAP
31 #define PSR_INIT 0x10c0 /* Disable traps, set s and ps */
33 #define SP_INIT 0x02100000
37 ARGPUSH = (WINDOWSIZE + 4)
38 MINFRAME = (WINDOWSIZE + ARGPUSHSIZE + 4)
40 #define SA(X) (((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))
43 .global _trap_table, _mecini, start
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
59 /* Trap levels from 0B to 0x10 are not defined (used for MEC init) */
62 sethi %hi(0x01f80000), %g1 ! 0B
63 sethi %hi(0x001C1000), %g2
64 or %g1,%lo(0x001C1000),%g1
67 st %g0, [%g1 + 0x18] ! 0C
72 TRAP(_hardreset); ! 0D
74 BAD_TRAP; ! 0E undefined
75 BAD_TRAP; ! 0F undefined
76 BAD_TRAP; ! 10 undefined
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
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
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.
164 sethi %hi(0x01FE0),%o0
165 or %o0,%lo(0x01FE0),%o0
166 wr %o0, %psr ! Set valid PSR
169 wr %g0, %wim ! Set window invalid mask register
170 wr %g0, %y ! Init Y-register
174 wr %g1, %tbr ! Set TBR
175 sethi %hi(SP_INIT),%sp
177 ld [%g0], %f0 ! Check if FPU is present
184 ! FPU disabled trap address
192 ! Wash register files (fix for 90C601E & 90C602E)
261 ! Start the real-time clock with a tick of 150 clocks
266 set 0x1f80000, %l0 ! MEC register base
268 st %l1, [%l0 + 0x84] ! RTC scaler = 149
270 st %l1, [%l0 + 0x98] ! Start RTC
272 st %g0, [%l0 + 0x64] ! Disable watchdog for now
275 st %g1, [%l0] ! Enable power-down mode
277 ! Initialise some registers
280 set PSR_INIT, %g1 ! Initialize psr
282 set WIM_INIT, %g1 ! Initialize WIM
284 set _trap_table, %g1 ! Initialize TBR
289 wr %g1, 0x20, %psr ! enable traps
291 set 0x02100000, %sp ! Set stack pointer
298 sethi %hi(_edata),%g2
299 or %g2,%lo(_edata),%g2 ! g2 = start of bss
301 or %g3,%lo(_end),%g3 ! g3 = end of bss
302 mov %g0,%g1 ! so std has two zeros
310 /* move data segment to proper location */
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
318 subcc %g4, %g2, %g0 ! need to relocate data ?
329 sub %sp, 0x40, %sp ! room for main to save args
332 ta 0 ! Halt if _main would return ...
337 /* Number of register windows */
340 !Window overflow trap handler.
341 .global _window_overflow
345 mov %wim, %l3 ! Calculate next WIM
348 sll %l3, NWINDOWS-1 , %l4
351 save ! Get into window to be saved.
370 restore ! Go back to trap window.
372 jmp %l1 ! Re-execute save.
375 /* Window underflow trap handler. */
377 .global _window_underflow
381 mov %wim, %l3 ! Calculate next WIM
383 srl %l3, NWINDOWS-1, %l5
387 restore ! Two restores to get into the
388 restore ! window to restore
389 ld [%sp + 0], %l0; ! Restore window from the stack
405 save ! Get back to the trap window.
407 jmp %l1 ! Re-execute restore.
410 .global _flush_windows
415 restore ! enter previous frame (cannot trap)
416 wr %g2, 0x20, %psr ! enable traps, disable interrupts
418 save ! 6 save to flush all windows
424 restore ! 5 restore to enter trapped frame
429 wr %g1, %psr ! restore %psr
431 jmp %l2 ! Jump to nPC
441 .global _environ ! first symbol in sdata
444 .global _errno ! not defined elsewhere ..?