dcbst should not set the store bit(bit 6, DSISR) when
trapping into a DTLB Error. Clear this bit while doing
the dcbX missing DAR workaround.
---
 arch/powerpc/kernel/head_8xx.S |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 9839e79..027856e 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -496,10 +496,14 @@ DataTLBError:
        cmpwi   cr0, r10, 0x00f0
        beq-    FixDAR  /* must be a buggy dcbX, icbi insn. */
 DARFix:        /* Return from dcbx instruction bug workaround, r10 holds value 
of DAR */
-
        mfspr   r11, SPRN_DSISR
-       andis.  r11, r11, 0x4800        /* !translation or protection */
-       bne     2f      /* branch if either is set */
+       /* As the DAR fixup may clear store we may have all 3 states zero.
+        * Make sure only 0x0200(store) falls down into DIRTY handling
+        */
+       andis.  r11, r11, 0x4a00        /* !translation, protection or store */
+       srwi    r11, r11, 16
+       cmpwi   cr0, r11, 0x0200        /* just store ? */
+       bne     2f
        /* Only Change bit left now, do it here as it is faster
         * than trapping to the C fault handler.
        */
@@ -632,6 +636,30 @@ FixDAR:    /* Entry point for dcbx workaround. */
        tophys  (r11, r10)
        beq-    139b            /* Branch if user space address */
 140:   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 */
+       srwi    r10, r11, 26    /* check if major OP code is 31 */
+       cmpwi   cr0, r10, 31
+       bne-    141f
+       rlwinm  r10, r11, 0, 21, 30
+       cmpwi   cr0, r10, 2028  /* Is dcbz? */
+       beq+    142f
+       cmpwi   cr0, r10, 940   /* Is dcbi? */
+       beq+    142f
+       cmpwi   cr0, r10, 108   /* Is dcbst? */
+       beq+    144f            /* Fix up store bit! */
+       cmpwi   cr0, r10, 172   /* Is dcbf? */
+       beq+    142f
+       cmpwi   cr0, r10, 1964  /* Is icbi? */
+       beq+    142f
+141:   mfspr   r10, SPRN_DAR   /* r10 must hold DAR at exit */
+       b       DARfix          /* Nope, go back to normal TLB processing */
+
+144:   mfspr   r10, SPRN_DSISR
+       rlwinm  r10, r10,0,7,5  /* Clear store bit for buggy dcbst insn */
+       mtspr   SPRN_DSISR, r10
+142:   /* continue, it was a dcbx, dcbi instruction. */
 #ifdef CONFIG_8xx_CPU6
        lwz     r3, 8(r0)       /* restore r3 from memory */
 #endif
-- 
1.6.4.4

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to