0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/init.h>
0028 #include <linux/pgtable.h>
0029 #include <asm/processor.h>
0030 #include <asm/page.h>
0031 #include <asm/mmu.h>
0032 #include <asm/cputable.h>
0033 #include <asm/thread_info.h>
0034 #include <asm/ppc_asm.h>
0035 #include <asm/asm-offsets.h>
0036 #include <asm/ptrace.h>
0037 #include <asm/synch.h>
0038 #include <asm/export.h>
0039 #include <asm/code-patching-asm.h>
0040 #include "head_booke.h"
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 __HEAD
0055 _GLOBAL(_stext);
0056 _GLOBAL(_start);
0057
0058
0059
0060
0061 nop
0062 mr r31,r3
0063 li r24,0
0064
0065 #ifdef CONFIG_RELOCATABLE
0066
0067
0068
0069
0070
0071
0072
0073 bcl 20,31,$+4
0074 0: mflr r21
0075 addis r21,r21,(_stext - 0b)@ha
0076 addi r21,r21,(_stext - 0b)@l
0077
0078
0079
0080
0081
0082
0083
0084 lis r4,KERNELBASE@h
0085 ori r4,r4,KERNELBASE@l
0086 rlwinm r6,r21,0,4,31
0087 rlwinm r5,r4,0,4,31
0088 subf r3,r5,r6
0089 add r3,r4,r3
0090
0091 bl relocate
0092 #endif
0093
0094 bl init_cpu_state
0095
0096
0097
0098
0099
0100
0101 lis r2,init_task@h
0102 ori r2,r2,init_task@l
0103
0104
0105 addi r4,r2,THREAD
0106 mtspr SPRN_SPRG_THREAD,r4
0107
0108
0109 lis r1,init_thread_union@h
0110 ori r1,r1,init_thread_union@l
0111 li r0,0
0112 stwu r0,THREAD_SIZE-STACK_FRAME_OVERHEAD(r1)
0113
0114 bl early_init
0115
0116 #ifdef CONFIG_RELOCATABLE
0117
0118
0119
0120
0121
0122
0123
0124 lis r3,kernstart_addr@ha
0125 la r3,kernstart_addr@l(r3)
0126
0127
0128
0129
0130
0131
0132 rlwinm r6,r25,0,28,31
0133 rlwinm r7,r25,0,0,3
0134 rlwinm r8,r21,0,4,31
0135 or r8,r7,r8
0136
0137
0138 stw r6,0(r3)
0139 stw r8,4(r3)
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 li r4, 0
0157 lis r5,KERNELBASE@h
0158 rlwinm r5,r5,0,0,3
0159
0160
0161
0162
0163 subfc r5,r7,r5
0164 subfe r4,r6,r4
0165
0166
0167 lis r3,virt_phys_offset@ha
0168 la r3,virt_phys_offset@l(r3)
0169
0170 stw r4,0(r3)
0171 stw r5,4(r3)
0172
0173 #elif defined(CONFIG_DYNAMIC_MEMSTART)
0174
0175
0176
0177
0178
0179
0180
0181
0182 lis r3,kernstart_addr@ha
0183 la r3,kernstart_addr@l(r3)
0184
0185 lis r4,KERNELBASE@h
0186 ori r4,r4,KERNELBASE@l
0187 lis r5,PAGE_OFFSET@h
0188 ori r5,r5,PAGE_OFFSET@l
0189 subf r4,r5,r4
0190
0191 rlwinm r6,r25,0,28,31
0192 rlwinm r7,r25,0,0,3
0193 add r7,r7,r4
0194
0195 stw r6,0(r3)
0196 stw r7,4(r3)
0197 #endif
0198
0199
0200
0201
0202 #ifdef CONFIG_KASAN
0203 bl kasan_early_init
0204 #endif
0205 li r3,0
0206 mr r4,r31
0207 bl machine_init
0208 bl MMU_init
0209
0210
0211 lis r6, swapper_pg_dir@h
0212 ori r6, r6, swapper_pg_dir@l
0213 lis r5, abatron_pteptrs@h
0214 ori r5, r5, abatron_pteptrs@l
0215 lis r4, KERNELBASE@h
0216 ori r4, r4, KERNELBASE@l
0217 stw r5, 0(r4)
0218 stw r6, 0(r5)
0219
0220
0221 li r0,0
0222 mtspr SPRN_MCSR,r0
0223
0224
0225 lis r4,start_kernel@h
0226 ori r4,r4,start_kernel@l
0227 lis r3,MSR_KERNEL@h
0228 ori r3,r3,MSR_KERNEL@l
0229 mtspr SPRN_SRR0,r4
0230 mtspr SPRN_SRR1,r3
0231 rfi
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250 interrupt_base:
0251
0252 CRITICAL_EXCEPTION(0x0100, CRITICAL, CriticalInput, unknown_exception)
0253
0254
0255 CRITICAL_EXCEPTION(0x0200, MACHINE_CHECK, MachineCheck, \
0256 machine_check_exception)
0257 MCHECK_EXCEPTION(0x0210, MachineCheckA, machine_check_exception)
0258
0259
0260 DATA_STORAGE_EXCEPTION
0261
0262
0263 INSTRUCTION_STORAGE_EXCEPTION
0264
0265
0266 EXCEPTION(0x0500, BOOKE_INTERRUPT_EXTERNAL, ExternalInput, do_IRQ)
0267
0268
0269 ALIGNMENT_EXCEPTION
0270
0271
0272 PROGRAM_EXCEPTION
0273
0274
0275 #ifdef CONFIG_PPC_FPU
0276 FP_UNAVAILABLE_EXCEPTION
0277 #else
0278 EXCEPTION(0x2010, BOOKE_INTERRUPT_FP_UNAVAIL, \
0279 FloatingPointUnavailable, unknown_exception)
0280 #endif
0281
0282 START_EXCEPTION(SystemCall)
0283 SYSCALL_ENTRY 0xc00 BOOKE_INTERRUPT_SYSCALL
0284
0285
0286 EXCEPTION(0x2020, BOOKE_INTERRUPT_AP_UNAVAIL, \
0287 AuxillaryProcessorUnavailable, unknown_exception)
0288
0289
0290 DECREMENTER_EXCEPTION
0291
0292
0293
0294 EXCEPTION(0x1010, BOOKE_INTERRUPT_FIT, FixedIntervalTimer, unknown_exception)
0295
0296
0297
0298 #ifdef CONFIG_BOOKE_WDT
0299 CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, WatchdogException)
0300 #else
0301 CRITICAL_EXCEPTION(0x1020, WATCHDOG, WatchdogTimer, unknown_exception)
0302 #endif
0303
0304
0305 START_EXCEPTION(DataTLBError44x)
0306 mtspr SPRN_SPRG_WSCRATCH0, r10
0307 mtspr SPRN_SPRG_WSCRATCH1, r11
0308 mtspr SPRN_SPRG_WSCRATCH2, r12
0309 mtspr SPRN_SPRG_WSCRATCH3, r13
0310 mfcr r11
0311 mtspr SPRN_SPRG_WSCRATCH4, r11
0312 mfspr r10, SPRN_DEAR
0313
0314
0315
0316
0317 lis r11, PAGE_OFFSET@h
0318 cmplw r10, r11
0319 blt+ 3f
0320 lis r11, swapper_pg_dir@h
0321 ori r11, r11, swapper_pg_dir@l
0322
0323 mfspr r12,SPRN_MMUCR
0324 rlwinm r12,r12,0,0,23
0325
0326 b 4f
0327
0328
0329 3:
0330 mfspr r11,SPRN_SPRG_THREAD
0331 lwz r11,PGDIR(r11)
0332
0333
0334 mfspr r12,SPRN_MMUCR
0335 mfspr r13,SPRN_PID
0336 rlwimi r12,r13,0,24,31
0337 #ifdef CONFIG_PPC_KUAP
0338 cmpwi r13,0
0339 beq 2f
0340 #endif
0341
0342 4:
0343 mtspr SPRN_MMUCR,r12
0344
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358 mfspr r12,SPRN_ESR
0359 li r13,_PAGE_PRESENT|_PAGE_ACCESSED
0360 rlwimi r13,r12,10,30,30
0361
0362
0363
0364 rlwinm r12, r10, PPC44x_PGD_OFF_SHIFT, PPC44x_PGD_OFF_MASK_BIT, 29
0365 lwzx r11, r12, r11
0366 rlwinm. r12, r11, 0, 0, 20
0367 beq 2f
0368
0369
0370 rlwimi r12, r10, PPC44x_PTE_ADD_SHIFT, PPC44x_PTE_ADD_MASK_BIT, 28
0371 lwz r11, 0(r12)
0372 lwz r12, 4(r12)
0373
0374 lis r10,tlb_44x_index@ha
0375
0376 andc. r13,r13,r12
0377
0378
0379 lwz r13,tlb_44x_index@l(r10)
0380
0381 bne 2f
0382
0383
0384 addi r13,r13,1
0385
0386 patch_site 0f, patch__tlb_44x_hwater_D
0387
0388 0: cmpwi 0,r13,1
0389 ble 5f
0390 li r13,0
0391 5:
0392
0393 stw r13,tlb_44x_index@l(r10)
0394
0395
0396 mfspr r10,SPRN_DEAR
0397
0398
0399 b finish_tlb_load_44x
0400
0401 2:
0402
0403
0404
0405 mfspr r11, SPRN_SPRG_RSCRATCH4
0406 mtcr r11
0407 mfspr r13, SPRN_SPRG_RSCRATCH3
0408 mfspr r12, SPRN_SPRG_RSCRATCH2
0409 mfspr r11, SPRN_SPRG_RSCRATCH1
0410 mfspr r10, SPRN_SPRG_RSCRATCH0
0411 b DataStorage
0412
0413
0414
0415
0416
0417
0418
0419 START_EXCEPTION(InstructionTLBError44x)
0420 mtspr SPRN_SPRG_WSCRATCH0, r10
0421 mtspr SPRN_SPRG_WSCRATCH1, r11
0422 mtspr SPRN_SPRG_WSCRATCH2, r12
0423 mtspr SPRN_SPRG_WSCRATCH3, r13
0424 mfcr r11
0425 mtspr SPRN_SPRG_WSCRATCH4, r11
0426 mfspr r10, SPRN_SRR0
0427
0428
0429
0430
0431 lis r11, PAGE_OFFSET@h
0432 cmplw r10, r11
0433 blt+ 3f
0434 lis r11, swapper_pg_dir@h
0435 ori r11, r11, swapper_pg_dir@l
0436
0437 mfspr r12,SPRN_MMUCR
0438 rlwinm r12,r12,0,0,23
0439
0440 b 4f
0441
0442
0443 3:
0444 mfspr r11,SPRN_SPRG_THREAD
0445 lwz r11,PGDIR(r11)
0446
0447
0448 mfspr r12,SPRN_MMUCR
0449 mfspr r13,SPRN_PID
0450 rlwimi r12,r13,0,24,31
0451 #ifdef CONFIG_PPC_KUAP
0452 cmpwi r13,0
0453 beq 2f
0454 #endif
0455
0456 4:
0457 mtspr SPRN_MMUCR,r12
0458
0459
0460 li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
0461
0462
0463 rlwinm r12, r10, PPC44x_PGD_OFF_SHIFT, PPC44x_PGD_OFF_MASK_BIT, 29
0464 lwzx r11, r12, r11
0465 rlwinm. r12, r11, 0, 0, 20
0466 beq 2f
0467
0468
0469 rlwimi r12, r10, PPC44x_PTE_ADD_SHIFT, PPC44x_PTE_ADD_MASK_BIT, 28
0470 lwz r11, 0(r12)
0471 lwz r12, 4(r12)
0472
0473 lis r10,tlb_44x_index@ha
0474
0475 andc. r13,r13,r12
0476
0477
0478 lwz r13,tlb_44x_index@l(r10)
0479
0480 bne 2f
0481
0482
0483 addi r13,r13,1
0484
0485 patch_site 0f, patch__tlb_44x_hwater_I
0486
0487 0: cmpwi 0,r13,1
0488 ble 5f
0489 li r13,0
0490 5:
0491
0492 stw r13,tlb_44x_index@l(r10)
0493
0494
0495 mfspr r10,SPRN_SRR0
0496
0497
0498 b finish_tlb_load_44x
0499
0500 2:
0501
0502
0503
0504 mfspr r11, SPRN_SPRG_RSCRATCH4
0505 mtcr r11
0506 mfspr r13, SPRN_SPRG_RSCRATCH3
0507 mfspr r12, SPRN_SPRG_RSCRATCH2
0508 mfspr r11, SPRN_SPRG_RSCRATCH1
0509 mfspr r10, SPRN_SPRG_RSCRATCH0
0510 b InstructionStorage
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522 finish_tlb_load_44x:
0523
0524 rlwimi r11,r12,0,0,31-PAGE_SHIFT
0525 tlbwe r11,r13,PPC44x_TLB_XLAT
0526
0527
0528
0529
0530
0531 li r11,PPC44x_TLB_VALID | PPC44x_TLBE_SIZE
0532
0533 rlwimi r10,r11,0,PPC44x_PTE_ADD_MASK_BIT,31
0534 tlbwe r10,r13,PPC44x_TLB_PAGEID
0535
0536
0537 li r10,0xf85
0538 rlwimi r10,r12,29,30,30
0539 and r11,r12,r10
0540 andi. r10,r12,_PAGE_USER
0541 beq 1f
0542 rlwimi r11,r11,3,26,28
0543 rlwinm r11,r11,0,~PPC44x_TLB_SX
0544 1: tlbwe r11,r13,PPC44x_TLB_ATTRIB
0545
0546
0547
0548 mfspr r11, SPRN_SPRG_RSCRATCH4
0549 mtcr r11
0550 mfspr r13, SPRN_SPRG_RSCRATCH3
0551 mfspr r12, SPRN_SPRG_RSCRATCH2
0552 mfspr r11, SPRN_SPRG_RSCRATCH1
0553 mfspr r10, SPRN_SPRG_RSCRATCH0
0554 rfi
0555
0556
0557
0558 #ifdef CONFIG_PPC_47x
0559 START_EXCEPTION(DataTLBError47x)
0560 mtspr SPRN_SPRG_WSCRATCH0,r10
0561 mtspr SPRN_SPRG_WSCRATCH1,r11
0562 mtspr SPRN_SPRG_WSCRATCH2,r12
0563 mtspr SPRN_SPRG_WSCRATCH3,r13
0564 mfcr r11
0565 mtspr SPRN_SPRG_WSCRATCH4,r11
0566 mfspr r10,SPRN_DEAR
0567
0568
0569
0570
0571 lis r11,PAGE_OFFSET@h
0572 cmplw cr0,r10,r11
0573 blt+ 3f
0574 lis r11,swapper_pg_dir@h
0575 ori r11,r11, swapper_pg_dir@l
0576 li r12,0
0577 b 4f
0578
0579
0580 3: mfspr r11,SPRN_SPRG3
0581 lwz r11,PGDIR(r11)
0582 mfspr r12,SPRN_PID
0583 #ifdef CONFIG_PPC_KUAP
0584 cmpwi r12,0
0585 beq 2f
0586 #endif
0587 4: mtspr SPRN_MMUCR,r12
0588
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602 mfspr r12,SPRN_ESR
0603 li r13,_PAGE_PRESENT|_PAGE_ACCESSED
0604 rlwimi r13,r12,10,30,30
0605
0606
0607
0608 rlwinm r12,r10,PPC44x_PGD_OFF_SHIFT,PPC44x_PGD_OFF_MASK_BIT,29
0609 lwzx r11,r12,r11
0610
0611
0612 li r12,PPC47x_TLB0_VALID | PPC47x_TLBE_SIZE
0613 rlwimi r10,r12,0,32-PAGE_SHIFT,31
0614 li r12,0
0615 tlbwe r10,r12,0
0616
0617
0618
0619 #ifdef CONFIG_SMP
0620 isync
0621 #endif
0622
0623 rlwinm. r12,r11,0,0,20
0624
0625 rlwimi r12,r10,PPC44x_PTE_ADD_SHIFT,PPC44x_PTE_ADD_MASK_BIT,28
0626 beq 2f
0627 lwz r11,0(r12)
0628
0629
0630
0631
0632
0633 #ifdef CONFIG_SMP
0634 lwsync
0635 #endif
0636 lwz r12,4(r12)
0637
0638 andc. r13,r13,r12
0639
0640
0641 beq finish_tlb_load_47x
0642
0643 2:
0644
0645
0646 mfspr r11,SPRN_SPRG_RSCRATCH4
0647 mtcr r11
0648 mfspr r13,SPRN_SPRG_RSCRATCH3
0649 mfspr r12,SPRN_SPRG_RSCRATCH2
0650 mfspr r11,SPRN_SPRG_RSCRATCH1
0651 mfspr r10,SPRN_SPRG_RSCRATCH0
0652 b DataStorage
0653
0654
0655
0656
0657
0658
0659
0660 START_EXCEPTION(InstructionTLBError47x)
0661 mtspr SPRN_SPRG_WSCRATCH0,r10
0662 mtspr SPRN_SPRG_WSCRATCH1,r11
0663 mtspr SPRN_SPRG_WSCRATCH2,r12
0664 mtspr SPRN_SPRG_WSCRATCH3,r13
0665 mfcr r11
0666 mtspr SPRN_SPRG_WSCRATCH4,r11
0667 mfspr r10,SPRN_SRR0
0668
0669
0670
0671
0672 lis r11,PAGE_OFFSET@h
0673 cmplw cr0,r10,r11
0674 blt+ 3f
0675 lis r11,swapper_pg_dir@h
0676 ori r11,r11, swapper_pg_dir@l
0677 li r12,0
0678 b 4f
0679
0680
0681 3: mfspr r11,SPRN_SPRG_THREAD
0682 lwz r11,PGDIR(r11)
0683 mfspr r12,SPRN_PID
0684 #ifdef CONFIG_PPC_KUAP
0685 cmpwi r12,0
0686 beq 2f
0687 #endif
0688 4: mtspr SPRN_MMUCR,r12
0689
0690
0691 li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
0692
0693
0694
0695 rlwinm r12,r10,PPC44x_PGD_OFF_SHIFT,PPC44x_PGD_OFF_MASK_BIT,29
0696 lwzx r11,r12,r11
0697
0698
0699 li r12,PPC47x_TLB0_VALID | PPC47x_TLBE_SIZE
0700 rlwimi r10,r12,0,32-PAGE_SHIFT,31
0701 li r12,0
0702 tlbwe r10,r12,0
0703
0704
0705
0706 #ifdef CONFIG_SMP
0707 isync
0708 #endif
0709
0710 rlwinm. r12,r11,0,0,20
0711
0712 rlwimi r12,r10,PPC44x_PTE_ADD_SHIFT,PPC44x_PTE_ADD_MASK_BIT,28
0713 beq 2f
0714
0715 lwz r11,0(r12)
0716
0717
0718
0719
0720 #ifdef CONFIG_SMP
0721 lwsync
0722 #endif
0723 lwz r12,4(r12)
0724
0725 andc. r13,r13,r12
0726
0727
0728 beq finish_tlb_load_47x
0729
0730 2:
0731
0732
0733 mfspr r11, SPRN_SPRG_RSCRATCH4
0734 mtcr r11
0735 mfspr r13, SPRN_SPRG_RSCRATCH3
0736 mfspr r12, SPRN_SPRG_RSCRATCH2
0737 mfspr r11, SPRN_SPRG_RSCRATCH1
0738 mfspr r10, SPRN_SPRG_RSCRATCH0
0739 b InstructionStorage
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751 finish_tlb_load_47x:
0752
0753 rlwimi r11,r12,0,0,31-PAGE_SHIFT
0754 tlbwe r11,r13,1
0755
0756
0757 li r10,0xf85
0758 rlwimi r10,r12,29,30,30
0759 and r11,r12,r10
0760 andi. r10,r12,_PAGE_USER
0761 beq 1f
0762 rlwimi r11,r11,3,26,28
0763 rlwinm r11,r11,0,~PPC47x_TLB2_SX
0764 1: tlbwe r11,r13,2
0765
0766
0767
0768 mfspr r11, SPRN_SPRG_RSCRATCH4
0769 mtcr r11
0770 mfspr r13, SPRN_SPRG_RSCRATCH3
0771 mfspr r12, SPRN_SPRG_RSCRATCH2
0772 mfspr r11, SPRN_SPRG_RSCRATCH1
0773 mfspr r10, SPRN_SPRG_RSCRATCH0
0774 rfi
0775
0776 #endif
0777
0778
0779
0780
0781
0782
0783
0784 DEBUG_CRIT_EXCEPTION
0785
0786 interrupt_end:
0787
0788
0789
0790
0791
0792
0793
0794
0795 _GLOBAL(__fixup_440A_mcheck)
0796 li r3,MachineCheckA@l
0797 mtspr SPRN_IVOR1,r3
0798 sync
0799 blr
0800
0801
0802
0803
0804
0805
0806 _GLOBAL(init_cpu_state)
0807 mflr r22
0808 #ifdef CONFIG_PPC_47x
0809
0810 mfspr r3,SPRN_PVR
0811 srwi r3,r3,16
0812 cmplwi cr0,r3,PVR_476FPE@h
0813 beq head_start_47x
0814 cmplwi cr0,r3,PVR_476@h
0815 beq head_start_47x
0816 cmplwi cr0,r3,PVR_476_ISS@h
0817 beq head_start_47x
0818 #endif
0819
0820
0821
0822
0823
0824 mfspr r3,SPRN_CCR0
0825 rlwinm r3,r3,0,0,27
0826 isync
0827 mtspr SPRN_CCR0,r3
0828 isync
0829 sync
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858 mfspr r3,SPRN_PID
0859 mfmsr r4
0860 andi. r4,r4,MSR_IS@l
0861 beq wmmucr
0862 oris r3,r3,PPC44x_MMUCR_STS@h
0863 wmmucr: mtspr SPRN_MMUCR,r3
0864 sync
0865
0866 bcl 20,31,$+4
0867 invstr: mflr r5
0868 tlbsx r23,0,r5
0869 li r4,0
0870 li r3,0
0871 1: cmpw r23,r4
0872 beq skpinv
0873 tlbwe r3,r4,PPC44x_TLB_PAGEID
0874 skpinv: addi r4,r4,1
0875 cmpwi r4,64
0876 bne 1b
0877 isync
0878
0879
0880
0881
0882 #ifdef CONFIG_NONSTATIC_KERNEL
0883
0884
0885
0886
0887
0888
0889
0890 tlbre r25,r23,PPC44x_TLB_XLAT
0891
0892 lis r3,KERNELBASE@h
0893 ori r3,r3,KERNELBASE@l
0894
0895
0896 mr r4,r25
0897 #else
0898
0899 lis r3,PAGE_OFFSET@h
0900 ori r3,r3,PAGE_OFFSET@l
0901
0902
0903 li r4, 0
0904 #endif
0905
0906
0907 li r0,0
0908 mtspr SPRN_PID,r0
0909 sync
0910
0911
0912 li r5,0
0913 mtspr SPRN_MMUCR,r5
0914 sync
0915
0916
0917 clrrwi r3,r3,10
0918 ori r3,r3,PPC44x_TLB_VALID | PPC44x_TLB_256M
0919
0920
0921 clrrwi r4,r4,10
0922
0923
0924
0925
0926 li r5,0
0927 ori r5,r5,(PPC44x_TLB_SW | PPC44x_TLB_SR | PPC44x_TLB_SX | PPC44x_TLB_G)
0928
0929 li r0,63
0930
0931 tlbwe r3,r0,PPC44x_TLB_PAGEID
0932 tlbwe r4,r0,PPC44x_TLB_XLAT
0933 tlbwe r5,r0,PPC44x_TLB_ATTRIB
0934
0935
0936 mfmsr r0
0937 mtspr SPRN_SRR1, r0
0938 lis r0,3f@h
0939 ori r0,r0,3f@l
0940 mtspr SPRN_SRR0,r0
0941 sync
0942 rfi
0943
0944
0945 3: cmpwi r23,63
0946 beq 4f
0947 li r6,0
0948 tlbwe r6,r23,PPC44x_TLB_PAGEID
0949 isync
0950
0951 4:
0952 #ifdef CONFIG_PPC_EARLY_DEBUG_44x
0953
0954
0955
0956 lis r3,PPC44x_EARLY_DEBUG_VIRTADDR@h
0957 ori r3,r3,PPC44x_TLB_VALID|PPC44x_TLB_TS|PPC44x_TLB_64K
0958
0959
0960 lis r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW@h
0961 ori r4,r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH
0962
0963
0964 li r5,(PPC44x_TLB_SW|PPC44x_TLB_SR|PPC44x_TLB_I|PPC44x_TLB_G)
0965 li r0,62
0966
0967 tlbwe r3,r0,PPC44x_TLB_PAGEID
0968 tlbwe r4,r0,PPC44x_TLB_XLAT
0969 tlbwe r5,r0,PPC44x_TLB_ATTRIB
0970
0971
0972 isync
0973 #endif
0974
0975
0976 SET_IVOR(0, CriticalInput);
0977 SET_IVOR(1, MachineCheck);
0978 SET_IVOR(2, DataStorage);
0979 SET_IVOR(3, InstructionStorage);
0980 SET_IVOR(4, ExternalInput);
0981 SET_IVOR(5, Alignment);
0982 SET_IVOR(6, Program);
0983 SET_IVOR(7, FloatingPointUnavailable);
0984 SET_IVOR(8, SystemCall);
0985 SET_IVOR(9, AuxillaryProcessorUnavailable);
0986 SET_IVOR(10, Decrementer);
0987 SET_IVOR(11, FixedIntervalTimer);
0988 SET_IVOR(12, WatchdogTimer);
0989 SET_IVOR(13, DataTLBError44x);
0990 SET_IVOR(14, InstructionTLBError44x);
0991 SET_IVOR(15, DebugCrit);
0992
0993 b head_start_common
0994
0995
0996 #ifdef CONFIG_PPC_47x
0997
0998 #ifdef CONFIG_SMP
0999
1000
1001 _GLOBAL(start_secondary_47x)
1002 mr r24,r3
1003
1004 bl init_cpu_state
1005
1006
1007
1008
1009
1010
1011
1012
1013 lis r1,temp_boot_stack@h
1014 ori r1,r1,temp_boot_stack@l
1015 addi r1,r1,1024-STACK_FRAME_OVERHEAD
1016 li r0,0
1017 stw r0,0(r1)
1018 bl mmu_init_secondary
1019
1020
1021
1022
1023 lis r2,secondary_current@ha
1024 lwz r2,secondary_current@l(r2)
1025 lwz r1,TASK_STACK(r2)
1026
1027
1028 addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
1029 li r0,0
1030 stw r0,0(r1)
1031
1032
1033 addi r4,r2,THREAD
1034 mtspr SPRN_SPRG3,r4
1035
1036 b start_secondary
1037
1038 #endif
1039
1040
1041
1042
1043
1044
1045
1046
1047 head_start_47x:
1048
1049 mfspr r3,SPRN_PID
1050 mfmsr r4
1051 andi. r4,r4,MSR_IS@l
1052 beq 1f
1053 oris r3,r3,PPC47x_MMUCR_STS@h
1054 1: mtspr SPRN_MMUCR,r3
1055 sync
1056
1057
1058 bcl 20,31,$+4
1059 1: mflr r23
1060 tlbsx r23,0,r23
1061 tlbre r24,r23,0
1062 tlbre r25,r23,1
1063 tlbre r26,r23,2
1064
1065
1066
1067
1068
1069
1070 li r5,0
1071 mtspr SPRN_MMUCR,r5
1072 sync
1073
1074 clear_all_utlb_entries:
1075
1076 #; Set initial values.
1077
1078 addis r3,0,0x8000
1079 addi r4,0,0
1080 addi r5,0,0
1081 b clear_utlb_entry
1082
1083 #; Align the loop to speed things up.
1084
1085 .align 6
1086
1087 clear_utlb_entry:
1088
1089 tlbwe r4,r3,0
1090 tlbwe r5,r3,1
1091 tlbwe r5,r3,2
1092 addis r3,r3,0x2000
1093 cmpwi r3,0
1094 bne clear_utlb_entry
1095 addis r3,0,0x8000
1096 addis r4,r4,0x100
1097 cmpwi r4,0
1098 bne clear_utlb_entry
1099
1100 #; Restore original entry.
1101
1102 oris r23,r23,0x8000
1103 tlbwe r24,r23,0
1104 tlbwe r25,r23,1
1105 tlbwe r26,r23,2
1106
1107
1108
1109
1110
1111 lis r3,PAGE_OFFSET@h
1112 ori r3,r3,PAGE_OFFSET@l
1113
1114
1115 li r0,0
1116 mtspr SPRN_PID,r0
1117 sync
1118
1119
1120 clrrwi r3,r3,12
1121 ori r3,r3,PPC47x_TLB0_VALID | PPC47x_TLB0_256M
1122
1123
1124
1125
1126 li r5,0
1127 ori r5,r5,PPC47x_TLB2_S_RWX
1128 #ifdef CONFIG_SMP
1129 ori r5,r5,PPC47x_TLB2_M
1130 #endif
1131
1132
1133 lis r0,0x8800
1134 tlbwe r3,r0,0
1135 tlbwe r25,r0,1
1136 tlbwe r5,r0,2
1137
1138
1139
1140
1141
1142 LOAD_REG_IMMEDIATE(r3, 0x9abcdef0)
1143 mtspr SPRN_SSPCR,r3
1144 mtspr SPRN_USPCR,r3
1145 LOAD_REG_IMMEDIATE(r3, 0x12345670)
1146 mtspr SPRN_ISPCR,r3
1147
1148
1149 mfmsr r0
1150 mtspr SPRN_SRR1, r0
1151 lis r0,3f@h
1152 ori r0,r0,3f@l
1153 mtspr SPRN_SRR0,r0
1154 sync
1155 rfi
1156
1157
1158 3:
1159 rlwinm r24,r24,0,21,19
1160 tlbwe r24,r23,0
1161 addi r24,0,0
1162 tlbwe r24,r23,1
1163 tlbwe r24,r23,2
1164 isync
1165
1166 #ifdef CONFIG_PPC_EARLY_DEBUG_44x
1167
1168
1169
1170 lis r3,PPC44x_EARLY_DEBUG_VIRTADDR@h
1171 ori r3,r3,PPC47x_TLB0_VALID | PPC47x_TLB0_TS | PPC47x_TLB0_1M
1172
1173
1174 lis r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSLOW@h
1175 ori r4,r4,CONFIG_PPC_EARLY_DEBUG_44x_PHYSHIGH
1176
1177
1178 li r5,(PPC47x_TLB2_S_RW | PPC47x_TLB2_IMG)
1179
1180
1181
1182
1183
1184 lis r0,0x8d00
1185 tlbwe r3,r0,0
1186 tlbwe r4,r0,1
1187 tlbwe r5,r0,2
1188
1189
1190 isync
1191 #endif
1192
1193
1194 SET_IVOR(0, CriticalInput);
1195 SET_IVOR(1, MachineCheckA);
1196 SET_IVOR(2, DataStorage);
1197 SET_IVOR(3, InstructionStorage);
1198 SET_IVOR(4, ExternalInput);
1199 SET_IVOR(5, Alignment);
1200 SET_IVOR(6, Program);
1201 SET_IVOR(7, FloatingPointUnavailable);
1202 SET_IVOR(8, SystemCall);
1203 SET_IVOR(9, AuxillaryProcessorUnavailable);
1204 SET_IVOR(10, Decrementer);
1205 SET_IVOR(11, FixedIntervalTimer);
1206 SET_IVOR(12, WatchdogTimer);
1207 SET_IVOR(13, DataTLBError47x);
1208 SET_IVOR(14, InstructionTLBError47x);
1209 SET_IVOR(15, DebugCrit);
1210
1211
1212
1213
1214
1215
1216 mfspr r3,SPRN_CCR0
1217 oris r3,r3,0x0020
1218 ori r3,r3,0x0040
1219 mtspr SPRN_CCR0,r3
1220 isync
1221
1222 #endif
1223
1224
1225
1226
1227
1228
1229
1230 head_start_common:
1231
1232 lis r4,interrupt_base@h
1233 mtspr SPRN_IVPR,r4
1234
1235
1236
1237
1238
1239
1240 rlwinm r22,r22,0,4,31
1241 addis r22,r22,PAGE_OFFSET@h
1242 mtlr r22
1243 isync
1244 blr
1245
1246 #ifdef CONFIG_SMP
1247 .data
1248 .align 12
1249 temp_boot_stack:
1250 .space 1024
1251 #endif