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#include <linux/init.h>
35#include <asm/processor.h>
36#include <asm/page.h>
37#include <asm/mmu.h>
38#include <asm/pgtable.h>
39#include <asm/cputable.h>
40#include <asm/thread_info.h>
41#include <asm/ppc_asm.h>
42#include <asm/asm-offsets.h>
43#include <asm/ptrace.h>
44
45
46
47
48
49
50
51
52
53
54
55
56
57 __HEAD
58_ENTRY(_stext);
59_ENTRY(_start);
60
61 mr r31,r3
62
63
64
65
66 bl initial_mmu
67
68
69
70
71turn_on_mmu:
72 lis r0,MSR_KERNEL@h
73 ori r0,r0,MSR_KERNEL@l
74 mtspr SPRN_SRR1,r0
75 lis r0,start_here@h
76 ori r0,r0,start_here@l
77 mtspr SPRN_SRR0,r0
78 SYNC
79 rfi
80 b .
81
82
83
84
85
86 . = 0xc0
87crit_save:
88_ENTRY(crit_r10)
89 .space 4
90_ENTRY(crit_r11)
91 .space 4
92_ENTRY(crit_srr0)
93 .space 4
94_ENTRY(crit_srr1)
95 .space 4
96_ENTRY(saved_ksp_limit)
97 .space 4
98
99
100
101
102
103
104
105
106
107#define NORMAL_EXCEPTION_PROLOG \
108 mtspr SPRN_SPRG_SCRATCH0,r10; \
109 mtspr SPRN_SPRG_SCRATCH1,r11; \
110 mtspr SPRN_SPRG_SCRATCH2,r1; \
111 mfcr r10; \
112 mfspr r11,SPRN_SRR1; \
113 andi. r11,r11,MSR_PR; \
114 beq 1f; \
115 mfspr r1,SPRN_SPRG_THREAD; \
116 lwz r1,THREAD_INFO-THREAD(r1); \
117 addi r1,r1,THREAD_SIZE; \
1181: subi r1,r1,INT_FRAME_SIZE; \
119 tophys(r11,r1); \
120 stw r10,_CCR(r11); \
121 stw r12,GPR12(r11); \
122 stw r9,GPR9(r11); \
123 mfspr r10,SPRN_SPRG_SCRATCH0; \
124 stw r10,GPR10(r11); \
125 mfspr r12,SPRN_SPRG_SCRATCH1; \
126 stw r12,GPR11(r11); \
127 mflr r10; \
128 stw r10,_LINK(r11); \
129 mfspr r10,SPRN_SPRG_SCRATCH2; \
130 mfspr r12,SPRN_SRR0; \
131 stw r10,GPR1(r11); \
132 mfspr r9,SPRN_SRR1; \
133 stw r10,0(r11); \
134 rlwinm r9,r9,0,14,12; \
135 stw r0,GPR0(r11); \
136 SAVE_4GPRS(3, r11); \
137 SAVE_2GPRS(7, r11)
138
139
140
141
142
143
144
145
146
147#define CRITICAL_EXCEPTION_PROLOG \
148 stw r10,crit_r10@l(0); \
149 stw r11,crit_r11@l(0); \
150 mfcr r10; \
151 mfspr r11,SPRN_SRR3; \
152 andi. r11,r11,MSR_PR; \
153 lis r11,critirq_ctx@ha; \
154 tophys(r11,r11); \
155 lwz r11,critirq_ctx@l(r11); \
156 beq 1f; \
157 \
158 mfspr r11,SPRN_SPRG_THREAD; \
159 lwz r11,THREAD_INFO-THREAD(r11); \
1601: addi r11,r11,THREAD_SIZE-INT_FRAME_SIZE; \
161 tophys(r11,r11); \
162 stw r10,_CCR(r11); \
163 stw r12,GPR12(r11); \
164 stw r9,GPR9(r11); \
165 mflr r10; \
166 stw r10,_LINK(r11); \
167 mfspr r12,SPRN_DEAR; \
168 stw r12,_DEAR(r11); \
169 mfspr r9,SPRN_ESR; \
170 stw r9,_ESR(r11); \
171 mfspr r12,SPRN_SRR2; \
172 stw r1,GPR1(r11); \
173 mfspr r9,SPRN_SRR3; \
174 stw r1,0(r11); \
175 tovirt(r1,r11); \
176 rlwinm r9,r9,0,14,12; \
177 stw r0,GPR0(r11); \
178 SAVE_4GPRS(3, r11); \
179 SAVE_2GPRS(7, r11)
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197#define START_EXCEPTION(n, label) \
198 . = n; \
199label:
200
201#define EXCEPTION(n, label, hdlr, xfer) \
202 START_EXCEPTION(n, label); \
203 NORMAL_EXCEPTION_PROLOG; \
204 addi r3,r1,STACK_FRAME_OVERHEAD; \
205 xfer(n, hdlr)
206
207#define CRITICAL_EXCEPTION(n, label, hdlr) \
208 START_EXCEPTION(n, label); \
209 CRITICAL_EXCEPTION_PROLOG; \
210 addi r3,r1,STACK_FRAME_OVERHEAD; \
211 EXC_XFER_TEMPLATE(hdlr, n+2, (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
212 NOCOPY, crit_transfer_to_handler, \
213 ret_from_crit_exc)
214
215#define EXC_XFER_TEMPLATE(hdlr, trap, msr, copyee, tfer, ret) \
216 li r10,trap; \
217 stw r10,_TRAP(r11); \
218 lis r10,msr@h; \
219 ori r10,r10,msr@l; \
220 copyee(r10, r9); \
221 bl tfer; \
222 .long hdlr; \
223 .long ret
224
225#define COPY_EE(d, s) rlwimi d,s,0,16,16
226#define NOCOPY(d, s)
227
228#define EXC_XFER_STD(n, hdlr) \
229 EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, NOCOPY, transfer_to_handler_full, \
230 ret_from_except_full)
231
232#define EXC_XFER_LITE(n, hdlr) \
233 EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, NOCOPY, transfer_to_handler, \
234 ret_from_except)
235
236#define EXC_XFER_EE(n, hdlr) \
237 EXC_XFER_TEMPLATE(hdlr, n, MSR_KERNEL, COPY_EE, transfer_to_handler_full, \
238 ret_from_except_full)
239
240#define EXC_XFER_EE_LITE(n, hdlr) \
241 EXC_XFER_TEMPLATE(hdlr, n+1, MSR_KERNEL, COPY_EE, transfer_to_handler, \
242 ret_from_except)
243
244
245
246
247
248 CRITICAL_EXCEPTION(0x0100, CriticalInterrupt, unknown_exception)
249
250
251
252
253 CRITICAL_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
254
255
256
257
258
259
260
261
262 START_EXCEPTION(0x0300, DataStorage)
263 mtspr SPRN_SPRG_SCRATCH0, r10
264 mtspr SPRN_SPRG_SCRATCH1, r11
265#ifdef CONFIG_403GCX
266 stw r12, 0(r0)
267 stw r9, 4(r0)
268 mfcr r11
269 mfspr r12, SPRN_PID
270 stw r11, 8(r0)
271 stw r12, 12(r0)
272#else
273 mtspr SPRN_SPRG_SCRATCH3, r12
274 mtspr SPRN_SPRG_SCRATCH4, r9
275 mfcr r11
276 mfspr r12, SPRN_PID
277 mtspr SPRN_SPRG_SCRATCH6, r11
278 mtspr SPRN_SPRG_SCRATCH5, r12
279#endif
280
281
282
283
284
285 mfspr r10, SPRN_ESR
286 andis. r10, r10, ESR_DIZ@h
287 bne 2f
288
289 mfspr r10, SPRN_DEAR
290
291
292
293
294 lis r11, PAGE_OFFSET@h
295 cmplw r10, r11
296 blt+ 3f
297 lis r11, swapper_pg_dir@h
298 ori r11, r11, swapper_pg_dir@l
299 li r9, 0
300 mtspr SPRN_PID, r9
301 b 4f
302
303
304
3053:
306 mfspr r11,SPRN_SPRG_THREAD
307 lwz r11,PGDIR(r11)
3084:
309 tophys(r11, r11)
310 rlwimi r11, r10, 12, 20, 29
311 lwz r11, 0(r11)
312 rlwinm. r12, r11, 0, 0, 19
313 beq 2f
314
315 rlwimi r12, r10, 22, 20, 29
316 lwz r11, 0(r12)
317
318 andi. r9, r11, _PAGE_RW
319 beq 2f
320
321
322
323 ori r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
324 stw r11, 0(r12)
325
326
327
328
329
330
331
332
333
334 li r12, 0x0ce2
335 andc r11, r11, r12
336
337
338
339 tlbsx r9, 0, r10
340
341 tlbwe r11, r9, TLB_DATA
342
343
344
345#ifdef CONFIG_403GCX
346 lwz r12, 12(r0)
347 lwz r11, 8(r0)
348 mtspr SPRN_PID, r12
349 mtcr r11
350 lwz r9, 4(r0)
351 lwz r12, 0(r0)
352#else
353 mfspr r12, SPRN_SPRG_SCRATCH5
354 mfspr r11, SPRN_SPRG_SCRATCH6
355 mtspr SPRN_PID, r12
356 mtcr r11
357 mfspr r9, SPRN_SPRG_SCRATCH4
358 mfspr r12, SPRN_SPRG_SCRATCH3
359#endif
360 mfspr r11, SPRN_SPRG_SCRATCH1
361 mfspr r10, SPRN_SPRG_SCRATCH0
362 PPC405_ERR77_SYNC
363 rfi
364 b .
365
3662:
367
368
369
370#ifdef CONFIG_403GCX
371 lwz r12, 12(r0)
372 lwz r11, 8(r0)
373 mtspr SPRN_PID, r12
374 mtcr r11
375 lwz r9, 4(r0)
376 lwz r12, 0(r0)
377#else
378 mfspr r12, SPRN_SPRG_SCRATCH5
379 mfspr r11, SPRN_SPRG_SCRATCH6
380 mtspr SPRN_PID, r12
381 mtcr r11
382 mfspr r9, SPRN_SPRG_SCRATCH4
383 mfspr r12, SPRN_SPRG_SCRATCH3
384#endif
385 mfspr r11, SPRN_SPRG_SCRATCH1
386 mfspr r10, SPRN_SPRG_SCRATCH0
387 b DataAccess
388
389
390
391
392
393 START_EXCEPTION(0x0400, InstructionAccess)
394 NORMAL_EXCEPTION_PROLOG
395 mr r4,r12
396 li r5,0
397 EXC_XFER_LITE(0x400, handle_page_fault)
398
399
400 EXCEPTION(0x0500, HardwareInterrupt, do_IRQ, EXC_XFER_LITE)
401
402
403 START_EXCEPTION(0x0600, Alignment)
404 NORMAL_EXCEPTION_PROLOG
405 mfspr r4,SPRN_DEAR
406 stw r4,_DEAR(r11)
407 addi r3,r1,STACK_FRAME_OVERHEAD
408 EXC_XFER_EE(0x600, alignment_exception)
409
410
411 START_EXCEPTION(0x0700, ProgramCheck)
412 NORMAL_EXCEPTION_PROLOG
413 mfspr r4,SPRN_ESR
414 stw r4,_ESR(r11)
415 addi r3,r1,STACK_FRAME_OVERHEAD
416 EXC_XFER_STD(0x700, program_check_exception)
417
418 EXCEPTION(0x0800, Trap_08, unknown_exception, EXC_XFER_EE)
419 EXCEPTION(0x0900, Trap_09, unknown_exception, EXC_XFER_EE)
420 EXCEPTION(0x0A00, Trap_0A, unknown_exception, EXC_XFER_EE)
421 EXCEPTION(0x0B00, Trap_0B, unknown_exception, EXC_XFER_EE)
422
423
424 START_EXCEPTION(0x0C00, SystemCall)
425 NORMAL_EXCEPTION_PROLOG
426 EXC_XFER_EE_LITE(0xc00, DoSyscall)
427
428 EXCEPTION(0x0D00, Trap_0D, unknown_exception, EXC_XFER_EE)
429 EXCEPTION(0x0E00, Trap_0E, unknown_exception, EXC_XFER_EE)
430 EXCEPTION(0x0F00, Trap_0F, unknown_exception, EXC_XFER_EE)
431
432
433 . = 0x1000
434 b Decrementer
435
436
437
438 . = 0x1010
439 b FITException
440
441
442
443 . = 0x1020
444 b WDTException
445
446
447
448
449
450
451 START_EXCEPTION(0x1100, DTLBMiss)
452 mtspr SPRN_SPRG_SCRATCH0, r10
453 mtspr SPRN_SPRG_SCRATCH1, r11
454#ifdef CONFIG_403GCX
455 stw r12, 0(r0)
456 stw r9, 4(r0)
457 mfcr r11
458 mfspr r12, SPRN_PID
459 stw r11, 8(r0)
460 stw r12, 12(r0)
461#else
462 mtspr SPRN_SPRG_SCRATCH3, r12
463 mtspr SPRN_SPRG_SCRATCH4, r9
464 mfcr r11
465 mfspr r12, SPRN_PID
466 mtspr SPRN_SPRG_SCRATCH6, r11
467 mtspr SPRN_SPRG_SCRATCH5, r12
468#endif
469 mfspr r10, SPRN_DEAR
470
471
472
473
474 lis r11, PAGE_OFFSET@h
475 cmplw r10, r11
476 blt+ 3f
477 lis r11, swapper_pg_dir@h
478 ori r11, r11, swapper_pg_dir@l
479 li r9, 0
480 mtspr SPRN_PID, r9
481 b 4f
482
483
484
4853:
486 mfspr r11,SPRN_SPRG_THREAD
487 lwz r11,PGDIR(r11)
4884:
489 tophys(r11, r11)
490 rlwimi r11, r10, 12, 20, 29
491 lwz r12, 0(r11)
492 andi. r9, r12, _PMD_PRESENT
493 beq 2f
494
495 rlwimi r12, r10, 22, 20, 29
496 lwz r11, 0(r12)
497 andi. r9, r11, _PAGE_PRESENT
498 beq 5f
499
500 ori r11, r11, _PAGE_ACCESSED
501 stw r11, 0(r12)
502
503
504
505
506 li r12, 0x00c0
507 rlwimi r10, r12, 0, 20, 31
508
509 b finish_tlb_load
510
5112:
512 rlwinm. r9, r12, 2, 22, 24
513 beq 5f
514
515
516
517
518 ori r9, r9, 0x40
519 rlwimi r10, r9, 0, 20, 31
520 mr r11, r12
521
522 b finish_tlb_load
523
5245:
525
526
527
528#ifdef CONFIG_403GCX
529 lwz r12, 12(r0)
530 lwz r11, 8(r0)
531 mtspr SPRN_PID, r12
532 mtcr r11
533 lwz r9, 4(r0)
534 lwz r12, 0(r0)
535#else
536 mfspr r12, SPRN_SPRG_SCRATCH5
537 mfspr r11, SPRN_SPRG_SCRATCH6
538 mtspr SPRN_PID, r12
539 mtcr r11
540 mfspr r9, SPRN_SPRG_SCRATCH4
541 mfspr r12, SPRN_SPRG_SCRATCH3
542#endif
543 mfspr r11, SPRN_SPRG_SCRATCH1
544 mfspr r10, SPRN_SPRG_SCRATCH0
545 b DataAccess
546
547
548
549
550
551 START_EXCEPTION(0x1200, ITLBMiss)
552 mtspr SPRN_SPRG_SCRATCH0, r10
553 mtspr SPRN_SPRG_SCRATCH1, r11
554#ifdef CONFIG_403GCX
555 stw r12, 0(r0)
556 stw r9, 4(r0)
557 mfcr r11
558 mfspr r12, SPRN_PID
559 stw r11, 8(r0)
560 stw r12, 12(r0)
561#else
562 mtspr SPRN_SPRG_SCRATCH3, r12
563 mtspr SPRN_SPRG_SCRATCH4, r9
564 mfcr r11
565 mfspr r12, SPRN_PID
566 mtspr SPRN_SPRG_SCRATCH6, r11
567 mtspr SPRN_SPRG_SCRATCH5, r12
568#endif
569 mfspr r10, SPRN_SRR0
570
571
572
573
574 lis r11, PAGE_OFFSET@h
575 cmplw r10, r11
576 blt+ 3f
577 lis r11, swapper_pg_dir@h
578 ori r11, r11, swapper_pg_dir@l
579 li r9, 0
580 mtspr SPRN_PID, r9
581 b 4f
582
583
584
5853:
586 mfspr r11,SPRN_SPRG_THREAD
587 lwz r11,PGDIR(r11)
5884:
589 tophys(r11, r11)
590 rlwimi r11, r10, 12, 20, 29
591 lwz r12, 0(r11)
592 andi. r9, r12, _PMD_PRESENT
593 beq 2f
594
595 rlwimi r12, r10, 22, 20, 29
596 lwz r11, 0(r12)
597 andi. r9, r11, _PAGE_PRESENT
598 beq 5f
599
600 ori r11, r11, _PAGE_ACCESSED
601 stw r11, 0(r12)
602
603
604
605
606 li r12, 0x00c0
607 rlwimi r10, r12, 0, 20, 31
608
609 b finish_tlb_load
610
6112:
612 rlwinm. r9, r12, 2, 22, 24
613 beq 5f
614
615
616
617
618 ori r9, r9, 0x40
619 rlwimi r10, r9, 0, 20, 31
620 mr r11, r12
621
622 b finish_tlb_load
623
6245:
625
626
627
628#ifdef CONFIG_403GCX
629 lwz r12, 12(r0)
630 lwz r11, 8(r0)
631 mtspr SPRN_PID, r12
632 mtcr r11
633 lwz r9, 4(r0)
634 lwz r12, 0(r0)
635#else
636 mfspr r12, SPRN_SPRG_SCRATCH5
637 mfspr r11, SPRN_SPRG_SCRATCH6
638 mtspr SPRN_PID, r12
639 mtcr r11
640 mfspr r9, SPRN_SPRG_SCRATCH4
641 mfspr r12, SPRN_SPRG_SCRATCH3
642#endif
643 mfspr r11, SPRN_SPRG_SCRATCH1
644 mfspr r10, SPRN_SPRG_SCRATCH0
645 b InstructionAccess
646
647 EXCEPTION(0x1300, Trap_13, unknown_exception, EXC_XFER_EE)
648 EXCEPTION(0x1400, Trap_14, unknown_exception, EXC_XFER_EE)
649 EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE)
650 EXCEPTION(0x1600, Trap_16, unknown_exception, EXC_XFER_EE)
651#ifdef CONFIG_IBM405_ERR51
652
653 START_EXCEPTION(0x1700, Trap_17)
654 b DTLBMiss
655#else
656 EXCEPTION(0x1700, Trap_17, unknown_exception, EXC_XFER_EE)
657#endif
658 EXCEPTION(0x1800, Trap_18, unknown_exception, EXC_XFER_EE)
659 EXCEPTION(0x1900, Trap_19, unknown_exception, EXC_XFER_EE)
660 EXCEPTION(0x1A00, Trap_1A, unknown_exception, EXC_XFER_EE)
661 EXCEPTION(0x1B00, Trap_1B, unknown_exception, EXC_XFER_EE)
662 EXCEPTION(0x1C00, Trap_1C, unknown_exception, EXC_XFER_EE)
663 EXCEPTION(0x1D00, Trap_1D, unknown_exception, EXC_XFER_EE)
664 EXCEPTION(0x1E00, Trap_1E, unknown_exception, EXC_XFER_EE)
665 EXCEPTION(0x1F00, Trap_1F, unknown_exception, EXC_XFER_EE)
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681 START_EXCEPTION(0x2000, DebugTrap)
682 CRITICAL_EXCEPTION_PROLOG
683
684
685
686
687
688
689
690
691
692 mfspr r10,SPRN_DBSR
693 andis. r10,r10,DBSR_IC@h
694 beq+ 2f
695
696 andi. r10,r9,MSR_IR|MSR_PR
697 beq 1f
698
699 mfspr r10,SPRN_SRR2
700 cmplwi r10,0x2100
701 bgt+ 2f
702
703
7041: rlwinm r9,r9,0,~MSR_DE
705 lis r10,DBSR_IC@h
706 mtspr SPRN_DBSR,r10
707
708 lwz r10,_CCR(r11)
709 lwz r0,GPR0(r11)
710 lwz r1,GPR1(r11)
711 mtcrf 0x80,r10
712 mtspr SPRN_SRR2,r12
713 mtspr SPRN_SRR3,r9
714 lwz r9,GPR9(r11)
715 lwz r12,GPR12(r11)
716 lwz r10,crit_r10@l(0)
717 lwz r11,crit_r11@l(0)
718 PPC405_ERR77_SYNC
719 rfci
720 b .
721
722
7232: mfspr r4,SPRN_DBSR
724 addi r3,r1,STACK_FRAME_OVERHEAD
725 EXC_XFER_TEMPLATE(DebugException, 0x2002, \
726 (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)), \
727 NOCOPY, crit_transfer_to_handler, ret_from_crit_exc)
728
729
730Decrementer:
731 NORMAL_EXCEPTION_PROLOG
732 lis r0,TSR_PIS@h
733 mtspr SPRN_TSR,r0
734 addi r3,r1,STACK_FRAME_OVERHEAD
735 EXC_XFER_LITE(0x1000, timer_interrupt)
736
737
738FITException:
739 NORMAL_EXCEPTION_PROLOG
740 addi r3,r1,STACK_FRAME_OVERHEAD;
741 EXC_XFER_EE(0x1010, unknown_exception)
742
743
744WDTException:
745 CRITICAL_EXCEPTION_PROLOG;
746 addi r3,r1,STACK_FRAME_OVERHEAD;
747 EXC_XFER_TEMPLATE(WatchdogException, 0x1020+2,
748 (MSR_KERNEL & ~(MSR_ME|MSR_DE|MSR_CE)),
749 NOCOPY, crit_transfer_to_handler,
750 ret_from_crit_exc)
751
752
753
754
755
756DataAccess:
757 NORMAL_EXCEPTION_PROLOG
758 mfspr r5,SPRN_ESR
759 stw r5,_ESR(r11)
760 mfspr r4,SPRN_DEAR
761 EXC_XFER_LITE(0x300, handle_page_fault)
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780tlb_4xx_index:
781 .long 0
782finish_tlb_load:
783
784
785 lwz r9, tlb_4xx_index@l(0)
786 addi r9, r9, 1
787 andi. r9, r9, (PPC40X_TLB_SIZE-1)
788 stw r9, tlb_4xx_index@l(0)
789
7906:
791
792
793
794
795
796 li r12, 0x0ce2
797 andc r11, r11, r12
798
799 tlbwe r11, r9, TLB_DATA
800 tlbwe r10, r9, TLB_TAG
801
802
803
804#ifdef CONFIG_403GCX
805 lwz r12, 12(r0)
806 lwz r11, 8(r0)
807 mtspr SPRN_PID, r12
808 mtcr r11
809 lwz r9, 4(r0)
810 lwz r12, 0(r0)
811#else
812 mfspr r12, SPRN_SPRG_SCRATCH5
813 mfspr r11, SPRN_SPRG_SCRATCH6
814 mtspr SPRN_PID, r12
815 mtcr r11
816 mfspr r9, SPRN_SPRG_SCRATCH4
817 mfspr r12, SPRN_SPRG_SCRATCH3
818#endif
819 mfspr r11, SPRN_SPRG_SCRATCH1
820 mfspr r10, SPRN_SPRG_SCRATCH0
821 PPC405_ERR77_SYNC
822 rfi
823 b .
824
825
826
827start_here:
828
829
830 lis r2,init_task@h
831 ori r2,r2,init_task@l
832
833
834 tophys(r4,r2)
835 addi r4,r4,THREAD
836 mtspr SPRN_SPRG_THREAD,r4
837
838
839 lis r1,init_thread_union@ha
840 addi r1,r1,init_thread_union@l
841 li r0,0
842 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
843
844 bl early_init
845
846
847
848
849 li r3,0
850 mr r4,r31
851 bl machine_init
852 bl MMU_init
853
854
855
856
857
858
859 lis r4,2f@h
860 ori r4,r4,2f@l
861 tophys(r4,r4)
862 lis r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@h
863 ori r3,r3,(MSR_KERNEL & ~(MSR_IR|MSR_DR))@l
864 mtspr SPRN_SRR0,r4
865 mtspr SPRN_SRR1,r3
866 rfi
867 b .
868
869
8702:
871 sync
872 tlbia
873 isync
874
875
876
877 lis r6, swapper_pg_dir@h
878 ori r6, r6, swapper_pg_dir@l
879 lis r5, abatron_pteptrs@h
880 ori r5, r5, abatron_pteptrs@l
881 stw r5, 0xf0(r0)
882 tophys(r5,r5)
883 stw r6, 0(r5)
884
885
886 lis r4,MSR_KERNEL@h
887 ori r4,r4,MSR_KERNEL@l
888 lis r3,start_kernel@h
889 ori r3,r3,start_kernel@l
890 mtspr SPRN_SRR0,r3
891 mtspr SPRN_SRR1,r4
892 rfi
893 b .
894
895
896
897
898
899initial_mmu:
900 tlbia
901 isync
902
903
904
905
906
907
908
909 lis r3,KERNELBASE@h
910 ori r3,r3,KERNELBASE@l
911 tophys(r4,r3)
912
913 iccci r0,r3
914
915
916
917 li r0,0
918 mtspr SPRN_PID,r0
919 sync
920
921
922 clrrwi r4,r4,10
923 ori r4,r4,(TLB_WR | TLB_EX)
924
925 clrrwi r3,r3,10
926 ori r3,r3,(TLB_VALID | TLB_PAGESZ(PAGESZ_16M))
927
928 li r0,63
929
930 tlbwe r4,r0,TLB_DATA
931 tlbwe r3,r0,TLB_TAG
932
933 isync
934
935
936
937 lis r4,KERNELBASE@h
938 tophys(r0,r4)
939 mtspr SPRN_EVPR,r0
940
941 blr
942
943_GLOBAL(abort)
944 mfspr r13,SPRN_DBCR0
945 oris r13,r13,DBCR0_RST_SYSTEM@h
946 mtspr SPRN_DBCR0,r13
947
948_GLOBAL(set_context)
949
950#ifdef CONFIG_BDI_SWITCH
951
952
953
954 lis r5, KERNELBASE@h
955 lwz r5, 0xf0(r5)
956 stw r4, 0x4(r5)
957#endif
958 sync
959 mtspr SPRN_PID,r3
960 isync
961
962 blr
963
964
965
966
967 .data
968 .align 12
969 .globl sdata
970sdata:
971 .globl empty_zero_page
972empty_zero_page:
973 .space 4096
974 .globl swapper_pg_dir
975swapper_pg_dir:
976 .space PGD_TABLE_SIZE
977
978
979
980
981abatron_pteptrs:
982 .space 8
983