|
@@ -398,11 +398,13 @@ DataStoreTLBMiss:
|
|
|
BRANCH_UNLESS_KERNEL(3f)
|
|
|
lis r11, (swapper_pg_dir-PAGE_OFFSET)@ha
|
|
|
3:
|
|
|
- mtcr r3
|
|
|
|
|
|
/* Insert level 1 index */
|
|
|
rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
|
|
lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
|
|
|
+ mtcr r11
|
|
|
+ bt- 28,DTLBMiss8M /* bit 28 = Large page (8M) */
|
|
|
+ mtcr r3
|
|
|
|
|
|
/* We have a pte table, so load fetch the pte from the table.
|
|
|
*/
|
|
@@ -455,6 +457,29 @@ DataStoreTLBMiss:
|
|
|
EXCEPTION_EPILOG_0
|
|
|
rfi
|
|
|
|
|
|
+DTLBMiss8M:
|
|
|
+ mtcr r3
|
|
|
+ ori r11, r11, MD_SVALID
|
|
|
+ MTSPR_CPU6(SPRN_MD_TWC, r11, r3)
|
|
|
+#ifdef CONFIG_PPC_16K_PAGES
|
|
|
+ /*
|
|
|
+ * In 16k pages mode, each PGD entry defines a 64M block.
|
|
|
+ * Here we select the 8M page within the block.
|
|
|
+ */
|
|
|
+ rlwimi r11, r10, 0, 0x03800000
|
|
|
+#endif
|
|
|
+ rlwinm r10, r11, 0, 0xff800000
|
|
|
+ ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SHARED | _PAGE_DIRTY | \
|
|
|
+ _PAGE_PRESENT
|
|
|
+ MTSPR_CPU6(SPRN_MD_RPN, r10, r3) /* Update TLB entry */
|
|
|
+
|
|
|
+ li r11, RPN_PATTERN
|
|
|
+ mfspr r3, SPRN_SPRG_SCRATCH2
|
|
|
+ mtspr SPRN_DAR, r11 /* Tag DAR */
|
|
|
+ EXCEPTION_EPILOG_0
|
|
|
+ rfi
|
|
|
+
|
|
|
+
|
|
|
/* This is an instruction TLB error on the MPC8xx. This could be due
|
|
|
* to many reasons, such as executing guarded memory or illegal instruction
|
|
|
* addresses. There is nothing to do but handle a big time error fault.
|
|
@@ -532,13 +557,15 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
|
|
/* Insert level 1 index */
|
|
|
3: rlwimi r11, r10, 32 - ((PAGE_SHIFT - 2) << 1), (PAGE_SHIFT - 2) << 1, 29
|
|
|
lwz r11, (swapper_pg_dir-PAGE_OFFSET)@l(r11) /* Get the level 1 entry */
|
|
|
+ mtcr r11
|
|
|
+ bt 28,200f /* bit 28 = Large page (8M) */
|
|
|
rlwinm r11, r11,0,0,19 /* Extract page descriptor page address */
|
|
|
/* Insert level 2 index */
|
|
|
rlwimi r11, r10, 32 - (PAGE_SHIFT - 2), 32 - PAGE_SHIFT, 29
|
|
|
lwz r11, 0(r11) /* Get the pte */
|
|
|
/* concat physical page address(r11) and page offset(r10) */
|
|
|
rlwimi r11, r10, 0, 32 - PAGE_SHIFT, 31
|
|
|
- lwz r11,0(r11)
|
|
|
+201: lwz r11,0(r11)
|
|
|
/* Check if it really is a dcbx instruction. */
|
|
|
/* dcbt and dcbtst does not generate DTLB Misses/Errors,
|
|
|
* no need to include them here */
|
|
@@ -557,6 +584,10 @@ FixupDAR:/* Entry point for dcbx workaround. */
|
|
|
141: mfspr r10,SPRN_SPRG_SCRATCH2
|
|
|
b DARFixed /* Nope, go back to normal TLB processing */
|
|
|
|
|
|
+ /* concat physical page address(r11) and page offset(r10) */
|
|
|
+200: rlwimi r11, r10, 0, 32 - (PAGE_SHIFT << 1), 31
|
|
|
+ b 201b
|
|
|
+
|
|
|
144: mfspr r10, SPRN_DSISR
|
|
|
rlwinm r10, r10,0,7,5 /* Clear store bit for buggy dcbst insn */
|
|
|
mtspr SPRN_DSISR, r10
|