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