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 gokernel: mov %o0, %g7
498 st %o0, [_prom_vector_p] ! we will need it later
499 rd %psr, %l2
500 rd %wim, %l3
501 rd %tbr, %l4
502 or %g0, %o2, %l5 ! could be prom magic value...
503
504 #if 0
505 cmp %l5, 0x0 ! check for magic SMP pointer
506 bne nosmp
507 nop
508 call %o2 ! call smp prom setup
509 nop
510 #endif
511
512
513
514
515
516 nosmp: sethi %hi(_boot_psr), %l1
517 st %l2, [%l1 + %lo(_boot_psr)]
518 sethi %hi(_boot_wim), %l1
519 st %l3, [%l1 + %lo(_boot_wim)]
520 sethi %hi(_boot_tbr), %l1
521 st %l4, [%l1 + %lo(_boot_tbr)]
522 sethi %hi(_boot_o_two), %l1
523 st %l5, [%l1 + %lo(_boot_smp_ptr)]
524
525 mov %o0, %g7
526 sethi %hi(_prom_vector_p), %g5
527 st %o0, [%g5 + %lo(_prom_vector_p)] ! we will need it later
528
529 ld [%g7 + 0x4], %o3
530 cmp %o3, 2 ! a v2 prom?
531 be found_v2
532 nop
533
534
535
536
537
538
539
540 sethi %hi(LOAD_ADDR), %g6
541 cmp %o0, %g6 ! an old sun4?
542 beq no_sun4_here
543 nop
544
545 st %g0, [_prom_iface_vers]
546 b not_v2
547 nop
548
549 found_v2:
550 or %%g0, 0x2, %o5
551 st %o5, [_prom_iface_vers]
552
553 not_v2:
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569 or %g0, %g7, %l1
570 add %l1, 0x1c, %l1
571 ld [%l1], %l0
572 ld [%l0], %l0
573 call %l0
574 or %g0, %g0, %o0 ! next_node(0) = first_node
575
576 set _cputypvar, %o1 ! first node has cpu-arch
577 set _cputypval, %o2 ! information, the string
578 ld [%l1], %l0 ! 'compatibility' tells
579 ld [%l0 + 0x0c], %l0 ! that we want 'sun4x' where
580 call %l0 ! x is one of '', 'c', 'm',
581 nop ! 'd' or 'e'. %o2 holds pointer
582 ! to a buf where above string
583 ! will get stored by the prom.
584
585 set _cputypval, %o2 ! better safe than sorry
586 ldub [%o2 + 4], %o0
587 cmp %o0, 'c' ! we already know we are not
588 beq is_sun4c ! on a plain sun4 because of
589 nop ! the check for 0x4000 in %o0
590 cmp %o0, 'm' ! at start:
591 beq is_sun4m
592 nop
593 b no_sun4d_here ! god bless the person who
594 nop ! tried to run this on sun4d
595
596 is_sun4m:
597 is_sun4c: ! OK, this is a sun4c, yippie
598 mov %g7, %g6 ! load up the promvec offsets
599 sethi %hi(prom_magic), %g5 ! magic mushroom :>
600 st %g6, [%g5 + %lo(prom_magic)]
601 add %g7, 0x4, %g6
602 sethi %hi(prom_rom_vers), %g5
603 st %g6, [%g5 + %lo(prom_rom_vers)]
604 add %g7, 0x8, %g6
605 sethi %hi(prom_pluginvers), %g5
606 st %g6, [%g5 + %lo(prom_pluginvers)]
607 add %g7, 0xc, %g6
608 sethi %hi(prom_revision), %g5
609 st %g6, [%g5 + %lo(prom_revision)]
610 add %g7, 0x10, %g6
611 sethi %hi(prom_v0mem_desc), %g5
612 st %g6, [%g5 + %lo(prom_v0mem_desc)]
613 add %g7, 0x1c, %g6
614 sethi %hi(prom_nodefuncs), %g5
615 st %g6, [%g5 + %lo(prom_nodefuncs)]
616 add %g7, 0x68, %g6
617 sethi %hi(prom_printf), %g5
618 st %g6, [%g5 + %lo(prom_printf)]
619 add %g7, 0x6c, %g6
620 sethi %hi(prom_abort), %g5
621 st %g6, [%g5 + %lo(prom_abort)]
622 add %g7, 0x74, %g6
623 sethi %hi(prom_halt), %g5
624 st %g6, [%g5 + %lo(prom_halt)]
625 add %g7, 0x78, %g6
626 sethi %hi(prom_sync), %g5
627 st %g6, [%g5 + %lo(prom_sync)]
628 add %g7, 0x7c, %g6
629 sethi %hi(prom_eval), %g5
630 st %g6, [%g5 + %lo(prom_eval)]
631 add %g7, 0x80, %g6
632 sethi %hi(prom_v0bootline), %g6
633 st %g6, [%g5 + %lo(prom_v0bootline)]
634
635
636
637
638
639
640
641
642 set boot_msg, %o0
643 ld [prom_printf], %o1
644 ld [%o1], %o1
645 call %o1 ! print boot message #1
646 nop
647
648 _newline: set newline, %o0
649 ld [prom_printf], %o1
650 ld [%o1], %o1
651 call %o1
652 nop
653
654 set pstring1, %o0
655 ld [prom_printf], %o2
656 ld [%o2], %o2
657 ld [prom_magic], %o1
658 ld [%o1], %o1
659 call %o2
660
661 set pstring2, %o0
662 ld [prom_printf], %o2
663 ld [%o2], %o2
664 ld [_prom_iface_vers], %o1
665 ld [%o1], %o1
666 call %o2
667
668 b halt_me
669 nop
670
671 no_sun4_here:
672 ld [%g7 + 0x68], %o1
673 set sun4_notsup, %o0
674 call %o1
675 nop
676
677 rest_of_boot:
678 mov PAGESHIFT_SUN4C, %g5
679
680 set AC_CONTEXT, %g1 ! kernel context, safe now
681 ! the only valid context
682 ! until we call paging_init()
683 stba %g0, [%g1] ASI_CONTROL
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698 #if 0
699 sethi %hi(IE_reg_addr), %l0
700 or %l0, %lo(IE_reg_addr), %l0
701 sethi %hi(INT_ENABLE_REG_PHYSADR), %l2
702 or %l2, %lo(INT_ENABLE_REG_PHYSADR), %l2
703 srl %l2, %g5, %l1
704
705 sta %l1, [%l0] ASI_PTE
706 mov INTS_ALL_ENAB, %l1
707 stb %l1, [%l0]
708 #endif
709
710
711
712
713
714 set 1f, %g1
715 jmp %g1
716 nop
717
718 .align 4
719 1: sethi %hi(_cputyp), %o0
720 st %g4, [%o0 + %lo(_cputyp)]
721
722 sethi %hi(_pgshift), %o0
723 st %g5, [%o0 + %lo(_pgshift)]
724
725 mov 1, %o0
726 sll %o0, %g5, %g5
727 sethi %hi(_nbpg), %o0
728 st %g5, [%o0 + %lo(_nbpg)]
729
730 sub %g5, 1, %g5
731 sethi %hi(_pgofset), %o0
732 st %g5, [%o0 + %lo(_pgofset)]
733
734
735 rd %psr, %g3
736 andn %g3, PSR_ET, %g3
737 wr %g3, 0, %psr ! make sure traps are off
738 ! before we play around
739 WRITE_PAUSE ! no guarentees until 3 insns
740
741
742 wr %g0, 0, %wim ! magical invalid window reg
743 WRITE_PAUSE ! see above
744
745
746
747
748
749 wr %g0, (PSR_S | PSR_PS | PSR_PIL), %psr
750 WRITE_PAUSE
751
752 wr %g0, 2, %wim ! window 1 invalid
753 WRITE_PAUSE
754 mov 1, %g1
755 sethi %hi(_task + PCB_WIM), %g2
756 st %g1, [%g2 + %lo(_task + PCB_WIM)]
757
758
759
760 set USRSTACK - C_STACK, %fp
761 set estack0 - C_STACK - 80, %sp
762 rd %psr, %l0
763 wr %l0, PSR_ET, %psr
764 WRITE_PAUSE
765
766
767
768
769
770
771
772 set _edata, %o0
773 set _end, %o1
774 sub %o1, %o0, %g2
775 sethi %hi(_kernel_bss_len), %g3
776 st %g2, [%g3 + %lo(_kernel_bss_len)]
777 sethi %hi(_trapbase), %g3
778 or %g3, %lo(_trapbase), %g3
779 sethi %hi(_etext), %g4
780 or %g4, %lo(_etext), %g4
781 sub %g4, %g3, %g2
782 sethi %hi(_kernel_text_len), %g3
783 st %g2, [%g3 + %lo(_kernel_text_len)]
784 sethi %hi(_etext), %g4
785 or %g4, %lo(_etext), %g4
786 sethi %hi(_edata), %g3
787 or %g3, %lo(_edata), %g3
788 sub %g3, %g4, %g2
789 sethi %hi(_kernel_data_len), %g3
790 st %g2, [%g3 + %lo(_kernel_data_len)]
791 clr %g1
792
793 1:
794 st %g0, [%o0]
795 add %o0, 0x4, %o0
796 cmp %o0, %o1
797 bl 1b
798 nop
799
800
801
802
803
804 sethi %hi(0xffffffff), %g1
805 rd %wim, %g2 ! save current value
806 or %g1, %lo(0xffffffff), %g1
807 wr %g1, 0x0, %wim
808 rd %wim, %g1 ! get remaining mask
809 wr %g2, 0x0, %wim ! restore old value
810 WRITE_PAUSE
811
812 or %g0, 0x0, %g3
813
814 1: srl %g1, 0x1, %g1 ! shift until highest
815 cmp %g1, 0x0 ! bit set
816 bne 1b
817 add %g3, 0x1, %g3
818 sethi %hi(_nwindows), %g4
819 st %g3, [%g4 + %lo(_nwindows)] ! store final value
820 sub %g3, 0x1, %g3
821 sethi %hi(_nwindowsm1), %g4
822 st %g3, [%g4 + %lo(_nwindowsm1)]
823
824
825
826
827
828
829
830
831
832
833 #if 0
834 sethi %hi(prom_v0bootline), %g6
835 ld [%g6 + %lo(prom_v0bootline)], %g6
836 ld [%g6], %g6
837 ld [%g6], %g6
838 sethi %hi(_empty_zero_page + 2048), %g2
839 ld [%g2 + %lo(_empty_zero_page + 2048)], %g2
840 ld [%g6], %g3 ! argv[0]
841 or %g0, 0x8, %g1 ! argv counter
842 1: ld [%g3], %g4
843 st %g4, [%g2]
844 add %g3, 0x4, %g3
845 cmp %g4, 0
846 bne,a 1b
847 add %g2, 0x4, %g2
848
849 or %g0, %lo(' '), %g4
850 st %g4, [%g2]
851 sub %g1, 0x1, %g1
852 add %g3, 0x4, %g3
853 cmp %g1, 0
854 bne 1b
855 add %g2, 0x4, %g2
856 #endif
857
858 sethi %hi(_prom_vector_p), %g5
859 ld [%g5 + %lo(_prom_vector_p)], %o0
860 call _start_kernel
861 nop
862
863 call halt_me
864 nop
865
866
867
868 no_sun4d_here:
869 ld [%g7 + 0x68], %o1
870 set sun4d_notsup, %o0
871 call %o1
872 nop
873 b halt_me
874 nop
875
876 halt_me:
877 ld [%g7 + 0x74], %o0
878 call %o0 ! get us out of here...
879 nop ! apparently solaris is better
880
881 .data
882 .align 4
883
884
885
886
887
888
889
890 .globl _prom_vector_p
891
892 _prom_vector_p: .skip 4
893 prom_magic: .skip 4 ! magic mushroom, beware...
894 prom_rom_vers: .skip 4 ! interface version (v0 or v2)
895 prom_pluginvers: .skip 4 ! XXX help help help ???
896 prom_revision: .skip 4 ! PROM revision (ie. 1.4)
897 prom_halt: .skip 4 ! void halt(void) solaris friend
898 prom_eval: .skip 4 ! void eval(int len, char* string)
899 prom_v0bootline: .skip 4 ! boot command line
900 prom_v0mem_desc: .skip 4 ! V0 memory descriptor list ptr.
901 prom_nodefuncs: .skip 4 ! Magical Node functions
902 prom_printf: .skip 4 ! minimal printf()
903
904
905
906
907
908
909 prom_abort: .skip 4 ! "L1-A" magic cookie
910 ! must be mapped in ALL contexts
911
912
913
914
915
916
917
918
919 prom_sync: .skip 4 ! hook in prom for "sync" func
920
921 .align 4
922
923
924
925
926
927 .globl _nwindows
928 .globl _nwindowsm1
929 _nwindows: .skip 4
930 _nwindowsm1: .skip 4
931
932 .align 4
933
934
935 .globl _boot_wim
936 .globl _boot_psr
937 .globl _boot_tbr
938 .globl _boot_o_two
939 _boot_wim: .skip 4
940 _boot_psr: .skip 4
941 _boot_tbr: .skip 4
942 _boot_smp_ptr: .skip 4
943