|
@@ -353,13 +353,14 @@ _ENTRY(ITLBMiss_cmp)
|
|
|
#if defined(ITLB_MISS_KERNEL) || defined(CONFIG_HUGETLB_PAGE)
|
|
|
mtcr r12
|
|
|
#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_SWAP
|
|
|
- rlwinm r11, r10, 31, _PAGE_ACCESSED >> 1
|
|
|
-#endif
|
|
|
/* Load the MI_TWC with the attributes for this "segment." */
|
|
|
mtspr SPRN_MI_TWC, r11 /* Set segment attributes */
|
|
|
|
|
|
+#ifdef CONFIG_SWAP
|
|
|
+ rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
|
|
+ and r11, r11, r10
|
|
|
+ rlwimi r10, r11, 0, _PAGE_PRESENT
|
|
|
+#endif
|
|
|
li r11, RPN_PATTERN | 0x200
|
|
|
/* The Linux PTE won't go exactly into the MMU TLB.
|
|
|
* Software indicator bits 20 and 23 must be clear.
|
|
@@ -470,14 +471,22 @@ _ENTRY(DTLBMiss_jmp)
|
|
|
* above.
|
|
|
*/
|
|
|
rlwimi r11, r10, 0, _PAGE_GUARDED
|
|
|
-#ifdef CONFIG_SWAP
|
|
|
- /* _PAGE_ACCESSED has to be set. We use second APG bit for that, 0
|
|
|
- * on that bit will represent a Non Access group
|
|
|
- */
|
|
|
- rlwinm r11, r10, 31, _PAGE_ACCESSED >> 1
|
|
|
-#endif
|
|
|
mtspr SPRN_MD_TWC, r11
|
|
|
|
|
|
+ /* Both _PAGE_ACCESSED and _PAGE_PRESENT has to be set.
|
|
|
+ * We also need to know if the insn is a load/store, so:
|
|
|
+ * Clear _PAGE_PRESENT and load that which will
|
|
|
+ * trap into DTLB Error with store bit set accordinly.
|
|
|
+ */
|
|
|
+ /* PRESENT=0x1, ACCESSED=0x20
|
|
|
+ * r11 = ((r10 & PRESENT) & ((r10 & ACCESSED) >> 5));
|
|
|
+ * r10 = (r10 & ~PRESENT) | r11;
|
|
|
+ */
|
|
|
+#ifdef CONFIG_SWAP
|
|
|
+ rlwinm r11, r10, 32-5, _PAGE_PRESENT
|
|
|
+ and r11, r11, r10
|
|
|
+ rlwimi r10, r11, 0, _PAGE_PRESENT
|
|
|
+#endif
|
|
|
/* The Linux PTE won't go exactly into the MMU TLB.
|
|
|
* Software indicator bits 24, 25, 26, and 27 must be
|
|
|
* set. All other Linux PTE bits control the behavior
|
|
@@ -637,8 +646,8 @@ InstructionBreakpoint:
|
|
|
*/
|
|
|
DTLBMissIMMR:
|
|
|
mtcr r12
|
|
|
- /* Set 512k byte guarded page and mark it valid and accessed */
|
|
|
- li r10, MD_PS512K | MD_GUARDED | MD_SVALID | M_APG2
|
|
|
+ /* Set 512k byte guarded page and mark it valid */
|
|
|
+ li r10, MD_PS512K | MD_GUARDED | MD_SVALID
|
|
|
mtspr SPRN_MD_TWC, r10
|
|
|
mfspr r10, SPRN_IMMR /* Get current IMMR */
|
|
|
rlwinm r10, r10, 0, 0xfff80000 /* Get 512 kbytes boundary */
|
|
@@ -656,8 +665,8 @@ _ENTRY(dtlb_miss_exit_2)
|
|
|
|
|
|
DTLBMissLinear:
|
|
|
mtcr r12
|
|
|
- /* Set 8M byte page and mark it valid and accessed */
|
|
|
- li r11, MD_PS8MEG | MD_SVALID | M_APG2
|
|
|
+ /* Set 8M byte page and mark it valid */
|
|
|
+ li r11, MD_PS8MEG | MD_SVALID
|
|
|
mtspr SPRN_MD_TWC, r11
|
|
|
rlwinm r10, r10, 0, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
|
|
ori r10, r10, 0xf0 | MD_SPS16K | _PAGE_SH | _PAGE_DIRTY | \
|
|
@@ -675,8 +684,8 @@ _ENTRY(dtlb_miss_exit_3)
|
|
|
#ifndef CONFIG_PIN_TLB_TEXT
|
|
|
ITLBMissLinear:
|
|
|
mtcr r12
|
|
|
- /* Set 8M byte page and mark it valid,accessed */
|
|
|
- li r11, MI_PS8MEG | MI_SVALID | M_APG2
|
|
|
+ /* Set 8M byte page and mark it valid */
|
|
|
+ li r11, MI_PS8MEG | MI_SVALID
|
|
|
mtspr SPRN_MI_TWC, r11
|
|
|
rlwinm r10, r10, 0, 0x0f800000 /* 8xx supports max 256Mb RAM */
|
|
|
ori r10, r10, 0xf0 | MI_SPS16K | _PAGE_SH | _PAGE_DIRTY | \
|
|
@@ -960,7 +969,7 @@ initial_mmu:
|
|
|
ori r8, r8, MI_EVALID /* Mark it valid */
|
|
|
mtspr SPRN_MI_EPN, r8
|
|
|
li r8, MI_PS8MEG /* Set 8M byte page */
|
|
|
- ori r8, r8, MI_SVALID | M_APG2 /* Make it valid, APG 2 */
|
|
|
+ ori r8, r8, MI_SVALID /* Make it valid */
|
|
|
mtspr SPRN_MI_TWC, r8
|
|
|
li r8, MI_BOOTINIT /* Create RPN for address 0 */
|
|
|
mtspr SPRN_MI_RPN, r8 /* Store TLB entry */
|
|
@@ -987,7 +996,7 @@ initial_mmu:
|
|
|
ori r8, r8, MD_EVALID /* Mark it valid */
|
|
|
mtspr SPRN_MD_EPN, r8
|
|
|
li r8, MD_PS512K | MD_GUARDED /* Set 512k byte page */
|
|
|
- ori r8, r8, MD_SVALID | M_APG2 /* Make it valid and accessed */
|
|
|
+ ori r8, r8, MD_SVALID /* Make it valid */
|
|
|
mtspr SPRN_MD_TWC, r8
|
|
|
mr r8, r9 /* Create paddr for TLB */
|
|
|
ori r8, r8, MI_BOOTINIT|0x2 /* Inhibit cache -- Cort */
|