0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/pgtable.h>
0010 #include <asm/processor.h>
0011 #include <asm/reg.h>
0012 #include <asm/page.h>
0013 #include <asm/mmu.h>
0014 #include <asm/ppc_asm.h>
0015 #include <asm/asm-offsets.h>
0016 #include <asm/cputable.h>
0017 #include <asm/exception-64e.h>
0018 #include <asm/ppc-opcode.h>
0019 #include <asm/kvm_asm.h>
0020 #include <asm/kvm_booke_hv_asm.h>
0021 #include <asm/feature-fixups.h>
0022
0023 #define VPTE_PMD_SHIFT (PTE_INDEX_SIZE)
0024 #define VPTE_PUD_SHIFT (VPTE_PMD_SHIFT + PMD_INDEX_SIZE)
0025 #define VPTE_PGD_SHIFT (VPTE_PUD_SHIFT + PUD_INDEX_SIZE)
0026 #define VPTE_INDEX_SIZE (VPTE_PGD_SHIFT + PGD_INDEX_SIZE)
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 .macro tlb_prolog_bolted intnum addr
0044 mtspr SPRN_SPRG_GEN_SCRATCH,r12
0045 mfspr r12,SPRN_SPRG_TLB_EXFRAME
0046 std r13,EX_TLB_R13(r12)
0047 std r10,EX_TLB_R10(r12)
0048 mfspr r13,SPRN_SPRG_PACA
0049
0050 mfcr r10
0051 std r11,EX_TLB_R11(r12)
0052 #ifdef CONFIG_KVM_BOOKE_HV
0053 BEGIN_FTR_SECTION
0054 mfspr r11, SPRN_SRR1
0055 END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
0056 #endif
0057 DO_KVM \intnum, SPRN_SRR1
0058 std r16,EX_TLB_R16(r12)
0059 mfspr r16,\addr
0060 std r14,EX_TLB_R14(r12)
0061 ld r14,PACAPGD(r13)
0062 std r15,EX_TLB_R15(r12)
0063 std r10,EX_TLB_CR(r12)
0064 #ifdef CONFIG_PPC_FSL_BOOK3E
0065 START_BTB_FLUSH_SECTION
0066 mfspr r11, SPRN_SRR1
0067 andi. r10,r11,MSR_PR
0068 beq 1f
0069 BTB_FLUSH(r10)
0070 1:
0071 END_BTB_FLUSH_SECTION
0072 std r7,EX_TLB_R7(r12)
0073 #endif
0074 .endm
0075
0076 .macro tlb_epilog_bolted
0077 ld r14,EX_TLB_CR(r12)
0078 #ifdef CONFIG_PPC_FSL_BOOK3E
0079 ld r7,EX_TLB_R7(r12)
0080 #endif
0081 ld r10,EX_TLB_R10(r12)
0082 ld r11,EX_TLB_R11(r12)
0083 ld r13,EX_TLB_R13(r12)
0084 mtcr r14
0085 ld r14,EX_TLB_R14(r12)
0086 ld r15,EX_TLB_R15(r12)
0087 ld r16,EX_TLB_R16(r12)
0088 mfspr r12,SPRN_SPRG_GEN_SCRATCH
0089 .endm
0090
0091
0092 START_EXCEPTION(data_tlb_miss_bolted)
0093 tlb_prolog_bolted BOOKE_INTERRUPT_DTLB_MISS SPRN_DEAR
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 mfspr r11,SPRN_ESR
0118
0119 srdi r15,r16,60
0120 rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
0121 bne- dtlb_miss_fault_bolted
0122
0123 rlwinm r10,r11,32-19,27,27
0124 rlwimi r10,r11,32-16,19,19
0125 cmpwi r15,0
0126 ori r10,r10,_PAGE_PRESENT
0127 oris r11,r10,_PAGE_ACCESSED@h
0128
0129 bne tlb_miss_kernel_bolted
0130
0131 tlb_miss_user_bolted:
0132 #ifdef CONFIG_PPC_KUAP
0133 mfspr r10,SPRN_MAS1
0134 rlwinm. r10,r10,0,0x3fff0000
0135 beq- tlb_miss_fault_bolted
0136 #endif
0137
0138 tlb_miss_common_bolted:
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 rldicl r15,r16,64-PGDIR_SHIFT+3,64-PGD_INDEX_SIZE-3
0151 cmpldi cr0,r14,0
0152 clrrdi r15,r15,3
0153 beq tlb_miss_fault_bolted
0154
0155 ldx r14,r14,r15
0156
0157 rldicl r15,r16,64-PUD_SHIFT+3,64-PUD_INDEX_SIZE-3
0158 clrrdi r15,r15,3
0159 cmpdi cr0,r14,0
0160 bge tlb_miss_fault_bolted
0161 ldx r14,r14,r15
0162
0163 rldicl r15,r16,64-PMD_SHIFT+3,64-PMD_INDEX_SIZE-3
0164 clrrdi r15,r15,3
0165 cmpdi cr0,r14,0
0166 bge tlb_miss_fault_bolted
0167 ldx r14,r14,r15
0168
0169 rldicl r15,r16,64-PAGE_SHIFT+3,64-PTE_INDEX_SIZE-3
0170 clrrdi r15,r15,3
0171 cmpdi cr0,r14,0
0172 bge tlb_miss_fault_bolted
0173 ldx r14,r14,r15
0174
0175
0176 andc. r15,r11,r14
0177 rldicr r15,r14,64-(PTE_RPN_SHIFT-PAGE_SHIFT),63-PAGE_SHIFT
0178 bne- tlb_miss_fault_bolted
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190 clrrdi r11,r16,12
0191 clrldi r15,r15,12
0192 rlwimi r11,r14,32-19,27,31
0193 rlwimi r15,r14,32-8,22,25
0194 mtspr SPRN_MAS2,r11
0195 andi. r11,r14,_PAGE_DIRTY
0196 rlwimi r15,r14,32-2,26,31
0197
0198
0199 bne 1f
0200 li r11,MAS3_SW|MAS3_UW
0201 andc r15,r15,r11
0202 1:
0203 mtspr SPRN_MAS7_MAS3,r15
0204 tlbwe
0205
0206 tlb_miss_done_bolted:
0207 tlb_epilog_bolted
0208 rfi
0209
0210 itlb_miss_kernel_bolted:
0211 li r11,_PAGE_PRESENT|_PAGE_BAP_SX
0212 oris r11,r11,_PAGE_ACCESSED@h
0213 tlb_miss_kernel_bolted:
0214 mfspr r10,SPRN_MAS1
0215 ld r14,PACA_KERNELPGD(r13)
0216 srdi r15,r16,44
0217 andi. r15,r15,1
0218 rlwinm r10,r10,0,16,1
0219 mtspr SPRN_MAS1,r10
0220 bne+ tlb_miss_common_bolted
0221
0222 tlb_miss_fault_bolted:
0223
0224 andi. r10,r11,_PAGE_BAP_UX|_PAGE_BAP_SX
0225 bne itlb_miss_fault_bolted
0226 dtlb_miss_fault_bolted:
0227 tlb_epilog_bolted
0228 b exc_data_storage_book3e
0229 itlb_miss_fault_bolted:
0230 tlb_epilog_bolted
0231 b exc_instruction_storage_book3e
0232
0233
0234 START_EXCEPTION(instruction_tlb_miss_bolted)
0235 tlb_prolog_bolted BOOKE_INTERRUPT_ITLB_MISS SPRN_SRR0
0236
0237 rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
0238 srdi r15,r16,60
0239 bne- itlb_miss_fault_bolted
0240
0241 li r11,_PAGE_PRESENT|_PAGE_BAP_UX
0242
0243
0244
0245
0246 cmpldi cr0,r15,0
0247 oris r11,r11,_PAGE_ACCESSED@h
0248 beq tlb_miss_user_bolted
0249 b itlb_miss_kernel_bolted
0250
0251 #ifdef CONFIG_PPC_FSL_BOOK3E
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264 START_EXCEPTION(instruction_tlb_miss_e6500)
0265 tlb_prolog_bolted BOOKE_INTERRUPT_ITLB_MISS SPRN_SRR0
0266
0267 ld r11,PACA_TCD_PTR(r13)
0268 srdi. r15,r16,60
0269 ori r16,r16,1
0270
0271 bne tlb_miss_kernel_e6500
0272
0273 b tlb_miss_common_e6500
0274
0275 START_EXCEPTION(data_tlb_miss_e6500)
0276 tlb_prolog_bolted BOOKE_INTERRUPT_DTLB_MISS SPRN_DEAR
0277
0278 ld r11,PACA_TCD_PTR(r13)
0279 srdi. r15,r16,60
0280 rldicr r16,r16,0,62
0281
0282 bne tlb_miss_kernel_e6500
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296 tlb_miss_common_e6500:
0297 crmove cr2*4+2,cr0*4+2
0298
0299 BEGIN_FTR_SECTION
0300
0301
0302
0303
0304
0305
0306 lhz r10,PACAPACAINDEX(r13)
0307 addi r10,r10,1
0308 crclr cr1*4+eq
0309 1: lbarx r15,0,r11
0310 cmpdi r15,0
0311 bne 2f
0312 stbcx. r10,0,r11
0313 bne 1b
0314 3:
0315 .subsection 1
0316 2: cmpd cr1,r15,r10
0317 beq cr1,3b
0318 10: lbz r15,0(r11)
0319 cmpdi r15,0
0320 bne 10b
0321 b 1b
0322 .previous
0323 END_FTR_SECTION_IFSET(CPU_FTR_SMT)
0324
0325 lbz r7,TCD_ESEL_NEXT(r11)
0326
0327 BEGIN_FTR_SECTION
0328
0329
0330
0331
0332
0333
0334
0335
0336 rlwinm r10,r7,16,0xff0000
0337 oris r10,r10,MAS0_TLBSEL(1)@h
0338 mtspr SPRN_MAS0,r10
0339 isync
0340 tlbre
0341 mfspr r15,SPRN_MAS1
0342 andis. r15,r15,MAS1_VALID@h
0343 beq 5f
0344
0345 BEGIN_FTR_SECTION_NESTED(532)
0346 mfspr r10,SPRN_MAS8
0347 rlwinm r10,r10,0,0x80000fff
0348 mtspr SPRN_MAS5,r10
0349 END_FTR_SECTION_NESTED(CPU_FTR_EMB_HV,CPU_FTR_EMB_HV,532)
0350
0351 mfspr r10,SPRN_MAS1
0352 rlwinm r15,r10,0,0x3fff0000
0353 rlwimi r15,r10,20,0x00000003
0354 mfspr r10,SPRN_MAS6
0355 mtspr SPRN_MAS6,r15
0356
0357 mfspr r15,SPRN_MAS2
0358 isync
0359 tlbilxva 0,r15
0360 isync
0361
0362 mtspr SPRN_MAS6,r10
0363
0364 5:
0365 BEGIN_FTR_SECTION_NESTED(532)
0366 li r10,0
0367 mtspr SPRN_MAS8,r10
0368 mtspr SPRN_MAS5,r10
0369 END_FTR_SECTION_NESTED(CPU_FTR_EMB_HV,CPU_FTR_EMB_HV,532)
0370
0371 tlbsx 0,r16
0372 mfspr r10,SPRN_MAS1
0373 andis. r15,r10,MAS1_VALID@h
0374 bne tlb_miss_done_e6500
0375 FTR_SECTION_ELSE
0376 mfspr r10,SPRN_MAS1
0377 ALT_FTR_SECTION_END_IFSET(CPU_FTR_SMT)
0378
0379 oris r10,r10,MAS1_VALID@h
0380 beq cr2,4f
0381 rlwinm r10,r10,0,16,1
0382 4: mtspr SPRN_MAS1,r10
0383
0384
0385
0386
0387 rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
0388 bne- tlb_miss_fault_e6500
0389
0390 rldicl r15,r16,64-PGDIR_SHIFT+3,64-PGD_INDEX_SIZE-3
0391 cmpldi cr0,r14,0
0392 clrrdi r15,r15,3
0393 beq- tlb_miss_fault_e6500
0394 ldx r14,r14,r15
0395
0396 rldicl r15,r16,64-PUD_SHIFT+3,64-PUD_INDEX_SIZE-3
0397 clrrdi r15,r15,3
0398 cmpdi cr0,r14,0
0399 bge tlb_miss_huge_e6500
0400 ldx r14,r14,r15
0401
0402 rldicl r15,r16,64-PMD_SHIFT+3,64-PMD_INDEX_SIZE-3
0403 clrrdi r15,r15,3
0404 cmpdi cr0,r14,0
0405 bge tlb_miss_huge_e6500
0406 ldx r14,r14,r15
0407
0408 mfspr r10,SPRN_MAS0
0409 cmpdi cr0,r14,0
0410 bge tlb_miss_huge_e6500
0411
0412
0413
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423 ori r14,r14,(BOOK3E_PAGESZ_4K << MAS3_SPSIZE_SHIFT)
0424 mtspr SPRN_MAS7_MAS3,r14
0425
0426 clrrdi r15,r16,21
0427 mtspr SPRN_MAS2,r15
0428
0429 tlb_miss_huge_done_e6500:
0430 lbz r16,TCD_ESEL_MAX(r11)
0431 lbz r14,TCD_ESEL_FIRST(r11)
0432 rlwimi r10,r7,16,0x00ff0000
0433 addi r7,r7,1
0434 mtspr SPRN_MAS0,r10
0435 cmpw r7,r16
0436 iseleq r7,r14,r7
0437 stb r7,TCD_ESEL_NEXT(r11)
0438
0439 tlbwe
0440
0441 tlb_miss_done_e6500:
0442 .macro tlb_unlock_e6500
0443 BEGIN_FTR_SECTION
0444 beq cr1,1f
0445 li r15,0
0446 isync
0447 stb r15,0(r11)
0448 1:
0449 END_FTR_SECTION_IFSET(CPU_FTR_SMT)
0450 .endm
0451
0452 tlb_unlock_e6500
0453 tlb_epilog_bolted
0454 rfi
0455
0456 tlb_miss_huge_e6500:
0457 beq tlb_miss_fault_e6500
0458 li r10,1
0459 andi. r15,r14,HUGEPD_SHIFT_MASK@l
0460 rldimi r14,r10,63,0
0461 xor r14,r14,r15
0462 ldx r14,0,r14
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473 subi r15,r15,10
0474 mfspr r10,SPRN_MAS1
0475 rlwinm r10,r10,0,~MAS1_IND
0476 rlwimi r10,r15,MAS1_TSIZE_SHIFT,MAS1_TSIZE_MASK
0477 mtspr SPRN_MAS1,r10
0478
0479 li r10,-0x400
0480 sld r15,r10,r15
0481 and r10,r16,r15
0482 rldicr r15,r14,64-(PTE_RPN_SHIFT-PAGE_SHIFT),63-PAGE_SHIFT
0483 rlwimi r10,r14,32-19,27,31
0484 clrldi r15,r15,PAGE_SHIFT
0485 rlwimi r15,r14,32-8,22,25
0486 mtspr SPRN_MAS2,r10
0487 andi. r10,r14,_PAGE_DIRTY
0488 rlwimi r15,r14,32-2,26,31
0489
0490
0491 bne 1f
0492 li r10,MAS3_SW|MAS3_UW
0493 andc r15,r15,r10
0494 1:
0495 mtspr SPRN_MAS7_MAS3,r15
0496
0497 mfspr r10,SPRN_MAS0
0498 b tlb_miss_huge_done_e6500
0499
0500 tlb_miss_kernel_e6500:
0501 ld r14,PACA_KERNELPGD(r13)
0502 srdi r15,r16,44
0503 xoris r15,r15,0xc
0504 cmplwi cr1,r15,1
0505 beq+ cr1,tlb_miss_common_e6500
0506
0507 tlb_miss_fault_e6500:
0508 tlb_unlock_e6500
0509
0510 andi. r16,r16,1
0511 bne itlb_miss_fault_e6500
0512 dtlb_miss_fault_e6500:
0513 tlb_epilog_bolted
0514 b exc_data_storage_book3e
0515 itlb_miss_fault_e6500:
0516 tlb_epilog_bolted
0517 b exc_instruction_storage_book3e
0518 #endif
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528 START_EXCEPTION(data_tlb_miss)
0529 TLB_MISS_PROLOG
0530
0531
0532
0533
0534
0535
0536 mfspr r14,SPRN_ESR
0537 mfspr r16,SPRN_DEAR
0538 srdi r15,r16,44
0539 xoris r15,r15,0xc
0540 cmpldi cr0,r15,0
0541 beq tlb_load_linear
0542 cmpldi cr1,r15,1
0543
0544
0545
0546
0547
0548
0549 andis. r10,r15,0x1
0550 bne- virt_page_table_tlb_miss
0551
0552 std r14,EX_TLB_ESR(r12);
0553 std r16,EX_TLB_DEAR(r12);
0554
0555
0556 li r11,_PAGE_PRESENT
0557 oris r11,r11,_PAGE_ACCESSED@h
0558
0559
0560
0561 srdi. r15,r16,60
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575
0576
0577
0578
0579
0580 rlwimi r11,r14,32-19,27,27
0581 rlwimi r11,r14,32-16,19,19
0582 beq normal_tlb_miss_user
0583
0584 1: mfspr r10,SPRN_MAS1
0585 rlwinm r10,r10,0,16,1
0586 mtspr SPRN_MAS1,r10
0587 beq+ cr1,normal_tlb_miss
0588
0589
0590
0591
0592 TLB_MISS_EPILOG_ERROR
0593 b exc_data_storage_book3e
0594
0595
0596 START_EXCEPTION(instruction_tlb_miss)
0597 TLB_MISS_PROLOG
0598
0599
0600
0601
0602
0603
0604 li r14,-1
0605
0606
0607
0608
0609
0610
0611
0612
0613 srdi r15,r16,44
0614 xoris r15,r15,0xc
0615 cmpldi cr0,r15,0
0616 beq tlb_load_linear
0617 cmpldi cr1,r15,1
0618
0619
0620
0621 li r11,_PAGE_PRESENT|_PAGE_BAP_UX
0622 oris r11,r11,_PAGE_ACCESSED@h
0623
0624 srdi. r15,r16,60
0625 std r14,EX_TLB_ESR(r12)
0626 beq normal_tlb_miss_user
0627
0628 li r11,_PAGE_PRESENT|_PAGE_BAP_SX
0629 oris r11,r11,_PAGE_ACCESSED@h
0630
0631 mfspr r10,SPRN_MAS1
0632 rlwinm r10,r10,0,16,1
0633 mtspr SPRN_MAS1,r10
0634 beq+ cr1,normal_tlb_miss
0635
0636
0637 TLB_MISS_EPILOG_ERROR
0638 b exc_instruction_storage_book3e
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652 normal_tlb_miss_user:
0653 #ifdef CONFIG_PPC_KUAP
0654 mfspr r14,SPRN_MAS1
0655 rlwinm. r14,r14,0,0x3fff0000
0656 beq- normal_tlb_miss_access_fault
0657 #endif
0658 normal_tlb_miss:
0659
0660
0661
0662
0663
0664
0665
0666
0667 srdi r15,r16,44
0668 oris r10,r15,0x1
0669 rldicl r14,r16,64-(PAGE_SHIFT-3),PAGE_SHIFT-3+4
0670 sldi r15,r10,44
0671 clrrdi r14,r14,19
0672 or r10,r15,r14
0673
0674 ld r14,0(r10)
0675
0676 finish_normal_tlb_miss:
0677
0678 andc. r15,r11,r14
0679 bne- normal_tlb_miss_access_fault
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693 clrrdi r10,r16,12
0694 rlwimi r10,r14,32-19,27,31
0695 mtspr SPRN_MAS2,r10
0696
0697
0698 rldicl r10,r14,64-8,64-8
0699 cmpldi cr0,r10,BOOK3E_PAGESZ_4K
0700 beq- 1f
0701 mfspr r11,SPRN_MAS1
0702 rlwimi r11,r14,31,21,24
0703 rlwinm r11,r11,0,21,19
0704 mtspr SPRN_MAS1,r11
0705 1:
0706
0707 rldicr r11,r14,64-(PTE_RPN_SHIFT-PAGE_SHIFT),63-PAGE_SHIFT
0708 clrldi r15,r11,12
0709 rlwimi r15,r14,32-8,22,25
0710 rlwimi r15,r14,32-2,26,31
0711
0712
0713 andi. r11,r14,_PAGE_DIRTY
0714 bne 1f
0715 li r11,MAS3_SW|MAS3_UW
0716 andc r15,r15,r11
0717 1:
0718 srdi r16,r15,32
0719 mtspr SPRN_MAS3,r15
0720 mtspr SPRN_MAS7,r16
0721
0722 tlbwe
0723
0724 normal_tlb_miss_done:
0725
0726
0727
0728
0729 TLB_MISS_EPILOG_SUCCESS
0730 rfi
0731
0732 normal_tlb_miss_access_fault:
0733
0734 andi. r10,r11,_PAGE_BAP_UX
0735 bne 1f
0736 ld r14,EX_TLB_DEAR(r12)
0737 ld r15,EX_TLB_ESR(r12)
0738 mtspr SPRN_DEAR,r14
0739 mtspr SPRN_ESR,r15
0740 TLB_MISS_EPILOG_ERROR
0741 b exc_data_storage_book3e
0742 1: TLB_MISS_EPILOG_ERROR
0743 b exc_instruction_storage_book3e
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770 virt_page_table_tlb_miss:
0771
0772 srdi r15,r16,60
0773 andi. r10,r15,0x8
0774
0775
0776
0777
0778
0779 add r11,r10,r13
0780
0781
0782 beq 1f
0783
0784 mfspr r10,SPRN_MAS1
0785 rlwinm r10,r10,0,16,1
0786 mtspr SPRN_MAS1,r10
0787 #ifdef CONFIG_PPC_KUAP
0788 b 2f
0789 1:
0790 mfspr r10,SPRN_MAS1
0791 rlwinm. r10,r10,0,0x3fff0000
0792 beq- virt_page_table_tlb_miss_fault
0793 2:
0794 #else
0795 1:
0796 #endif
0797
0798
0799
0800
0801 rldicl r10,r16,64-(VPTE_INDEX_SIZE+3),VPTE_INDEX_SIZE+3+4
0802 cmpldi r10,0x80
0803 bne- virt_page_table_tlb_miss_fault
0804
0805
0806 ld r15,PACAPGD(r11)
0807 cmpldi cr0,r15,0
0808 beq- virt_page_table_tlb_miss_fault
0809
0810
0811 rldicl r11,r16,64-VPTE_PGD_SHIFT,64-PGD_INDEX_SIZE-3
0812 clrrdi r10,r11,3
0813 ldx r15,r10,r15
0814 cmpdi cr0,r15,0
0815 bge virt_page_table_tlb_miss_fault
0816
0817
0818 rldicl r11,r16,64-VPTE_PUD_SHIFT,64-PUD_INDEX_SIZE-3
0819 clrrdi r10,r11,3
0820 ldx r15,r10,r15
0821 cmpdi cr0,r15,0
0822 bge virt_page_table_tlb_miss_fault
0823
0824
0825 rldicl r11,r16,64-VPTE_PMD_SHIFT,64-PMD_INDEX_SIZE-3
0826 clrrdi r10,r11,3
0827 ldx r15,r10,r15
0828 cmpdi cr0,r15,0
0829 bge virt_page_table_tlb_miss_fault
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845 clrldi r11,r15,4
0846 ori r10,r11,1
0847
0848 srdi r16,r10,32
0849 mtspr SPRN_MAS3,r10
0850 mtspr SPRN_MAS7,r16
0851
0852 tlbwe
0853
0854
0855 TLB_MISS_EPILOG_SUCCESS
0856 rfi
0857
0858 virt_page_table_tlb_miss_fault:
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874
0875
0876
0877 subf r10,r13,r12
0878 cmpldi cr0,r10,PACA_EXTLB+EX_TLB_SIZE
0879 bne- virt_page_table_tlb_miss_whacko_fault
0880
0881
0882 ld r15,EX_TLB_DEAR+PACA_EXTLB(r13)
0883 ld r16,EX_TLB_ESR+PACA_EXTLB(r13)
0884
0885
0886 cmpdi cr0,r16,-1
0887 beq 1f
0888 mtspr SPRN_DEAR,r15
0889 mtspr SPRN_ESR,r16
0890 TLB_MISS_EPILOG_ERROR
0891 b exc_data_storage_book3e
0892 1: TLB_MISS_EPILOG_ERROR
0893 b exc_instruction_storage_book3e
0894
0895 virt_page_table_tlb_miss_whacko_fault:
0896
0897
0898
0899 TLB_MISS_EPILOG_ERROR
0900 b exc_data_storage_book3e
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911 START_EXCEPTION(data_tlb_miss_htw)
0912 TLB_MISS_PROLOG
0913
0914
0915
0916
0917
0918
0919 mfspr r14,SPRN_ESR
0920 mfspr r16,SPRN_DEAR
0921 srdi r11,r16,44
0922 xoris r11,r11,0xc
0923 cmpldi cr0,r11,0
0924 beq tlb_load_linear
0925 cmpldi cr1,r11,1
0926
0927
0928
0929 srdi. r11,r16,60
0930 ld r15,PACAPGD(r13)
0931 beq htw_tlb_miss
0932
0933
0934 1: mfspr r10,SPRN_MAS1
0935 rlwinm r10,r10,0,16,1
0936 mtspr SPRN_MAS1,r10
0937 ld r15,PACA_KERNELPGD(r13)
0938 beq+ cr1,htw_tlb_miss
0939
0940
0941
0942
0943 TLB_MISS_EPILOG_ERROR
0944 b exc_data_storage_book3e
0945
0946
0947 START_EXCEPTION(instruction_tlb_miss_htw)
0948 TLB_MISS_PROLOG
0949
0950
0951
0952
0953
0954
0955 li r14,-1
0956
0957
0958
0959
0960
0961
0962
0963
0964 srdi r11,r16,44
0965 xoris r11,r11,0xc
0966 cmpldi cr0,r11,0
0967 beq tlb_load_linear
0968 cmpldi cr1,r11,1
0969
0970
0971
0972 srdi. r11,r16,60
0973 ld r15,PACAPGD(r13)
0974 beq htw_tlb_miss
0975
0976
0977 1: mfspr r10,SPRN_MAS1
0978 rlwinm r10,r10,0,16,1
0979 mtspr SPRN_MAS1,r10
0980 ld r15,PACA_KERNELPGD(r13)
0981 beq+ htw_tlb_miss
0982
0983
0984 TLB_MISS_EPILOG_ERROR
0985 b exc_instruction_storage_book3e
0986
0987
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003 htw_tlb_miss:
1004 #ifdef CONFIG_PPC_KUAP
1005 mfspr r10,SPRN_MAS1
1006 rlwinm. r10,r10,0,0x3fff0000
1007 beq- htw_tlb_miss_fault
1008 #endif
1009
1010
1011
1012
1013
1014 PPC_TLBSRX_DOT(0,R16)
1015 beq htw_tlb_miss_done
1016
1017
1018
1019
1020 rldicl. r10,r16,64-PGTABLE_EADDR_SIZE,PGTABLE_EADDR_SIZE+4
1021 bne- htw_tlb_miss_fault
1022
1023
1024 cmpldi cr0,r15,0
1025 beq- htw_tlb_miss_fault
1026
1027
1028 rldicl r11,r16,64-(PGDIR_SHIFT-3),64-PGD_INDEX_SIZE-3
1029 clrrdi r10,r11,3
1030 ldx r15,r10,r15
1031 cmpdi cr0,r15,0
1032 bge htw_tlb_miss_fault
1033
1034
1035 rldicl r11,r16,64-(PUD_SHIFT-3),64-PUD_INDEX_SIZE-3
1036 clrrdi r10,r11,3
1037 ldx r15,r10,r15
1038 cmpdi cr0,r15,0
1039 bge htw_tlb_miss_fault
1040
1041
1042 rldicl r11,r16,64-(PMD_SHIFT-3),64-PMD_INDEX_SIZE-3
1043 clrrdi r10,r11,3
1044 ldx r15,r10,r15
1045 cmpdi cr0,r15,0
1046 bge htw_tlb_miss_fault
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058 rlwimi r15,r16,32-9,20,20
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068 ori r10,r15,(BOOK3E_PAGESZ_4K << MAS3_SPSIZE_SHIFT)
1069
1070 srdi r16,r10,32
1071 mtspr SPRN_MAS3,r10
1072 mtspr SPRN_MAS7,r16
1073
1074 tlbwe
1075
1076 htw_tlb_miss_done:
1077
1078
1079
1080
1081 TLB_MISS_EPILOG_SUCCESS
1082 rfi
1083
1084 htw_tlb_miss_fault:
1085
1086
1087
1088 cmpdi cr0,r14,-1
1089 beq 1f
1090 mtspr SPRN_DEAR,r16
1091 mtspr SPRN_ESR,r14
1092 TLB_MISS_EPILOG_ERROR
1093 b exc_data_storage_book3e
1094 1: TLB_MISS_EPILOG_ERROR
1095 b exc_instruction_storage_book3e
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121 tlb_load_linear:
1122
1123
1124
1125
1126
1127 ld r11,PACATOC(r13)
1128 ld r11,linear_map_top@got(r11)
1129 ld r10,0(r11)
1130 tovirt(10,10)
1131 cmpld cr0,r16,r10
1132 bge tlb_load_linear_fault
1133
1134
1135 li r15,(BOOK3E_PAGESZ_1GB<<MAS1_TSIZE_SHIFT)
1136 oris r15,r15,MAS1_VALID@h
1137 mtspr SPRN_MAS1,r15
1138
1139
1140 PPC_TLBSRX_DOT(0,R16)
1141 beq tlb_load_linear_done
1142
1143
1144
1145
1146
1147
1148
1149 clrrdi r10,r16,30
1150 clrldi r10,r10,4
1151 ori r10,r10,MAS3_SR|MAS3_SW|MAS3_SX
1152
1153 srdi r16,r10,32
1154 mtspr SPRN_MAS3,r10
1155 mtspr SPRN_MAS7,r16
1156
1157 tlbwe
1158
1159 tlb_load_linear_done:
1160
1161
1162
1163
1164
1165 TLB_MISS_EPILOG_ERROR
1166 rfi
1167
1168 tlb_load_linear_fault:
1169
1170 cmpdi cr0,r14,-1
1171 beq 1f
1172 TLB_MISS_EPILOG_ERROR_SPECIAL
1173 b exc_data_storage_book3e
1174 1: TLB_MISS_EPILOG_ERROR_SPECIAL
1175 b exc_instruction_storage_book3e