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