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