Rex Feany <rfe...@mrv.com> wrote on 09/10/2009 08:46:49:
>
> Thus spake Joakim Tjernlund (joakim.tjernl...@transmode.se):
>
> > Rex Feany <rfe...@mrv.com> wrote on 09/10/2009 02:15:27:
>
> > > open("/proc/mounts", O_RDONLY)          = 3
> > > fstat64(0x3, 0x7fe7e2a8)                = 0
> > > mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) 
> > > =0x3001f000
> > > read(3, 0x3001f000, 1024)               = -1 EFAULT (Bad address)
> > > exit_group(0)                           = ?
> >
> > Try making the tlbil_va in fault.c unconditional, just to make sure
> > there isn't any old TLBs  around.
>
> didn't make a difference

Perhaps you are suffering from a buggy dcbst insn? I tested it
on a RO mapping and it SEGVs. Clearing the store bit manually
at least fixes the SEGVs.

Here is a patch for that.

     Jocke

>From 07dbca0cf9dc13cf0fbccf54d577e3bc1c5dfdf1 Mon Sep 17 00:00:00 2001
From: Joakim Tjernlund <joakim.tjernl...@transmode.se>
Date: Fri, 9 Oct 2009 14:18:21 +0200
Subject: [PATCH] 8xx: dcbst sets store bit in DTLB error, workaround.

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 |   24 ++++++++++++++++++++++++
 1 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S
index 292bd87..7b31feb 100644
--- a/arch/powerpc/kernel/head_8xx.S
+++ b/arch/powerpc/kernel/head_8xx.S
@@ -630,6 +630,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