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#include <linux/init.h>
34#include <linux/threads.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/cache.h>
44#include <asm/ptrace.h>
45#include "head_booke.h"
46
47
48
49
50
51
52
53
54
55
56
57
58 __HEAD
59_ENTRY(_stext);
60_ENTRY(_start);
61
62
63
64
65 nop
66
67
68 mfmsr r16
69 mfspr r17,SPRN_PID
70 rlwinm r17,r17,16,0x3fff0000
71 rlwimi r17,r16,28,0x00000001
72 mtspr SPRN_MAS6,r17
73
74 tlbsx 0,r3
75
76 mfspr r16,SPRN_MAS1
77 mfspr r20,SPRN_MAS3
78 rlwinm r17,r16,25,0x1f
79 li r18,1024
80 slw r18,r18,r17
81 addi r18,r18,-1
82 and r19,r3,r18
83 andc r31,r20,r18
84 or r31,r31,r19
85 mfspr r30,SPRN_MAS7
86
87 li r25,0
88 li r24,0
89 li r23,0
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110_ENTRY(__early_start)
111
112#define ENTRY_MAPPING_BOOT_SETUP
113#include "fsl_booke_entry_mapping.S"
114#undef ENTRY_MAPPING_BOOT_SETUP
115
116
117 SET_IVOR(0, CriticalInput);
118 SET_IVOR(1, MachineCheck);
119 SET_IVOR(2, DataStorage);
120 SET_IVOR(3, InstructionStorage);
121 SET_IVOR(4, ExternalInput);
122 SET_IVOR(5, Alignment);
123 SET_IVOR(6, Program);
124 SET_IVOR(7, FloatingPointUnavailable);
125 SET_IVOR(8, SystemCall);
126 SET_IVOR(9, AuxillaryProcessorUnavailable);
127 SET_IVOR(10, Decrementer);
128 SET_IVOR(11, FixedIntervalTimer);
129 SET_IVOR(12, WatchdogTimer);
130 SET_IVOR(13, DataTLBError);
131 SET_IVOR(14, InstructionTLBError);
132 SET_IVOR(15, DebugCrit);
133
134
135 lis r4,interrupt_base@h
136 mtspr SPRN_IVPR,r4
137
138
139 li r2,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l
140#ifdef CONFIG_E200
141 oris r2,r2,MAS4_TLBSELD(1)@h
142#endif
143 mtspr SPRN_MAS4, r2
144
145
146
147 mfspr r2,SPRN_HID0
148 oris r2,r2,HID0_DOZE@h
149 mtspr SPRN_HID0, r2
150#endif
151
152
153
154
155
156
157 lis r2,DBCR0_IDM@h
158 mtspr SPRN_DBCR0,r2
159 isync
160
161 li r2,-1
162 mtspr SPRN_DBSR,r2
163#endif
164
165#ifdef CONFIG_SMP
166
167
168
169 lis r24, boot_cpuid@h
170 ori r24, r24, boot_cpuid@l
171 lwz r24, 0(r24)
172 cmpwi r24, -1
173 mfspr r24,SPRN_PIR
174 bne __secondary_start
175#endif
176
177
178
179
180
181
182 lis r2,init_task@h
183 ori r2,r2,init_task@l
184
185
186 addi r4,r2,THREAD
187 mtspr SPRN_SPRG_THREAD,r4
188
189
190 lis r1,init_thread_union@h
191 ori r1,r1,init_thread_union@l
192 li r0,0
193 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
194
195 CURRENT_THREAD_INFO(r22, r1)
196 stw r24, TI_CPU(r22)
197
198 bl early_init
199
200#ifdef CONFIG_DYNAMIC_MEMSTART
201 lis r3,kernstart_addr@ha
202 la r3,kernstart_addr@l(r3)
203#ifdef CONFIG_PHYS_64BIT
204 stw r23,0(r3)
205 stw r25,4(r3)
206#else
207 stw r25,0(r3)
208#endif
209#endif
210
211
212
213
214 mr r3,r30
215 mr r4,r31
216 bl machine_init
217 bl MMU_init
218
219
220 lis r6, swapper_pg_dir@h
221 ori r6, r6, swapper_pg_dir@l
222 lis r5, abatron_pteptrs@h
223 ori r5, r5, abatron_pteptrs@l
224 lis r4, KERNELBASE@h
225 ori r4, r4, KERNELBASE@l
226 stw r5, 0(r4)
227 stw r6, 0(r5)
228
229
230 lis r4,start_kernel@h
231 ori r4,r4,start_kernel@l
232 lis r3,MSR_KERNEL@h
233 ori r3,r3,MSR_KERNEL@l
234 mtspr SPRN_SRR0,r4
235 mtspr SPRN_SRR1,r3
236 rfi
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251#ifdef CONFIG_PTE_64BIT
252#ifdef CONFIG_HUGETLB_PAGE
253#define FIND_PTE \
254 rlwinm r12, r10, 13, 19, 29; \
255 lwzx r11, r12, r11; \
256 rlwinm. r12, r11, 0, 0, 20; \
257 blt 1000f; \
258 beq 2f; \
259 oris r11, r11, PD_HUGE@h; \
260 andi. r10, r11, HUGEPD_SHIFT_MASK@l; \
261 xor r12, r10, r11; \
262 b 1001f; \
2631000: rlwimi r12, r10, 23, 20, 28; \
264 li r10, 0; \
2651001: lwz r11, 4(r12);
266#else
267#define FIND_PTE \
268 rlwinm r12, r10, 13, 19, 29; \
269 lwzx r11, r12, r11; \
270 rlwinm. r12, r11, 0, 0, 20; \
271 beq 2f; \
272 rlwimi r12, r10, 23, 20, 28; \
273 lwz r11, 4(r12);
274#endif
275#else
276#define FIND_PTE \
277 rlwimi r11, r10, 12, 20, 29; \
278 lwz r11, 0(r11); \
279 rlwinm. r12, r11, 0, 0, 19; \
280 beq 2f; \
281 rlwimi r12, r10, 22, 20, 29; \
282 lwz r11, 0(r12);
283#endif
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302interrupt_base:
303
304 CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception)
305
306
307#ifdef CONFIG_E200
308
309 CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \
310 machine_check_exception)
311#else
312 MCHECK_EXCEPTION(0x0200, MachineCheck, machine_check_exception)
313#endif
314
315
316 START_EXCEPTION(DataStorage)
317 NORMAL_EXCEPTION_PROLOG(DATA_STORAGE)
318 mfspr r5,SPRN_ESR
319 stw r5,_ESR(r11)
320 mfspr r4,SPRN_DEAR
321 andis. r10,r5,(ESR_ILK|ESR_DLK)@h
322 bne 1f
323 EXC_XFER_LITE(0x0300, handle_page_fault)
3241:
325 addi r3,r1,STACK_FRAME_OVERHEAD
326 EXC_XFER_EE_LITE(0x0300, CacheLockingException)
327
328
329 INSTRUCTION_STORAGE_EXCEPTION
330
331
332 EXCEPTION(0x0500, EXTERNAL, ExternalInput, do_IRQ, EXC_XFER_LITE)
333
334
335 ALIGNMENT_EXCEPTION
336
337
338 PROGRAM_EXCEPTION
339
340
341#ifdef CONFIG_PPC_FPU
342 FP_UNAVAILABLE_EXCEPTION
343#else
344#ifdef CONFIG_E200
345
346 EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
347 program_check_exception, EXC_XFER_EE)
348#else
349 EXCEPTION(0x0800, FP_UNAVAIL, FloatingPointUnavailable, \
350 unknown_exception, EXC_XFER_EE)
351#endif
352#endif
353
354
355 START_EXCEPTION(SystemCall)
356 NORMAL_EXCEPTION_PROLOG(SYSCALL)
357 EXC_XFER_EE_LITE(0x0c00, DoSyscall)
358
359
360 EXCEPTION(0x2900, AP_UNAVAIL, AuxillaryProcessorUnavailable, \
361 unknown_exception, EXC_XFER_EE)
362
363
364 DECREMENTER_EXCEPTION
365
366
367
368 EXCEPTION(0x3100, FIT, FixedIntervalTimer, \
369 unknown_exception, EXC_XFER_EE)
370
371
372#ifdef CONFIG_BOOKE_WDT
373 CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, WatchdogException)
374#else
375 CRITICAL_EXCEPTION(0x3200, WATCHDOG, WatchdogTimer, unknown_exception)
376#endif
377
378
379 START_EXCEPTION(DataTLBError)
380 mtspr SPRN_SPRG_WSCRATCH0, r10
381 mfspr r10, SPRN_SPRG_THREAD
382 stw r11, THREAD_NORMSAVE(0)(r10)
383#ifdef CONFIG_KVM_BOOKE_HV
384BEGIN_FTR_SECTION
385 mfspr r11, SPRN_SRR1
386END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
387#endif
388 stw r12, THREAD_NORMSAVE(1)(r10)
389 stw r13, THREAD_NORMSAVE(2)(r10)
390 mfcr r13
391 stw r13, THREAD_NORMSAVE(3)(r10)
392 DO_KVM BOOKE_INTERRUPT_DTLB_MISS SPRN_SRR1
393 mfspr r10, SPRN_DEAR
394
395
396
397
398 lis r11, PAGE_OFFSET@h
399 cmplw 5, r10, r11
400 blt 5, 3f
401 lis r11, swapper_pg_dir@h
402 ori r11, r11, swapper_pg_dir@l
403
404 mfspr r12,SPRN_MAS1
405 rlwinm r12,r12,0,16,1
406 mtspr SPRN_MAS1,r12
407
408 b 4f
409
410
4113:
412 mfspr r11,SPRN_SPRG_THREAD
413 lwz r11,PGDIR(r11)
414
4154:
416
417
418
419
420
421
422
423
424
425
426
427
428
429 mfspr r12,SPRN_ESR
430#ifdef CONFIG_PTE_64BIT
431 li r13,_PAGE_PRESENT
432 oris r13,r13,_PAGE_ACCESSED@h
433#else
434 li r13,_PAGE_PRESENT|_PAGE_ACCESSED
435#endif
436 rlwimi r13,r12,11,29,29
437
438 FIND_PTE
439 andc. r13,r13,r11
440
441#ifdef CONFIG_PTE_64BIT
442#ifdef CONFIG_SMP
443 subf r13,r11,r12
444 lwzx r13,r11,r13
445#else
446 lwz r13,0(r12)
447#endif
448#endif
449
450 bne 2f
451
452
453 b finish_tlb_load
4542:
455
456
457
458 mfspr r10, SPRN_SPRG_THREAD
459 lwz r11, THREAD_NORMSAVE(3)(r10)
460 mtcr r11
461 lwz r13, THREAD_NORMSAVE(2)(r10)
462 lwz r12, THREAD_NORMSAVE(1)(r10)
463 lwz r11, THREAD_NORMSAVE(0)(r10)
464 mfspr r10, SPRN_SPRG_RSCRATCH0
465 b DataStorage
466
467
468
469
470
471
472
473 START_EXCEPTION(InstructionTLBError)
474 mtspr SPRN_SPRG_WSCRATCH0, r10
475 mfspr r10, SPRN_SPRG_THREAD
476 stw r11, THREAD_NORMSAVE(0)(r10)
477#ifdef CONFIG_KVM_BOOKE_HV
478BEGIN_FTR_SECTION
479 mfspr r11, SPRN_SRR1
480END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
481#endif
482 stw r12, THREAD_NORMSAVE(1)(r10)
483 stw r13, THREAD_NORMSAVE(2)(r10)
484 mfcr r13
485 stw r13, THREAD_NORMSAVE(3)(r10)
486 DO_KVM BOOKE_INTERRUPT_ITLB_MISS SPRN_SRR1
487 mfspr r10, SPRN_SRR0
488
489
490
491
492 lis r11, PAGE_OFFSET@h
493 cmplw 5, r10, r11
494 blt 5, 3f
495 lis r11, swapper_pg_dir@h
496 ori r11, r11, swapper_pg_dir@l
497
498 mfspr r12,SPRN_MAS1
499 rlwinm r12,r12,0,16,1
500 mtspr SPRN_MAS1,r12
501
502
503#ifdef CONFIG_PTE_64BIT
504 li r13,_PAGE_PRESENT | _PAGE_BAP_SX
505 oris r13,r13,_PAGE_ACCESSED@h
506#else
507 li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
508#endif
509 b 4f
510
511
5123:
513 mfspr r11,SPRN_SPRG_THREAD
514 lwz r11,PGDIR(r11)
515
516
517#ifdef CONFIG_PTE_64BIT
518 li r13,_PAGE_PRESENT | _PAGE_BAP_UX
519 oris r13,r13,_PAGE_ACCESSED@h
520#else
521 li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
522#endif
523
5244:
525 FIND_PTE
526 andc. r13,r13,r11
527
528#ifdef CONFIG_PTE_64BIT
529#ifdef CONFIG_SMP
530 subf r13,r11,r12
531 lwzx r13,r11,r13
532#else
533 lwz r13,0(r12)
534#endif
535#endif
536
537 bne 2f
538
539
540 b finish_tlb_load
541
5422:
543
544
545
546 mfspr r10, SPRN_SPRG_THREAD
547 lwz r11, THREAD_NORMSAVE(3)(r10)
548 mtcr r11
549 lwz r13, THREAD_NORMSAVE(2)(r10)
550 lwz r12, THREAD_NORMSAVE(1)(r10)
551 lwz r11, THREAD_NORMSAVE(0)(r10)
552 mfspr r10, SPRN_SPRG_RSCRATCH0
553 b InstructionStorage
554
555#ifdef CONFIG_SPE
556
557 START_EXCEPTION(SPEUnavailable)
558 NORMAL_EXCEPTION_PROLOG(SPE_UNAVAIL)
559 beq 1f
560 bl load_up_spe
561 b fast_exception_return
5621: addi r3,r1,STACK_FRAME_OVERHEAD
563 EXC_XFER_EE_LITE(0x2010, KernelSPE)
564#else
565 EXCEPTION(0x2020, SPE_UNAVAIL, SPEUnavailable, \
566 unknown_exception, EXC_XFER_EE)
567#endif
568
569
570#ifdef CONFIG_SPE
571 EXCEPTION(0x2030, SPE_FP_DATA, SPEFloatingPointData, \
572 SPEFloatingPointException, EXC_XFER_EE);
573
574
575 EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
576 SPEFloatingPointRoundException, EXC_XFER_EE)
577#else
578 EXCEPTION(0x2040, SPE_FP_DATA, SPEFloatingPointData, \
579 unknown_exception, EXC_XFER_EE)
580 EXCEPTION(0x2050, SPE_FP_ROUND, SPEFloatingPointRound, \
581 unknown_exception, EXC_XFER_EE)
582#endif
583
584
585 EXCEPTION(0x2060, PERFORMANCE_MONITOR, PerformanceMonitor, \
586 performance_monitor_exception, EXC_XFER_STD)
587
588 EXCEPTION(0x2070, DOORBELL, Doorbell, doorbell_exception, EXC_XFER_STD)
589
590 CRITICAL_EXCEPTION(0x2080, DOORBELL_CRITICAL, \
591 CriticalDoorbell, unknown_exception)
592
593
594 DEBUG_DEBUG_EXCEPTION
595 DEBUG_CRIT_EXCEPTION
596
597 GUEST_DOORBELL_EXCEPTION
598
599 CRITICAL_EXCEPTION(0, GUEST_DBELL_CRIT, CriticalGuestDoorbell, \
600 unknown_exception)
601
602
603 EXCEPTION(0, HV_SYSCALL, Hypercall, unknown_exception, EXC_XFER_EE)
604
605
606 EXCEPTION(0, HV_PRIV, Ehvpriv, unknown_exception, EXC_XFER_EE)
607
608interrupt_end:
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626finish_tlb_load:
627#ifdef CONFIG_HUGETLB_PAGE
628 cmpwi 6, r10, 0
629 beq 6, finish_tlb_load_cont
630
631
632 mfspr r12, SPRN_SPRG_THREAD
633 stw r14, THREAD_NORMSAVE(4)(r12)
634 stw r15, THREAD_NORMSAVE(5)(r12)
635 stw r16, THREAD_NORMSAVE(6)(r12)
636 stw r17, THREAD_NORMSAVE(7)(r12)
637
638
639#ifdef CONFIG_SMP
640 lwz r12, THREAD_INFO-THREAD(r12)
641 lwz r15, TI_CPU(r12)
642 lis r14, __per_cpu_offset@h
643 ori r14, r14, __per_cpu_offset@l
644 rlwinm r15, r15, 2, 0, 29
645 lwzx r16, r14, r15
646#else
647 li r16, 0
648#endif
649 lis r17, next_tlbcam_idx@h
650 ori r17, r17, next_tlbcam_idx@l
651 add r17, r17, r16
652 lwz r15, 0(r17)
653
654 lis r14, MAS0_TLBSEL(1)@h
655 rlwimi r14, r15, 16, 4, 15
656 mtspr SPRN_MAS0, r14
657
658
659 mfspr r16, SPRN_TLB1CFG
660 andi. r16, r16, 0xfff
661
662
663 addi r15, r15, 1
664 cmpw r15, r16
665 blt 100f
666 lis r14, tlbcam_index@h
667 ori r14, r14, tlbcam_index@l
668 lwz r15, 0(r14)
669100: stw r15, 0(r17)
670
671
672
673
674
675 subi r15, r10, 10
676 mfspr r16, SPRN_MAS1
677 rlwimi r16, r15, 7, 20, 24
678 mtspr SPRN_MAS1, r16
679
680
681 mr r14, r10
682
683
684
685#endif
686
687
688
689
690
691
692
693finish_tlb_load_cont:
694#ifdef CONFIG_PTE_64BIT
695 rlwinm r12, r11, 32-2, 26, 31
696 andi. r10, r11, _PAGE_DIRTY
697 bne 1f
698 li r10, MAS3_SW | MAS3_UW
699 andc r12, r12, r10
7001: rlwimi r12, r13, 20, 0, 11
701 rlwimi r12, r11, 20, 12, 19
7022: mtspr SPRN_MAS3, r12
703BEGIN_MMU_FTR_SECTION
704 srwi r10, r13, 12
705 mtspr SPRN_MAS7, r10
706END_MMU_FTR_SECTION_IFSET(MMU_FTR_BIG_PHYS)
707#else
708 li r10, (_PAGE_EXEC | _PAGE_PRESENT)
709 mr r13, r11
710 rlwimi r10, r11, 31, 29, 29
711 and r12, r11, r10
712 andi. r10, r11, _PAGE_USER
713 slwi r10, r12, 1
714 or r10, r10, r12
715 iseleq r12, r12, r10
716 rlwimi r13, r12, 0, 20, 31
717 mtspr SPRN_MAS3, r13
718#endif
719
720 mfspr r12, SPRN_MAS2
721#ifdef CONFIG_PTE_64BIT
722 rlwimi r12, r11, 32-19, 27, 31
723#else
724 rlwimi r12, r11, 26, 27, 31
725#endif
726#ifdef CONFIG_HUGETLB_PAGE
727 beq 6, 3f
728 li r13, 1
729 slw r13, r13, r14
730 subi r13, r13, 1
731 rlwinm r13, r13, 0, 0, 19
732 andc r12, r12, r13
733#endif
7343: mtspr SPRN_MAS2, r12
735
736#ifdef CONFIG_E200
737
738 mfspr r12, SPRN_MAS0
739
740
741 mfspr r11, SPRN_TLB1CFG
742 andi. r11, r11, 0xfff
743
744
745 andi. r13, r12, 0xfff
746 addi r13, r13, 1
747 cmpw 0, r13, r11
748 addi r12, r12, 1
749
750
751 blt 7f
752
753
754 lis r13, tlbcam_index@ha
755 lwz r13, tlbcam_index@l(r13)
756 rlwimi r12, r13, 0, 20, 31
7577:
758 mtspr SPRN_MAS0,r12
759#endif
760
761tlb_write_entry:
762 tlbwe
763
764
765 mfspr r10, SPRN_SPRG_THREAD
766#ifdef CONFIG_HUGETLB_PAGE
767 beq 6, 8f
768 lwz r14, THREAD_NORMSAVE(4)(r10)
769 lwz r15, THREAD_NORMSAVE(5)(r10)
770 lwz r16, THREAD_NORMSAVE(6)(r10)
771 lwz r17, THREAD_NORMSAVE(7)(r10)
772#endif
7738: lwz r11, THREAD_NORMSAVE(3)(r10)
774 mtcr r11
775 lwz r13, THREAD_NORMSAVE(2)(r10)
776 lwz r12, THREAD_NORMSAVE(1)(r10)
777 lwz r11, THREAD_NORMSAVE(0)(r10)
778 mfspr r10, SPRN_SPRG_RSCRATCH0
779 rfi
780
781#ifdef CONFIG_SPE
782
783
784
785_GLOBAL(load_up_spe)
786
787
788
789
790
791
792
793 mfmsr r5
794 oris r5,r5,MSR_SPE@h
795 mtmsr r5
796 isync
797
798
799
800
801
802#ifndef CONFIG_SMP
803 lis r3,last_task_used_spe@ha
804 lwz r4,last_task_used_spe@l(r3)
805 cmpi 0,r4,0
806 beq 1f
807 addi r4,r4,THREAD
808 SAVE_32EVRS(0,r10,r4,THREAD_EVR0)
809 evxor evr10, evr10, evr10
810 evmwumiaa evr10, evr10, evr10
811 li r5,THREAD_ACC
812 evstddx evr10, r4, r5
813 lwz r5,PT_REGS(r4)
814 lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
815 lis r10,MSR_SPE@h
816 andc r4,r4,r10
817 stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
8181:
819#endif
820
821 oris r9,r9,MSR_SPE@h
822 mfspr r5,SPRN_SPRG_THREAD
823 li r4,1
824 li r10,THREAD_ACC
825 stw r4,THREAD_USED_SPE(r5)
826 evlddx evr4,r10,r5
827 evmra evr4,evr4
828 REST_32EVRS(0,r10,r5,THREAD_EVR0)
829#ifndef CONFIG_SMP
830 subi r4,r5,THREAD
831 stw r4,last_task_used_spe@l(r3)
832#endif
833 blr
834
835
836
837
838
839KernelSPE:
840 lwz r3,_MSR(r1)
841 oris r3,r3,MSR_SPE@h
842 stw r3,_MSR(r1)
843#ifdef CONFIG_PRINTK
844 lis r3,87f@h
845 ori r3,r3,87f@l
846 mr r4,r2
847 lwz r5,_NIP(r1)
848 bl printk
849#endif
850 b ret_from_except
851#ifdef CONFIG_PRINTK
85287: .string "SPE used in kernel (task=%p, pc=%x) \n"
853#endif
854 .align 4,0
855
856#endif
857
858
859
860
861
862
863_GLOBAL(__setup_e200_ivors)
864 li r3,DebugDebug@l
865 mtspr SPRN_IVOR15,r3
866 li r3,SPEUnavailable@l
867 mtspr SPRN_IVOR32,r3
868 li r3,SPEFloatingPointData@l
869 mtspr SPRN_IVOR33,r3
870 li r3,SPEFloatingPointRound@l
871 mtspr SPRN_IVOR34,r3
872 sync
873 blr
874
875
876_GLOBAL(__setup_e500_ivors)
877 li r3,DebugCrit@l
878 mtspr SPRN_IVOR15,r3
879 li r3,SPEUnavailable@l
880 mtspr SPRN_IVOR32,r3
881 li r3,SPEFloatingPointData@l
882 mtspr SPRN_IVOR33,r3
883 li r3,SPEFloatingPointRound@l
884 mtspr SPRN_IVOR34,r3
885 li r3,PerformanceMonitor@l
886 mtspr SPRN_IVOR35,r3
887 sync
888 blr
889
890
891_GLOBAL(__setup_e500mc_ivors)
892 li r3,DebugDebug@l
893 mtspr SPRN_IVOR15,r3
894 li r3,PerformanceMonitor@l
895 mtspr SPRN_IVOR35,r3
896 li r3,Doorbell@l
897 mtspr SPRN_IVOR36,r3
898 li r3,CriticalDoorbell@l
899 mtspr SPRN_IVOR37,r3
900 sync
901 blr
902
903
904_GLOBAL(__setup_ehv_ivors)
905 li r3,GuestDoorbell@l
906 mtspr SPRN_IVOR38,r3
907 li r3,CriticalGuestDoorbell@l
908 mtspr SPRN_IVOR39,r3
909 li r3,Hypercall@l
910 mtspr SPRN_IVOR40,r3
911 li r3,Ehvpriv@l
912 mtspr SPRN_IVOR41,r3
913 sync
914 blr
915
916#ifdef CONFIG_SPE
917
918
919
920
921_GLOBAL(giveup_spe)
922 mfmsr r5
923 oris r5,r5,MSR_SPE@h
924 mtmsr r5
925 isync
926 cmpi 0,r3,0
927 beqlr-
928 addi r3,r3,THREAD
929 lwz r5,PT_REGS(r3)
930 cmpi 0,r5,0
931 SAVE_32EVRS(0, r4, r3, THREAD_EVR0)
932 evxor evr6, evr6, evr6
933 evmwumiaa evr6, evr6, evr6
934 li r4,THREAD_ACC
935 evstddx evr6, r4, r3
936 beq 1f
937 lwz r4,_MSR-STACK_FRAME_OVERHEAD(r5)
938 lis r3,MSR_SPE@h
939 andc r4,r4,r3
940 stw r4,_MSR-STACK_FRAME_OVERHEAD(r5)
9411:
942#ifndef CONFIG_SMP
943 li r5,0
944 lis r4,last_task_used_spe@ha
945 stw r5,last_task_used_spe@l(r4)
946#endif
947 blr
948#endif
949
950
951
952
953
954
955_GLOBAL(abort)
956 li r13,0
957 mtspr SPRN_DBCR0,r13
958 isync
959 mfmsr r13
960 ori r13,r13,MSR_DE@l
961 mtmsr r13
962 isync
963 mfspr r13,SPRN_DBCR0
964 lis r13,(DBCR0_IDM|DBCR0_RST_CHIP)@h
965 mtspr SPRN_DBCR0,r13
966 isync
967
968_GLOBAL(set_context)
969
970#ifdef CONFIG_BDI_SWITCH
971
972
973
974 lis r5, abatron_pteptrs@h
975 ori r5, r5, abatron_pteptrs@l
976 stw r4, 0x4(r5)
977#endif
978 mtspr SPRN_PID,r3
979 isync
980 blr
981
982_GLOBAL(flush_dcache_L1)
983 mfspr r3,SPRN_L1CFG0
984
985 rlwinm r5,r3,9,3
986 twlgti r5,1
987
988
989 li r4,32
990 subfic r6,r5,2
991
992
993 slw r5,r4,r5
994
995 rlwinm r7,r3,0,0xff
996 mulli r7,r7,13
997
998
999 slw r7,r7,r6
1000
1001
1002 mfspr r8,SPRN_HID0
1003 ori r9,r8,HID0_DCFA@l
1004 mtspr SPRN_HID0,r9
1005 isync
1006
1007 lis r4,KERNELBASE@h
1008 mtctr r7
1009
10101: lwz r3,0(r4)
1011 add r4,r4,r5
1012 bdnz 1b
1013
1014 msync
1015 lis r4,KERNELBASE@h
1016 mtctr r7
1017
10181: dcbf 0,r4
1019 add r4,r4,r5
1020 bdnz 1b
1021
1022
1023 mtspr SPRN_HID0,r8
1024 isync
1025
1026 blr
1027
1028
1029_GLOBAL(__flush_disable_L1)
1030 mflr r10
1031 bl flush_dcache_L1
1032 mtlr r10
1033
1034 mfspr r4, SPRN_L1CSR0
1035 li r5, 2
1036 rlwimi r4, r5, 0, 3
1037
1038 msync
1039 isync
1040 mtspr SPRN_L1CSR0, r4
1041 isync
1042
10431: mfspr r4, SPRN_L1CSR0
1044 andi. r4, r4, 2
1045 bne 1b
1046
1047 mfspr r4, SPRN_L1CSR1
1048 li r5, 2
1049 rlwimi r4, r5, 0, 3
1050
1051 mtspr SPRN_L1CSR1, r4
1052 isync
1053
1054 blr
1055
1056#ifdef CONFIG_SMP
1057
1058 .globl __secondary_start
1059__secondary_start:
1060 lis r3,__secondary_hold_acknowledge@h
1061 ori r3,r3,__secondary_hold_acknowledge@l
1062 stw r24,0(r3)
1063
1064 li r3,0
1065 mr r4,r24
1066 bl call_setup_cpu
1067
1068 lis r3,tlbcam_index@ha
1069 lwz r3,tlbcam_index@l(r3)
1070 mtctr r3
1071 li r26,0
1072
1073
10741: mr r3,r26
1075 bl loadcam_entry
1076 addi r26,r26,1
1077 bdnz 1b
1078
1079
1080 lis r1,secondary_ti@ha
1081 lwz r1,secondary_ti@l(r1)
1082 lwz r2,TI_TASK(r1)
1083
1084
1085 addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
1086 li r0,0
1087 stw r0,0(r1)
1088
1089
1090 addi r4,r2,THREAD
1091 mtspr SPRN_SPRG_THREAD,r4
1092
1093
1094 li r4,(MAS4_TSIZED(BOOK3E_PAGESZ_4K))@l
1095 mtspr SPRN_MAS4,r4
1096
1097
1098 lis r4,MSR_KERNEL@h
1099 ori r4,r4,MSR_KERNEL@l
1100 lis r3,start_secondary@h
1101 ori r3,r3,start_secondary@l
1102 mtspr SPRN_SRR0,r3
1103 mtspr SPRN_SRR1,r4
1104 sync
1105 rfi
1106 sync
1107
1108 .globl __secondary_hold_acknowledge
1109__secondary_hold_acknowledge:
1110 .long -1
1111#endif
1112
1113
1114
1115
1116
1117 .data
1118 .align 12
1119 .globl sdata
1120sdata:
1121 .globl empty_zero_page
1122empty_zero_page:
1123 .space 4096
1124 .globl swapper_pg_dir
1125swapper_pg_dir:
1126 .space PGD_TABLE_SIZE
1127
1128
1129
1130
1131
1132abatron_pteptrs:
1133 .space 8
1134