1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include <linux/sys.h>
22#include <asm/unistd.h>
23#include <asm/errno.h>
24#include <asm/reg.h>
25#include <asm/page.h>
26#include <asm/cache.h>
27#include <asm/cputable.h>
28#include <asm/mmu.h>
29#include <asm/ppc_asm.h>
30#include <asm/thread_info.h>
31#include <asm/asm-offsets.h>
32#include <asm/processor.h>
33#include <asm/kexec.h>
34#include <asm/bug.h>
35#include <asm/ptrace.h>
36#include <asm/export.h>
37
38 .text
39
40
41
42
43
44_GLOBAL(call_do_softirq)
45 mflr r0
46 stw r0,4(r1)
47 lwz r10,THREAD+KSP_LIMIT(r2)
48 addi r11,r3,THREAD_INFO_GAP
49 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
50 mr r1,r3
51 stw r10,8(r1)
52 stw r11,THREAD+KSP_LIMIT(r2)
53 bl __do_softirq
54 lwz r10,8(r1)
55 lwz r1,0(r1)
56 lwz r0,4(r1)
57 stw r10,THREAD+KSP_LIMIT(r2)
58 mtlr r0
59 blr
60
61
62
63
64_GLOBAL(call_do_irq)
65 mflr r0
66 stw r0,4(r1)
67 lwz r10,THREAD+KSP_LIMIT(r2)
68 addi r11,r4,THREAD_INFO_GAP
69 stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4)
70 mr r1,r4
71 stw r10,8(r1)
72 stw r11,THREAD+KSP_LIMIT(r2)
73 bl __do_irq
74 lwz r10,8(r1)
75 lwz r1,0(r1)
76 lwz r0,4(r1)
77 stw r10,THREAD+KSP_LIMIT(r2)
78 mtlr r0
79 blr
80
81
82
83
84_GLOBAL(mulhdu)
85 cmpwi r6,0
86 cmpwi cr1,r3,0
87 mr r10,r4
88 mulhwu r4,r4,r5
89 beq 1f
90 mulhwu r0,r10,r6
91 mullw r7,r10,r5
92 addc r7,r0,r7
93 addze r4,r4
941: beqlr cr1
95 mullw r9,r3,r5
96 mulhwu r10,r3,r5
97 beq 2f
98 mullw r0,r3,r6
99 mulhwu r8,r3,r6
100 addc r7,r0,r7
101 adde r4,r4,r8
102 addze r10,r10
1032: addc r4,r4,r9
104 addze r3,r10
105 blr
106
107
108
109
110
111_GLOBAL(reloc_got2)
112 mflr r11
113 lis r7,__got2_start@ha
114 addi r7,r7,__got2_start@l
115 lis r8,__got2_end@ha
116 addi r8,r8,__got2_end@l
117 subf r8,r7,r8
118 srwi. r8,r8,2
119 beqlr
120 mtctr r8
121 bl 1f
1221: mflr r0
123 lis r4,1b@ha
124 addi r4,r4,1b@l
125 subf r0,r4,r0
126 add r7,r0,r7
1272: lwz r0,0(r7)
128 add r0,r0,r3
129 stw r0,0(r7)
130 addi r7,r7,4
131 bdnz 2b
132 mtlr r11
133 blr
134
135
136
137
138
139
140
141
142
143_GLOBAL(call_setup_cpu)
144 addis r4,r3,cur_cpu_spec@ha
145 addi r4,r4,cur_cpu_spec@l
146 lwz r4,0(r4)
147 add r4,r4,r3
148 lwz r5,CPU_SPEC_SETUP(r4)
149 cmpwi 0,r5,0
150 add r5,r5,r3
151 beqlr
152 mtctr r5
153 bctr
154
155
156
157
158
159
160
161_GLOBAL(low_choose_750fx_pll)
162
163 mfmsr r7
164 rlwinm r0,r7,0,17,15
165 mtmsr r0
166
167
168 cmplwi cr0,r3,0
169 beq 1f
170 mfspr r5,SPRN_HID0
171 rlwinm r5,r5,0,27,25
172 sync
173 mtspr SPRN_HID0,r5
174 isync
175 sync
176
1771:
178
179 mfspr r4,SPRN_HID1
180 rlwinm r5,r3,16,15,15
181 rlwinm r4,r4,0,16,14
182 or r4,r4,r5
183 mtspr SPRN_HID1,r4
184
185
186 CURRENT_THREAD_INFO(r6, r1)
187 lwz r6,TI_CPU(r6)
188 slwi r6,r6,2
189 addis r6,r6,nap_save_hid1@ha
190 stw r4,nap_save_hid1@l(r6)
191
192
193 cmplwi cr0,r3,0
194 bne 1f
195 mfspr r5,SPRN_HID0
196 ori r5,r5,HID0_BTIC
197 sync
198 mtspr SPRN_HID0,r5
199 isync
200 sync
201
2021:
203
204 mtmsr r7
205 blr
206
207_GLOBAL(low_choose_7447a_dfs)
208
209 mfmsr r7
210 rlwinm r0,r7,0,17,15
211 mtmsr r0
212
213
214 mfspr r4,SPRN_HID1
215 insrwi r4,r3,1,9
216 sync
217 mtspr SPRN_HID1,r4
218 sync
219 isync
220
221
222 mtmsr r7
223 blr
224
225#endif
226
227
228
229
230
231_GLOBAL(_nmask_and_or_msr)
232 mfmsr r0
233 andc r0,r0,r3
234 or r0,r0,r4
235 SYNC
236 mtmsr r0
237 isync
238 blr
239
240#ifdef CONFIG_40x
241
242
243
244
245_GLOBAL(real_readb)
246 mfmsr r7
247 ori r0,r7,MSR_DR
248 xori r0,r0,MSR_DR
249 sync
250 mtmsr r0
251 sync
252 isync
253 lbz r3,0(r3)
254 sync
255 mtmsr r7
256 sync
257 isync
258 blr
259
260
261
262
263_GLOBAL(real_writeb)
264 mfmsr r7
265 ori r0,r7,MSR_DR
266 xori r0,r0,MSR_DR
267 sync
268 mtmsr r0
269 sync
270 isync
271 stb r3,0(r4)
272 sync
273 mtmsr r7
274 sync
275 isync
276 blr
277
278#endif
279
280
281
282
283
284
285#ifndef CONFIG_PPC_8xx
286_GLOBAL(flush_instruction_cache)
287
288#ifdef CONFIG_403GCX
289 li r3, 512
290 mtctr r3
291 lis r4, KERNELBASE@h
2921: iccci 0, r4
293 addi r4, r4, 16
294 bdnz 1b
295#else
296 lis r3, KERNELBASE@h
297 iccci 0,r3
298#endif
299
300BEGIN_FTR_SECTION
301 mfspr r3,SPRN_L1CSR0
302 ori r3,r3,L1CSR0_CFI|L1CSR0_CLFC
303
304 mtspr SPRN_L1CSR0,r3
305 isync
306 blr
307END_FTR_SECTION_IFSET(CPU_FTR_UNIFIED_ID_CACHE)
308 mfspr r3,SPRN_L1CSR1
309 ori r3,r3,L1CSR1_ICFI|L1CSR1_ICLFR
310 mtspr SPRN_L1CSR1,r3
311#else
312 mfspr r3,SPRN_PVR
313 rlwinm r3,r3,16,16,31
314 cmpwi 0,r3,1
315 beqlr
316
317 mfspr r3,SPRN_HID0
318 ori r3,r3,HID0_ICFI
319 mtspr SPRN_HID0,r3
320#endif
321 isync
322 blr
323EXPORT_SYMBOL(flush_instruction_cache)
324#endif
325
326
327
328
329
330
331
332
333_GLOBAL(flush_icache_range)
334BEGIN_FTR_SECTION
335 PURGE_PREFETCHED_INS
336 blr
337END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
338 rlwinm r3,r3,0,0,31 - L1_CACHE_SHIFT
339 subf r4,r3,r4
340 addi r4,r4,L1_CACHE_BYTES - 1
341 srwi. r4,r4,L1_CACHE_SHIFT
342 beqlr
343 mtctr r4
344 mr r6,r3
3451: dcbst 0,r3
346 addi r3,r3,L1_CACHE_BYTES
347 bdnz 1b
348 sync
349#ifndef CONFIG_44x
350 mtctr r4
3512: icbi 0,r6
352 addi r6,r6,L1_CACHE_BYTES
353 bdnz 2b
354#else
355
356
357
358 iccci 0, r0
359#endif
360 sync
361 isync
362 blr
363_ASM_NOKPROBE_SYMBOL(flush_icache_range)
364EXPORT_SYMBOL(flush_icache_range)
365
366
367
368
369
370
371
372
373
374_GLOBAL(__flush_dcache_icache)
375BEGIN_FTR_SECTION
376 PURGE_PREFETCHED_INS
377 blr
378END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
379 rlwinm r3,r3,0,0,31-PAGE_SHIFT
380 li r4,PAGE_SIZE/L1_CACHE_BYTES
381 mtctr r4
382 mr r6,r3
3830: dcbst 0,r3
384 addi r3,r3,L1_CACHE_BYTES
385 bdnz 0b
386 sync
387#ifdef CONFIG_44x
388
389
390
391
392
393
394
395BEGIN_MMU_FTR_SECTION
396 blr
397END_MMU_FTR_SECTION_IFSET(MMU_FTR_TYPE_44x)
398#endif
399 mtctr r4
4001: icbi 0,r6
401 addi r6,r6,L1_CACHE_BYTES
402 bdnz 1b
403 sync
404 isync
405 blr
406
407#ifndef CONFIG_BOOKE
408
409
410
411
412
413
414
415
416_GLOBAL(__flush_dcache_icache_phys)
417BEGIN_FTR_SECTION
418 PURGE_PREFETCHED_INS
419 blr
420END_FTR_SECTION_IFSET(CPU_FTR_COHERENT_ICACHE)
421 mfmsr r10
422 rlwinm r0,r10,0,28,26
423 mtmsr r0
424 isync
425 rlwinm r3,r3,0,0,31-PAGE_SHIFT
426 li r4,PAGE_SIZE/L1_CACHE_BYTES
427 mtctr r4
428 mr r6,r3
4290: dcbst 0,r3
430 addi r3,r3,L1_CACHE_BYTES
431 bdnz 0b
432 sync
433 mtctr r4
4341: icbi 0,r6
435 addi r6,r6,L1_CACHE_BYTES
436 bdnz 1b
437 sync
438 mtmsr r10
439 isync
440 blr
441#endif
442
443
444
445
446
447
448
449#define COPY_16_BYTES \
450 lwz r6,4(r4); \
451 lwz r7,8(r4); \
452 lwz r8,12(r4); \
453 lwzu r9,16(r4); \
454 stw r6,4(r3); \
455 stw r7,8(r3); \
456 stw r8,12(r3); \
457 stwu r9,16(r3)
458
459_GLOBAL(copy_page)
460 addi r3,r3,-4
461 addi r4,r4,-4
462
463 li r5,4
464
465
466 li r0,MAX_COPY_PREFETCH
467 li r11,4
468 mtctr r0
46911: dcbt r11,r4
470 addi r11,r11,L1_CACHE_BYTES
471 bdnz 11b
472#else
473 dcbt r5,r4
474 li r11,L1_CACHE_BYTES+4
475#endif
476 li r0,PAGE_SIZE/L1_CACHE_BYTES - MAX_COPY_PREFETCH
477 crclr 4*cr0+eq
4782:
479 mtctr r0
4801:
481 dcbt r11,r4
482 dcbz r5,r3
483 COPY_16_BYTES
484
485 COPY_16_BYTES
486
487 COPY_16_BYTES
488 COPY_16_BYTES
489
490 COPY_16_BYTES
491 COPY_16_BYTES
492 COPY_16_BYTES
493 COPY_16_BYTES
494#endif
495#endif
496#endif
497 bdnz 1b
498 beqlr
499 crnot 4*cr0+eq,4*cr0+eq
500 li r0,MAX_COPY_PREFETCH
501 li r11,4
502 b 2b
503EXPORT_SYMBOL(copy_page)
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519_GLOBAL(__ashrdi3)
520 subfic r6,r5,32
521 srw r4,r4,r5
522 addi r7,r5,32
523 slw r6,r3,r6
524 rlwinm r8,r7,0,32
525 sraw r7,r3,r7
526 or r4,r4,r6
527 slw r7,r7,r8
528 sraw r3,r3,r5
529 or r4,r4,r7
530 blr
531EXPORT_SYMBOL(__ashrdi3)
532
533_GLOBAL(__ashldi3)
534 subfic r6,r5,32
535 slw r3,r3,r5
536 addi r7,r5,32
537 srw r6,r4,r6
538 slw r7,r4,r7
539 or r3,r3,r6
540 slw r4,r4,r5
541 or r3,r3,r7
542 blr
543EXPORT_SYMBOL(__ashldi3)
544
545_GLOBAL(__lshrdi3)
546 subfic r6,r5,32
547 srw r4,r4,r5
548 addi r7,r5,32
549 slw r6,r3,r6
550 srw r7,r3,r7
551 or r4,r4,r6
552 srw r3,r3,r5
553 or r4,r4,r7
554 blr
555EXPORT_SYMBOL(__lshrdi3)
556
557
558
559
560
561_GLOBAL(__cmpdi2)
562 cmpw r3,r5
563 li r3,1
564 bne 1f
565 cmplw r4,r6
566 beqlr
5671: li r3,0
568 bltlr
569 li r3,2
570 blr
571EXPORT_SYMBOL(__cmpdi2)
572
573
574
575
576_GLOBAL(__ucmpdi2)
577 cmplw r3,r5
578 li r3,1
579 bne 1f
580 cmplw r4,r6
581 beqlr
5821: li r3,0
583 bltlr
584 li r3,2
585 blr
586EXPORT_SYMBOL(__ucmpdi2)
587
588_GLOBAL(__bswapdi2)
589 rotlwi r9,r4,8
590 rotlwi r10,r3,8
591 rlwimi r9,r4,24,0,7
592 rlwimi r10,r3,24,0,7
593 rlwimi r9,r4,24,16,23
594 rlwimi r10,r3,24,16,23
595 mr r3,r9
596 mr r4,r10
597 blr
598EXPORT_SYMBOL(__bswapdi2)
599
600#ifdef CONFIG_SMP
601_GLOBAL(start_secondary_resume)
602
603 CURRENT_THREAD_INFO(r1, r1)
604 addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
605 li r3,0
606 stw r3,0(r1)
607 bl start_secondary
608 b .
609#endif
610
611
612
613
614_GLOBAL(__main)
615 blr
616
617#ifdef CONFIG_KEXEC_CORE
618
619
620
621 .globl relocate_new_kernel
622relocate_new_kernel:
623
624
625
626
627#ifdef CONFIG_FSL_BOOKE
628
629 mr r29, r3
630 mr r30, r4
631 mr r31, r5
632
633#define ENTRY_MAPPING_KEXEC_SETUP
634#include "fsl_booke_entry_mapping.S"
635#undef ENTRY_MAPPING_KEXEC_SETUP
636
637 mr r3, r29
638 mr r4, r30
639 mr r5, r31
640
641 li r0, 0
642
643
644
645 mr r29, r3
646 mr r30, r4
647 mr r31, r5
648
649#ifdef CONFIG_PPC_47x
650
651 mfspr r3,SPRN_PVR
652 srwi r3,r3,16
653 cmplwi cr0,r3,PVR_476FPE@h
654 beq setup_map_47x
655 cmplwi cr0,r3,PVR_476@h
656 beq setup_map_47x
657 cmplwi cr0,r3,PVR_476_ISS@h
658 beq setup_map_47x
659#endif
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681 li r3, 0
682 mtspr SPRN_PID, r3
683 mfmsr r4
684 andi. r4,r4,MSR_IS@l
685 beq wmmucr
686 oris r3,r3,PPC44x_MMUCR_STS@h
687wmmucr:
688 mtspr SPRN_MMUCR,r3
689 sync
690
691
692
693
694
695 bl 0f
6960: mflr r5
697 tlbsx r23,0,r5
698 li r4,0
699 li r3,0
7001: cmpw r23,r4
701 beq skip
702 tlbwe r3,r4,PPC44x_TLB_PAGEID
703skip:
704 addi r4,r4,1
705 cmpwi r4,64
706 bne 1b
707 isync
708
709
710 andi. r6, r23, 1
711 addi r24, r6, 1
712
713 mfmsr r9
714 rlwinm r5, r9, 27, 31, 31
715 xori r7, r5, 1
716
717
718 tlbre r3, r23, PPC44x_TLB_PAGEID
719 tlbre r4, r23, PPC44x_TLB_XLAT
720 tlbre r5, r23, PPC44x_TLB_ATTRIB
721
722
723 mr r25, r4
724
725
726 li r10, 1
727 rlwinm r11, r3, 0, 24, 27
728
729
730 cmpwi r11, PPC44x_TLB_256M
731 bne tlb_4k
732 rotlwi r10, r10, 28
733 b write_out
734tlb_4k:
735 cmpwi r11, PPC44x_TLB_4K
736 bne default
737 rotlwi r10, r10, 12
738 b write_out
739default:
740 rotlwi r10, r10, 10
741
742write_out:
743
744
745
746
747 insrwi r3, r7, 1, 23
748
749
750 tlbwe r3, r24, PPC44x_TLB_PAGEID
751 tlbwe r4, r24, PPC44x_TLB_XLAT
752 tlbwe r5, r24, PPC44x_TLB_ATTRIB
753
754 subi r11, r10, 1
755 not r10, r11
756
757
758 insrwi r9, r7, 1, 26
759
760 bl 1f
7611: mflr r8
762 addi r8, r8, (2f-1b)
763
764
765 mtspr SPRN_SRR0, r8
766 mtspr SPRN_SRR1, r9
767 rfi
768
7692:
770
771 li r3, 0
772 tlbwe r3, r23, PPC44x_TLB_PAGEID
773
774
775 li r5, 0
776 ori r5, r5, (PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G)
777
778
779 xori r7, r7, 1
780
781 li r8, 0
782 li r6, 3
783
784next_tlb:
785 rotlwi r3, r8, 28
786 mr r4, r3
787 ori r3, r3, (PPC44x_TLB_VALID | PPC44x_TLB_256M)
788 insrwi r3, r7, 1, 23
789
790 tlbwe r3, r6, PPC44x_TLB_PAGEID
791 tlbwe r4, r6, PPC44x_TLB_XLAT
792 tlbwe r5, r6, PPC44x_TLB_ATTRIB
793
794 addi r8, r8, 1
795 addi r6, r6, 1
796 cmpwi r8, 8
797 bne next_tlb
798 isync
799
800
801 li r9,0
802 insrwi r9, r7, 1, 26
803
804 bl 1f
8051: mflr r8
806 and r8, r8, r11
807 addi r8, r8, (2f-1b)
808
809 and r5, r25, r10
810 or r8, r8, r5
811
812 mtspr SPRN_SRR0, r8
813 mtspr SPRN_SRR1, r9
814 rfi
8152:
816
817 li r3, 0
818 tlbwe r3, r24, PPC44x_TLB_PAGEID
819 sync
820 b ppc44x_map_done
821
822#ifdef CONFIG_PPC_47x
823
824
825
826setup_map_47x:
827
828
829
830
831
832 li r3, 0
833 mtspr SPRN_PID, r3
834 mfmsr r4
835 andi. r4, r4, MSR_IS@l
836 beq 1f
837 oris r3, r3, PPC47x_MMUCR_STS@h
8381: mtspr SPRN_MMUCR, r3
839 sync
840
841
842 bl 2f
8432: mflr r23
844 tlbsx r23, 0, r23
845 tlbre r24, r23, 0
846 tlbre r25, r23, 1
847 tlbre r26, r23, 2
848
849
850
851
852
853
854
855
856
857 addis r3, 0, 0x8000
858 addi r4, 0, 0
859 addi r5, 0, 0
860 b clear_utlb_entry
861
862
863 .align 6
864
865clear_utlb_entry:
866
867 tlbwe r4, r3, 0
868 tlbwe r5, r3, 1
869 tlbwe r5, r3, 2
870 addis r3, r3, 0x2000
871 cmpwi r3, 0
872 bne clear_utlb_entry
873 addis r3, 0, 0x8000
874 addis r4, r4, 0x100
875 cmpwi r4, 0
876 bne clear_utlb_entry
877
878
879 mfmsr r5
880 rlwinm r7, r5, 27, 31, 31
881 xori r7, r7, 1
882
883 insrwi r24, r7, 1, 21
884
885
886
887
888
889 lis r3, 0x8000
890
891 tlbwe r24, r3, 0
892 tlbwe r25, r3, 1
893 tlbwe r26, r3, 2
894
895
896 insrwi r5, r7, 1, 26
897
898 bl 1f
8991: mflr r6
900 addi r6, r6, (2f-1b)
901
902 mtspr SPRN_SRR0, r6
903 mtspr SPRN_SRR1, r5
904 rfi
905
906
907
908
909
9102:
911 li r3, 0
912 li r4, 0
913 li r5, 0
914 li r6, 0
915 ori r6, r6, PPC47x_TLB2_S_RWX
916
917 li r8, 0
918
919 xori r7, r7, 1
920
921write_utlb:
922 rotlwi r5, r8, 28
923
924
925 mr r4, r5
926 ori r4, r4, (PPC47x_TLB0_VALID | PPC47x_TLB0_256M)
927 insrwi r4, r7, 1, 21
928
929 tlbwe r4, r3, 0
930 tlbwe r5, r3, 1
931 tlbwe r6, r3, 2
932 addi r8, r8, 1
933 cmpwi r8, 8
934 bne write_utlb
935
936
937 isync
938
939
940
941
942
943
944
945
946 rlwinm r10, r24, 0, 22, 27
947
948 cmpwi r10, PPC47x_TLB0_4K
949 bne 0f
950 li r10, 0x1000
951 bl 1f
952
9530:
954
955 lis r10, 0x1000
956
957 bl 1f
9581: mflr r4
959 addi r4, r4, (2f-1b)
960
961 subi r11, r10, 1
962 not r10, r11
963
964 and r5, r25, r10
965 and r6, r4, r11
966
967 or r5, r5, r6
968
969
970 mfmsr r8
971 insrwi r8, r7, 1, 26
972
973 mtspr SPRN_SRR1, r8
974 mtspr SPRN_SRR0, r5
975 rfi
976
9772:
978
979 lis r3, 0x8000
980
981 clrrwi r24, r24, 12
982 tlbwe r24, r3, 0
983 tlbwe r25, r3, 1
984 tlbwe r26, r3, 2
985
986
987 isync
988
989#endif
990
991ppc44x_map_done:
992
993
994
995 mr r3, r29
996 mr r4, r30
997 mr r5, r31
998
999 li r0, 0
1000#else
1001 li r0, 0
1002
1003
1004
1005
1006
1007
1008 mr r8, r0
1009 ori r8, r8, MSR_RI|MSR_ME
1010 mtspr SPRN_SRR1, r8
1011 addi r8, r4, 1f - relocate_new_kernel
1012 mtspr SPRN_SRR0, r8
1013 sync
1014 rfi
1015
10161:
1017#endif
1018
1019
1020
1021
1022
1023 addi r1, r4, KEXEC_CONTROL_PAGE_SIZE - 8
1024 stw r0, 0(r1)
1025
1026
1027 li r6, 0
1028 mr r0, r3
1029 b 1f
1030
10310:
1032 lwzu r0, 4(r3)
1033
10341:
1035
1036 rlwinm. r7, r0, 0, 31, 31
1037 beq 2f
1038
1039 rlwinm r8, r0, 0, 0, 19
1040 b 0b
1041
10422:
1043 rlwinm. r7, r0, 0, 30, 30
1044 beq 2f
1045
1046 rlwinm r3, r0, 0, 0, 19
1047 subi r3, r3, 4
1048 b 0b
1049
10502:
1051 rlwinm. r7, r0, 0, 29, 29
1052 beq 2f
1053 b 3f
1054
10552:
1056 rlwinm. r7, r0, 0, 28, 28
1057 beq 0b
1058
1059 rlwinm r9, r0, 0, 0, 19
1060
1061 li r7, PAGE_SIZE / 4
1062 mtctr r7
1063 subi r9, r9, 4
1064 subi r8, r8, 4
10659:
1066 lwzu r0, 4(r9)
1067 xor r6, r6, r0
1068 stwu r0, 4(r8)
1069 dcbst 0, r8
1070 sync
1071 icbi 0, r8
1072 bdnz 9b
1073
1074 addi r9, r9, 4
1075 addi r8, r8, 4
1076 b 0b
1077
10783:
1079
1080
1081
1082
1083 isync
1084 sync
1085
1086 mfspr r3, SPRN_PIR
1087 mr r4, r5
1088
1089
1090 mtlr r5
1091 blrl
1092
10931: b 1b
1094
1095relocate_new_kernel_end:
1096
1097 .globl relocate_new_kernel_size
1098relocate_new_kernel_size:
1099 .long relocate_new_kernel_end - relocate_new_kernel
1100#endif
1101