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