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