1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include <asm/head.h>
44 #include <asm/version.h>
45 #include <asm/asi.h>
46 #include <asm/contregs.h>
47 #include <asm/psr.h>
48 #include <asm/page.h>
49
50 .data
51
52
53
54 .globl _intstack
55 .globl _eintstack
56 _intstack:
57 .skip 4 * PAGE_SIZE ! 16k = 128 128-byte stack frames
58 _eintstack:
59
60
61
62
63
64
65
66
67 .globl _cputyp
68
69 _cputyp:
70 .word 1
71
72 _cputypval:
73 .asciz "sun4c"
74 .ascii " "
75
76
77
78
79
80
81
82
83
84 _cputypvar:
85 .asciz "compatability"
86
87 _cputypvallen = _cputypvar - _cputypval
88
89
90
91 .align 4
92 .globl _prom_iface_vers
93
94 _prom_iface_vers: .skip 4
95
96
97
98 .align 4
99
100 sun4_notsup:
101 .asciz "Sparc-Linux: sun4 support not implemented yet\n\n"
102 .align 4
103
104 sun4m_notsup:
105 .asciz "Sparc-Linux: sun4m support does not exist\n\n"
106 .align 4
107
108 sun4d_notsup:
109 .asciz "Sparc-Linux: sun4d support does not exist\n\n"
110 .align 4
111
112 you_lose:
113 .asciz "You lose..... Thanks for playing...\n"
114 .align 4
115
116
117 .globl boot_msg
118
119
120
121
122 mem_prop_physavail: .asciz "available"
123 mem_prop_phystot: .asciz "reg"
124
125
126
127 .align 4
128 v2_mem_struct: .skip 0xff
129
130 .align 4
131 v2_printf_physavail: .asciz "Physical Memory Available: 0x%x bytes"
132 v2_printf_phystot: .asciz "Physical Memory: 0x%x bytes"
133
134
135
136 .align 4
137 prop_string_buf: .skip 32
138
139 prop_name: .asciz "name"
140 .align 4
141
142 current_node: .skip 4
143 .align 4
144
145
146
147
148 boot_msg:
149 .ascii "Booting Sparc-Linux V0.00PRE-ALPHA "
150 .ascii WHO_COMPILED_ME
151 .asciz " \n"
152 .align 4
153
154 .globl boot_msg2
155
156 boot_msg2:
157 .asciz "Booting Sparclinux V0.00 PRE-ALPHA on a (SUN4C)\n\n"
158
159 .align 4
160
161 pstring1:
162 .asciz "Prom Magic Cookie: 0x%x "
163 .align 4
164
165 pstring2:
166 .asciz "Interface Version: v%d\n"
167 .align 4
168
169 pstring3:
170 .asciz "Prom Revision: V%d\n\n"
171 .align 4
172
173 pstring4:
174 .ascii "Total Physical Memory: %d bytes\nVM mapped by Prom: %d bytes\n"
175 .asciz "Available Physical Memory: %d bytes\n"
176 .align 4
177
178
179 newline:
180 .asciz "\n"
181 .align 4
182
183 .text
184
185 .globl _msgbuf
186 msgbufsize = PAGE_SIZE ! 1 page for msg buffer
187 _msgbuf = PAGE_SIZE
188
189
190 IE_reg_addr = _msgbuf + msgbufsize ! this page not used; points to IEreg
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223 .globl start
224 .globl _trapbase
225 start:
226 _trapbase:
227 b gokernel; WRITE_PAUSE ! we never get trap #0 it is special
228
229 TRAP_ENTRY(0x1, my_trap_handler)
230 TRAP_ENTRY(0x2, my_trap_handler)
231 TRAP_ENTRY(0x3, my_trap_handler)
232 TRAP_ENTRY(0x4, my_trap_handler)
233 TRAP_ENTRY(0x5, spill_window_entry)
234 TRAP_ENTRY(0x6, fill_window_entry)
235 TRAP_ENTRY(0x7, my_trap_handler)
236 TRAP_ENTRY(0x8, my_trap_handler)
237 TRAP_ENTRY(0x9, my_trap_handler)
238 TRAP_ENTRY(0xa, my_trap_handler)
239 TRAP_ENTRY(0xb, my_trap_handler)
240 TRAP_ENTRY(0xc, my_trap_handler)
241 TRAP_ENTRY(0xd, my_trap_handler)
242 TRAP_ENTRY(0xe, my_trap_handler)
243 TRAP_ENTRY(0xf, my_trap_handler)
244 TRAP_ENTRY(0x10, my_trap_handler)
245
246
247
248 TRAP_ENTRY_INTERRUPT_SOFT(1, 0x101)
249 TRAP_ENTRY_INTERRUPT(2)
250 TRAP_ENTRY_INTERRUPT(3)
251 TRAP_ENTRY_INTERRUPT_SOFT(4, 0x104)
252 TRAP_ENTRY_INTERRUPT(5)
253 TRAP_ENTRY_INTERRUPT_SOFT(6, 0x106)
254 TRAP_ENTRY_INTERRUPT(7)
255 TRAP_ENTRY_INTERRUPT(8)
256 TRAP_ENTRY_INTERRUPT(9)
257 TRAP_ENTRY_INTERRUPT(10)
258 TRAP_ENTRY_INTERRUPT(11)
259 TRAP_ENTRY_INTERRUPT(12)
260 TRAP_ENTRY_INTERRUPT(13)
261 TRAP_ENTRY_INTERRUPT(14)
262 TRAP_ENTRY_INTERRUPT_NMI(15, linux_trap_nmi)
263
264 TRAP_ENTRY(0x20, my_trap_handler)
265 TRAP_ENTRY(0x21, my_trap_handler)
266 TRAP_ENTRY(0x22, my_trap_handler)
267 TRAP_ENTRY(0x23, my_trap_handler)
268 TRAP_ENTRY(0x24, my_trap_handler)
269 TRAP_ENTRY(0x25, my_trap_handler)
270 TRAP_ENTRY(0x26, my_trap_handler)
271 TRAP_ENTRY(0x27, my_trap_handler)
272 TRAP_ENTRY(0x28, my_trap_handler)
273 TRAP_ENTRY(0x29, my_trap_handler)
274 TRAP_ENTRY(0x2a, my_trap_handler)
275 TRAP_ENTRY(0x2b, my_trap_handler)
276 TRAP_ENTRY(0x2c, my_trap_handler)
277 TRAP_ENTRY(0x2d, my_trap_handler)
278 TRAP_ENTRY(0x2e, my_trap_handler)
279 TRAP_ENTRY(0x2f, my_trap_handler)
280 TRAP_ENTRY(0x30, my_trap_handler)
281 TRAP_ENTRY(0x31, my_trap_handler)
282 TRAP_ENTRY(0x32, my_trap_handler)
283 TRAP_ENTRY(0x33, my_trap_handler)
284 TRAP_ENTRY(0x34, my_trap_handler)
285 TRAP_ENTRY(0x35, my_trap_handler)
286 TRAP_ENTRY(0x36, my_trap_handler)
287 TRAP_ENTRY(0x37, my_trap_handler)
288 TRAP_ENTRY(0x38, my_trap_handler)
289 TRAP_ENTRY(0x39, my_trap_handler)
290 TRAP_ENTRY(0x3a, my_trap_handler)
291 TRAP_ENTRY(0x3b, my_trap_handler)
292 TRAP_ENTRY(0x3c, my_trap_handler)
293 TRAP_ENTRY(0x3d, my_trap_handler)
294 TRAP_ENTRY(0x3e, my_trap_handler)
295 TRAP_ENTRY(0x3f, my_trap_handler)
296 TRAP_ENTRY(0x40, my_trap_handler)
297 TRAP_ENTRY(0x41, my_trap_handler)
298 TRAP_ENTRY(0x42, my_trap_handler)
299 TRAP_ENTRY(0x43, my_trap_handler)
300 TRAP_ENTRY(0x44, my_trap_handler)
301 TRAP_ENTRY(0x45, my_trap_handler)
302 TRAP_ENTRY(0x46, my_trap_handler)
303 TRAP_ENTRY(0x47, my_trap_handler)
304 TRAP_ENTRY(0x48, my_trap_handler)
305 TRAP_ENTRY(0x49, my_trap_handler)
306 TRAP_ENTRY(0x4a, my_trap_handler)
307 TRAP_ENTRY(0x4b, my_trap_handler)
308 TRAP_ENTRY(0x4c, my_trap_handler)
309 TRAP_ENTRY(0x4d, my_trap_handler)
310 TRAP_ENTRY(0x4e, my_trap_handler)
311 TRAP_ENTRY(0x4f, my_trap_handler)
312 TRAP_ENTRY(0x50, my_trap_handler)
313 TRAP_ENTRY(0x51, my_trap_handler)
314 TRAP_ENTRY(0x52, my_trap_handler)
315 TRAP_ENTRY(0x53, my_trap_handler)
316 TRAP_ENTRY(0x54, my_trap_handler)
317 TRAP_ENTRY(0x55, my_trap_handler)
318 TRAP_ENTRY(0x56, my_trap_handler)
319 TRAP_ENTRY(0x57, my_trap_handler)
320 TRAP_ENTRY(0x58, my_trap_handler)
321 TRAP_ENTRY(0x59, my_trap_handler)
322 TRAP_ENTRY(0x5a, my_trap_handler)
323 TRAP_ENTRY(0x5b, my_trap_handler)
324 TRAP_ENTRY(0x5c, my_trap_handler)
325 TRAP_ENTRY(0x5d, my_trap_handler)
326 TRAP_ENTRY(0x5e, my_trap_handler)
327 TRAP_ENTRY(0x5f, my_trap_handler)
328 TRAP_ENTRY(0x60, my_trap_handler)
329 TRAP_ENTRY(0x61, my_trap_handler)
330 TRAP_ENTRY(0x62, my_trap_handler)
331 TRAP_ENTRY(0x63, my_trap_handler)
332 TRAP_ENTRY(0x64, my_trap_handler)
333 TRAP_ENTRY(0x65, my_trap_handler)
334 TRAP_ENTRY(0x66, my_trap_handler)
335 TRAP_ENTRY(0x67, my_trap_handler)
336 TRAP_ENTRY(0x68, my_trap_handler)
337 TRAP_ENTRY(0x69, my_trap_handler)
338 TRAP_ENTRY(0x6a, my_trap_handler)
339 TRAP_ENTRY(0x6b, my_trap_handler)
340 TRAP_ENTRY(0x6c, my_trap_handler)
341 TRAP_ENTRY(0x6d, my_trap_handler)
342 TRAP_ENTRY(0x6e, my_trap_handler)
343 TRAP_ENTRY(0x6f, my_trap_handler)
344 TRAP_ENTRY(0x70, my_trap_handler)
345 TRAP_ENTRY(0x71, my_trap_handler)
346 TRAP_ENTRY(0x72, my_trap_handler)
347 TRAP_ENTRY(0x73, my_trap_handler)
348 TRAP_ENTRY(0x74, my_trap_handler)
349 TRAP_ENTRY(0x75, my_trap_handler)
350 TRAP_ENTRY(0x76, my_trap_handler)
351 TRAP_ENTRY(0x77, my_trap_handler)
352 TRAP_ENTRY(0x78, my_trap_handler)
353 TRAP_ENTRY(0x79, my_trap_handler)
354 TRAP_ENTRY(0x7a, my_trap_handler)
355 TRAP_ENTRY(0x7b, my_trap_handler)
356 TRAP_ENTRY(0x7c, my_trap_handler)
357 TRAP_ENTRY(0x7d, my_trap_handler)
358 TRAP_ENTRY(0x7e, my_trap_handler)
359 TRAP_ENTRY(0x7f, my_trap_handler)
360 TRAP_ENTRY(0x80, my_trap_handler)
361 TRAP_ENTRY(0x81, my_trap_handler)
362 TRAP_ENTRY(0x82, my_trap_handler)
363 TRAP_ENTRY(0x83, my_trap_handler)
364 TRAP_ENTRY(0x84, my_trap_handler)
365 TRAP_ENTRY(0x85, my_trap_handler)
366 TRAP_ENTRY(0x86, my_trap_handler)
367 TRAP_ENTRY(0x87, my_trap_handler)
368 TRAP_ENTRY(0x88, my_trap_handler)
369 TRAP_ENTRY(0x89, my_trap_handler)
370 TRAP_ENTRY(0x8a, my_trap_handler)
371 TRAP_ENTRY(0x8b, my_trap_handler)
372 TRAP_ENTRY(0x8c, my_trap_handler)
373 TRAP_ENTRY(0x8d, my_trap_handler)
374 TRAP_ENTRY(0x8e, my_trap_handler)
375 TRAP_ENTRY(0x8f, my_trap_handler)
376 TRAP_ENTRY(0x90, my_trap_handler)
377 TRAP_ENTRY(0x91, my_trap_handler)
378 TRAP_ENTRY(0x92, my_trap_handler)
379 TRAP_ENTRY(0x93, my_trap_handler)
380 TRAP_ENTRY(0x94, my_trap_handler)
381 TRAP_ENTRY(0x95, my_trap_handler)
382 TRAP_ENTRY(0x96, my_trap_handler)
383 TRAP_ENTRY(0x97, my_trap_handler)
384 TRAP_ENTRY(0x98, my_trap_handler)
385 TRAP_ENTRY(0x99, my_trap_handler)
386 TRAP_ENTRY(0x9a, my_trap_handler)
387 TRAP_ENTRY(0x9b, my_trap_handler)
388 TRAP_ENTRY(0x9c, my_trap_handler)
389 TRAP_ENTRY(0x9d, my_trap_handler)
390 TRAP_ENTRY(0x9e, my_trap_handler)
391 TRAP_ENTRY(0x9f, my_trap_handler)
392 TRAP_ENTRY(0xa0, my_trap_handler)
393 TRAP_ENTRY(0xa1, my_trap_handler)
394 TRAP_ENTRY(0xa2, my_trap_handler)
395 TRAP_ENTRY(0xa3, my_trap_handler)
396 TRAP_ENTRY(0xa4, my_trap_handler)
397 TRAP_ENTRY(0xa5, my_trap_handler)
398 TRAP_ENTRY(0xa6, my_trap_handler)
399 TRAP_ENTRY(0xa7, my_trap_handler)
400 TRAP_ENTRY(0xa8, my_trap_handler)
401 TRAP_ENTRY(0xa9, my_trap_handler)
402 TRAP_ENTRY(0xaa, my_trap_handler)
403 TRAP_ENTRY(0xab, my_trap_handler)
404 TRAP_ENTRY(0xac, my_trap_handler)
405 TRAP_ENTRY(0xad, my_trap_handler)
406 TRAP_ENTRY(0xae, my_trap_handler)
407 TRAP_ENTRY(0xaf, my_trap_handler)
408 TRAP_ENTRY(0xb0, my_trap_handler)
409 TRAP_ENTRY(0xb1, my_trap_handler)
410 TRAP_ENTRY(0xb2, my_trap_handler)
411 TRAP_ENTRY(0xb3, my_trap_handler)
412 TRAP_ENTRY(0xb4, my_trap_handler)
413 TRAP_ENTRY(0xb5, my_trap_handler)
414 TRAP_ENTRY(0xb6, my_trap_handler)
415 TRAP_ENTRY(0xb7, my_trap_handler)
416 TRAP_ENTRY(0xb8, my_trap_handler)
417 TRAP_ENTRY(0xb9, my_trap_handler)
418 TRAP_ENTRY(0xba, my_trap_handler)
419 TRAP_ENTRY(0xbb, my_trap_handler)
420 TRAP_ENTRY(0xbc, my_trap_handler)
421 TRAP_ENTRY(0xbd, my_trap_handler)
422 TRAP_ENTRY(0xbe, my_trap_handler)
423 TRAP_ENTRY(0xbf, my_trap_handler)
424 TRAP_ENTRY(0xc0, my_trap_handler)
425 TRAP_ENTRY(0xc1, my_trap_handler)
426 TRAP_ENTRY(0xc2, my_trap_handler)
427 TRAP_ENTRY(0xc3, my_trap_handler)
428 TRAP_ENTRY(0xc4, my_trap_handler)
429 TRAP_ENTRY(0xc5, my_trap_handler)
430 TRAP_ENTRY(0xc6, my_trap_handler)
431 TRAP_ENTRY(0xc7, my_trap_handler)
432 TRAP_ENTRY(0xc8, my_trap_handler)
433 TRAP_ENTRY(0xc9, my_trap_handler)
434 TRAP_ENTRY(0xca, my_trap_handler)
435 TRAP_ENTRY(0xcb, my_trap_handler)
436 TRAP_ENTRY(0xcc, my_trap_handler)
437 TRAP_ENTRY(0xcd, my_trap_handler)
438 TRAP_ENTRY(0xce, my_trap_handler)
439 TRAP_ENTRY(0xcf, my_trap_handler)
440 TRAP_ENTRY(0xd0, my_trap_handler)
441 TRAP_ENTRY(0xd1, my_trap_handler)
442 TRAP_ENTRY(0xd2, my_trap_handler)
443 TRAP_ENTRY(0xd3, my_trap_handler)
444 TRAP_ENTRY(0xd4, my_trap_handler)
445 TRAP_ENTRY(0xd5, my_trap_handler)
446 TRAP_ENTRY(0xd6, my_trap_handler)
447 TRAP_ENTRY(0xd7, my_trap_handler)
448 TRAP_ENTRY(0xd8, my_trap_handler)
449 TRAP_ENTRY(0xd9, my_trap_handler)
450 TRAP_ENTRY(0xda, my_trap_handler)
451 TRAP_ENTRY(0xdb, my_trap_handler)
452 TRAP_ENTRY(0xdc, my_trap_handler)
453 TRAP_ENTRY(0xdd, my_trap_handler)
454 TRAP_ENTRY(0xde, my_trap_handler)
455 TRAP_ENTRY(0xdf, my_trap_handler)
456 TRAP_ENTRY(0xe0, my_trap_handler)
457 TRAP_ENTRY(0xe1, my_trap_handler)
458 TRAP_ENTRY(0xe2, my_trap_handler)
459 TRAP_ENTRY(0xe3, my_trap_handler)
460 TRAP_ENTRY(0xe4, my_trap_handler)
461 TRAP_ENTRY(0xe5, my_trap_handler)
462 TRAP_ENTRY(0xe6, my_trap_handler)
463 TRAP_ENTRY(0xe7, my_trap_handler)
464 TRAP_ENTRY(0xe8, my_trap_handler)
465 TRAP_ENTRY(0xe9, my_trap_handler)
466 TRAP_ENTRY(0xea, my_trap_handler)
467 TRAP_ENTRY(0xeb, my_trap_handler)
468 TRAP_ENTRY(0xec, my_trap_handler)
469 TRAP_ENTRY(0xed, my_trap_handler)
470 TRAP_ENTRY(0xee, my_trap_handler)
471 TRAP_ENTRY(0xef, my_trap_handler)
472 TRAP_ENTRY(0xf0, my_trap_handler)
473 TRAP_ENTRY(0xf1, my_trap_handler)
474 TRAP_ENTRY(0xf2, my_trap_handler)
475 TRAP_ENTRY(0xf3, my_trap_handler)
476 TRAP_ENTRY(0xf4, my_trap_handler)
477 TRAP_ENTRY(0xf5, my_trap_handler)
478 TRAP_ENTRY(0xf6, my_trap_handler)
479 TRAP_ENTRY(0xf7, my_trap_handler)
480 TRAP_ENTRY(0xf8, my_trap_handler)
481 TRAP_ENTRY(0xf9, my_trap_handler)
482 TRAP_ENTRY(0xfa, my_trap_handler)
483 TRAP_ENTRY(0xfb, my_trap_handler)
484 TRAP_ENTRY(0xfc, my_trap_handler)
485 TRAP_ENTRY(0xfd, my_trap_handler)
486 TRAP_ENTRY(0xfe, my_trap_handler)
487 TRAP_ENTRY(0xff, my_trap_handler)
488
489 _msgbufmapped:
490 .word 1
491
492
493
494
495
496
497
498
499 gokernel: or %g0, %o0, %g7
500 st %o0, [_prom_vector_p] ! we will need it later
501 rd %psr, %l2
502 rd %wim, %l3
503 rd %tbr, %l4
504 or %g0, %o2, %l5 ! could be prom magic value...
505
506 #if 0
507 subcc %l5, 0x0, %g0 ! check for magic SMP pointer
508 bne nosmp
509 nop
510 call %o2 ! call smp prom setup
511 nop
512 #endif
513
514
515
516
517
518 nosmp: sethi %hi(_boot_psr), %l1
519 st %l2, [%l1 + %lo(_boot_psr)]
520 sethi %hi(_boot_wim), %l1
521 st %l3, [%l1 + %lo(_boot_wim)]
522 sethi %hi(_boot_tbr), %l1
523 st %l4, [%l1 + %lo(_boot_tbr)]
524 sethi %hi(_boot_smp_ptr), %l1
525 st %l5, [%l1 + %lo(_boot_smp_ptr)]
526
527 or %g0, %o0, %g7
528 sethi %hi(_prom_vector_p), %g5
529 st %o0, [%g5 + %lo(_prom_vector_p)] ! we will need it later
530
531 ld [%g7 + 0x4], %o3
532 subcc %o3, 0x2, %g0 ! a v2 prom?
533 be found_v2
534 nop
535
536
537
538
539
540
541
542 sethi %hi(LOAD_ADDR), %g6
543 subcc %o0, %g6, %g0 ! an old sun4?
544 be no_sun4_here
545 nop
546
547 sethi %hi(_prom_iface_vers), %g1
548 st %g0, [%g1 + %lo(_prom_iface_vers)]
549 b not_v2
550 nop
551
552 found_v2:
553 or %g0, 0x2, %o5
554 sethi %hi(_prom_iface_vers), %g1
555 st %o5, [%g1 + %lo(_prom_iface_vers)]
556
557 not_v2:
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573 or %g0, %g7, %l1
574 add %l1, 0x1c, %l1
575 ld [%l1], %l0
576 ld [%l0], %l0
577 call %l0
578 or %g0, %g0, %o0 ! next_node(0) = first_node
579
580 sethi %hi(_cputypvar), %o1 ! first node has cpu-arch
581 or %o1, %lo(_cputypvar), %o1
582 sethi %hi(_cputypval), %o2 ! information, the string
583 or %o2, %lo(_cputypval), %o2
584 ld [%l1], %l0 ! 'compatibility' tells
585 ld [%l0 + 0xc], %l0 ! that we want 'sun4x' where
586 call %l0 ! x is one of '', 'c', 'm',
587 nop ! 'd' or 'e'. %o2 holds pointer
588 ! to a buf where above string
589 ! will get stored by the prom.
590
591 sethi %hi(_cputypval), %o2 ! better safe than sorry
592 or %o2, %lo(_cputypval), %o2
593 ldub [%o2 + 0x4], %o0
594 subcc %o0, 'c', %g0 ! we already know we are not
595 be is_sun4c ! on a plain sun4 because of
596 nop ! the check for 0x4000 in %o0
597 subcc %o0, 'm', %g0 ! at start:
598 be is_sun4m
599 nop
600 b no_sun4d_here ! god bless the person who
601 nop ! tried to run this on sun4d
602
603 is_sun4m:
604 is_sun4c: ! OK, this is a sun4c, yippie
605 or %g0, %g7, %g6 ! load up the promvec offsets
606 sethi %hi(prom_magic), %g5 ! magic mushroom :>
607 st %g6, [%g5 + %lo(prom_magic)]
608 add %g7, 0x4, %g6
609 sethi %hi(prom_rom_vers), %g5
610 st %g6, [%g5 + %lo(prom_rom_vers)]
611 add %g7, 0x8, %g6
612 sethi %hi(prom_pluginvers), %g5
613 st %g6, [%g5 + %lo(prom_pluginvers)]
614 add %g7, 0xc, %g6
615 sethi %hi(prom_revision), %g5
616 st %g6, [%g5 + %lo(prom_revision)]
617 add %g7, 0x10, %g6
618 sethi %hi(prom_v0mem_desc), %g5
619 st %g6, [%g5 + %lo(prom_v0mem_desc)]
620 add %g7, 0x1c, %g6
621 sethi %hi(prom_nodefuncs), %g5
622 st %g6, [%g5 + %lo(prom_nodefuncs)]
623 add %g7, 0x68, %g6
624 sethi %hi(prom_printf), %g5
625 st %g6, [%g5 + %lo(prom_printf)]
626 add %g7, 0x6c, %g6
627 sethi %hi(prom_abort), %g5
628 st %g6, [%g5 + %lo(prom_abort)]
629 add %g7, 0x74, %g6
630 sethi %hi(prom_halt), %g5
631 st %g6, [%g5 + %lo(prom_halt)]
632 add %g7, 0x78, %g6
633 sethi %hi(prom_sync), %g5
634 st %g6, [%g5 + %lo(prom_sync)]
635 add %g7, 0x7c, %g6
636 sethi %hi(prom_eval), %g5
637 st %g6, [%g5 + %lo(prom_eval)]
638 add %g7, 0x80, %g6
639 sethi %hi(prom_v0bootline), %g6
640 st %g6, [%g5 + %lo(prom_v0bootline)]
641
642
643
644
645
646
647
648
649 sethi %hi(boot_msg), %o0
650 or %o0, %lo(boot_msg), %o0
651 sethi %hi(prom_printf), %o1
652 ld [%o1 + %lo(prom_printf)], %o1
653 ld [%o1], %o1
654 call %o1 ! print boot message #1
655 nop
656
657 _newline: sethi %hi(newline), %o0
658 or %o0, %lo(newline), %o0
659 sethi %hi(prom_printf), %o1
660 ld [%o1 + %lo(prom_printf)], %o1
661 ld [%o1], %o1
662 call %o1
663 nop
664
665 sethi %hi(pstring1), %o0
666 or %o0, %lo(pstring1), %o0
667 sethi %hi(prom_printf), %o2
668 ld [%o2 + %lo(prom_printf)], %o2
669 ld [%o2], %o2
670 sethi %hi(prom_magic), %o1
671 ld [%o1 + %lo(prom_magic)], %o1
672 ld [%o1], %o1
673 call %o2
674
675 sethi %hi(pstring2), %o0
676 or %o0, %lo(pstring2), %o0
677 sethi %hi(prom_printf), %o2
678 ld [%o2 + %lo(prom_printf)], %o2
679 ld [%o2], %o2
680 sethi %hi(_prom_iface_vers), %o1
681 ld [%o1 + %lo(_prom_iface_vers)], %o1
682 ld [%o1], %o1
683 call %o2
684
685 b halt_me
686 nop
687
688 no_sun4_here:
689 ld [%g7 + 0x68], %o1
690 set sun4_notsup, %o0
691 call %o1
692 nop
693
694 rest_of_boot:
695 or %g0, PAGE_SHIFT, %g5
696
697 sethi %hi(AC_CONTEXT), %g1 ! kernel context, safe now
698 ! the only valid context
699 ! until we call paging_init()
700 stba %g0, [%g1] ASI_CONTROL
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715 #if 0
716 sethi %hi(IE_reg_addr), %l0
717 or %l0, %lo(IE_reg_addr), %l0
718 sethi %hi(INT_ENABLE_REG_PHYSADR), %l2
719 or %l2, %lo(INT_ENABLE_REG_PHYSADR), %l2
720 srl %l2, %g5, %l1
721
722 sta %l1, [%l0] ASI_PTE
723 mov INTS_ALL_ENAB, %l1
724 stb %l1, [%l0]
725 #endif
726
727
728
729
730
731 sethi %hi(1f), %g1
732 or %g1, %lo(1f), %g1
733 jmp %g1
734 nop
735
736 .align 4
737 1: sethi %hi(_cputyp), %o0
738 st %g4, [%o0 + %lo(_cputyp)]
739
740 sethi %hi(_pgshift), %o0
741 st %g5, [%o0 + %lo(_pgshift)]
742
743 mov 1, %o0
744 sll %o0, %g5, %g5
745 sethi %hi(_nbpg), %o0
746 st %g5, [%o0 + %lo(_nbpg)]
747
748 sub %g5, 1, %g5
749 sethi %hi(_pgofset), %o0
750 st %g5, [%o0 + %lo(_pgofset)]
751
752
753 rd %psr, %g3
754 andn %g3, PSR_ET, %g3
755 wr %g3, 0x0, %psr ! make sure traps are off
756 ! before we play around
757 WRITE_PAUSE ! no guarantees until 3 insns
758
759
760 wr %g0, 0x0, %wim ! magical invalid window reg
761 WRITE_PAUSE ! see above
762
763
764
765
766
767
768
769
770
771
772 wr %g0, (0xfc0), %psr
773 WRITE_PAUSE
774
775 wr %g0, 0x2, %wim ! window 1 invalid
776 WRITE_PAUSE
777 or %g0, 0x1, %g1
778 sethi %hi(_current + THREAD_WIM), %g2
779 st %g1, [%g2 + %lo(_current + THREAD_WIM)]
780
781
782
783 set USRSTACK - C_STACK, %fp
784 set estack0 - C_STACK - 80, %sp
785 rd %psr, %l0
786 wr %l0, PSR_ET, %psr
787 WRITE_PAUSE
788
789
790
791
792
793
794
795 set _edata, %o0
796 set _end, %o1
797 sub %o1, %o0, %g2
798 sethi %hi(_kernel_bss_len), %g3
799 st %g2, [%g3 + %lo(_kernel_bss_len)]
800 sethi %hi(_trapbase), %g3
801 or %g3, %lo(_trapbase), %g3
802 sethi %hi(_etext), %g4
803 or %g4, %lo(_etext), %g4
804 sub %g4, %g3, %g2
805 sethi %hi(_kernel_text_len), %g3
806 st %g2, [%g3 + %lo(_kernel_text_len)]
807 sethi %hi(_etext), %g4
808 or %g4, %lo(_etext), %g4
809 sethi %hi(_edata), %g3
810 or %g3, %lo(_edata), %g3
811 sub %g3, %g4, %g2
812 sethi %hi(_kernel_data_len), %g3
813 st %g2, [%g3 + %lo(_kernel_data_len)]
814 or %g0, %g0, %g1
815
816 1:
817 st %g0, [%o0]
818 add %o0, 0x4, %o0
819 subcc %o0, %o1, %g0
820 bl 1b
821 nop
822
823
824
825
826
827 sethi %hi(0xffffffff), %g1
828 rd %wim, %g2 ! save current value
829 or %g1, %lo(0xffffffff), %g1
830 wr %g1, 0x0, %wim
831 rd %wim, %g1 ! get remaining mask
832 wr %g2, 0x0, %wim ! restore old value
833 WRITE_PAUSE
834
835 or %g0, 0x0, %g3
836
837 1: srl %g1, 0x1, %g1 ! shift until highest
838 subcc %g1, 0x0, %g0 ! bit set
839 bne 1b
840 add %g3, 0x1, %g3
841 sethi %hi(_nwindows), %g4
842 st %g3, [%g4 + %lo(_nwindows)] ! store final value
843 sub %g3, 0x1, %g3
844 sethi %hi(_nwindowsm1), %g4
845 st %g3, [%g4 + %lo(_nwindowsm1)]
846
847
848
849
850
851
852
853
854
855
856 #if 0
857 sethi %hi(prom_v0bootline), %g6
858 ld [%g6 + %lo(prom_v0bootline)], %g6
859 ld [%g6], %g6
860 ld [%g6], %g6
861 sethi %hi(_empty_zero_page + 2048), %g2
862 ld [%g2 + %lo(_empty_zero_page + 2048)], %g2
863 ld [%g6], %g3 ! argv[0]
864 or %g0, 0x8, %g1 ! argv counter
865 1: ld [%g3], %g4
866 st %g4, [%g2]
867 add %g3, 0x4, %g3
868 cmp %g4, 0
869 bne,a 1b
870 add %g2, 0x4, %g2
871
872 or %g0, %lo(' '), %g4
873 st %g4, [%g2]
874 sub %g1, 0x1, %g1
875 add %g3, 0x4, %g3
876 cmp %g1, 0
877 bne 1b
878 add %g2, 0x4, %g2
879 #endif
880
881 sethi %hi(_prom_vector_p), %g5
882 ld [%g5 + %lo(_prom_vector_p)], %o0
883 call _start_kernel
884 nop
885
886 call halt_me
887 nop
888
889
890
891 no_sun4d_here:
892 ld [%g7 + 0x68], %o1
893 set sun4d_notsup, %o0
894 call %o1
895 nop
896 b halt_me
897 nop
898
899 halt_me:
900 ld [%g7 + 0x74], %o0
901 call %o0 ! get us out of here...
902 nop ! apparently solaris is better
903
904 .data
905 .align 4
906
907
908
909
910
911
912
913 .globl _prom_vector_p
914
915 _prom_vector_p: .skip 4
916 prom_magic: .skip 4 ! magic mushroom, beware...
917 prom_rom_vers: .skip 4 ! interface version (v0 or v2)
918 prom_pluginvers: .skip 4 ! XXX help help help ???
919 prom_revision: .skip 4 ! PROM revision (ie. 1.4)
920 prom_halt: .skip 4 ! void halt(void) solaris friend
921 prom_eval: .skip 4 ! void eval(int len, char* string)
922 prom_v0bootline: .skip 4 ! boot command line
923 prom_v0mem_desc: .skip 4 ! V0 memory descriptor list ptr.
924 prom_nodefuncs: .skip 4 ! Magical Node functions
925 prom_printf: .skip 4 ! minimal printf()
926
927
928
929
930
931
932 prom_abort: .skip 4 ! L1-A magic cookie
933 ! must be mapped in ALL contexts
934
935
936
937
938
939
940
941
942 prom_sync: .skip 4 ! hook in prom for sync func
943
944 .align 4
945
946
947
948
949
950 .globl _nwindows
951 .globl _nwindowsm1
952 _nwindows: .skip 4
953 _nwindowsm1: .skip 4
954
955 .align 4
956
957
958 .globl _boot_wim
959 .globl _boot_psr
960 .globl _boot_tbr
961 .globl _boot_smp_ptr
962 _boot_wim: .skip 4
963 _boot_psr: .skip 4
964 _boot_tbr: .skip 4
965 _boot_smp_ptr: .skip 4
966
967