]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Sparc64 FPU corruption fix from DaveM
authorChris Wright <chrisw@osdl.org>
Fri, 7 Oct 2005 22:11:00 +0000 (15:11 -0700)
committerChris Wright <chrisw@osdl.org>
Fri, 7 Oct 2005 22:11:00 +0000 (15:11 -0700)
queue/fix-sparc64-fpu-register-corruption.patch [new file with mode: 0644]
queue/series

diff --git a/queue/fix-sparc64-fpu-register-corruption.patch b/queue/fix-sparc64-fpu-register-corruption.patch
new file mode 100644 (file)
index 0000000..208f188
--- /dev/null
@@ -0,0 +1,196 @@
+From stable-bounces@linux.kernel.org  Fri Oct  7 13:41:25 2005
+Date: Fri, 07 Oct 2005 13:41:17 -0700 (PDT)
+To: stable@kernel.org
+From: "David S. Miller" <davem@davemloft.net>
+Cc: 
+Subject: [SPARC64]: Fix userland FPU state corruption.
+
+We need to use stricter memory barriers around the block
+load and store instructions we use to save and restore the
+FPU register file.
+
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Chris Wright <chrisw@osdl.org>
+---
+ arch/sparc64/kernel/entry.S |   39 +++++++++++++++++++++------------------
+ arch/sparc64/kernel/rtrap.S |    7 ++++---
+ arch/sparc64/lib/VISsave.S  |    8 +++++---
+ 3 files changed, 30 insertions(+), 24 deletions(-)
+
+Index: linux-2.6.13.y/arch/sparc64/kernel/entry.S
+===================================================================
+--- linux-2.6.13.y.orig/arch/sparc64/kernel/entry.S
++++ linux-2.6.13.y/arch/sparc64/kernel/entry.S
+@@ -186,7 +186,7 @@ vmalloc_addr:
+       /* This is trivial with the new code... */
+       .globl          do_fpdis
+ do_fpdis:
+-      sethi           %hi(TSTATE_PEF), %g4                                    ! IEU0
++      sethi           %hi(TSTATE_PEF), %g4
+       rdpr            %tstate, %g5
+       andcc           %g5, %g4, %g0
+       be,pt           %xcc, 1f
+@@ -203,18 +203,18 @@ do_fpdis:
+       add             %g0, %g0, %g0
+       ba,a,pt         %xcc, rtrap_clr_l6
+-1:    ldub            [%g6 + TI_FPSAVED], %g5                                 ! Load  Group
+-      wr              %g0, FPRS_FEF, %fprs                                    ! LSU   Group+4bubbles
+-      andcc           %g5, FPRS_FEF, %g0                                      ! IEU1  Group
+-      be,a,pt         %icc, 1f                                                ! CTI
+-       clr            %g7                                                     ! IEU0
+-      ldx             [%g6 + TI_GSR], %g7                                     ! Load  Group
+-1:    andcc           %g5, FPRS_DL, %g0                                       ! IEU1
+-      bne,pn          %icc, 2f                                                ! CTI
+-       fzero          %f0                                                     ! FPA
+-      andcc           %g5, FPRS_DU, %g0                                       ! IEU1  Group
+-      bne,pn          %icc, 1f                                                ! CTI
+-       fzero          %f2                                                     ! FPA
++1:    ldub            [%g6 + TI_FPSAVED], %g5
++      wr              %g0, FPRS_FEF, %fprs
++      andcc           %g5, FPRS_FEF, %g0
++      be,a,pt         %icc, 1f
++       clr            %g7
++      ldx             [%g6 + TI_GSR], %g7
++1:    andcc           %g5, FPRS_DL, %g0
++      bne,pn          %icc, 2f
++       fzero          %f0
++      andcc           %g5, FPRS_DU, %g0
++      bne,pn          %icc, 1f
++       fzero          %f2
+       faddd           %f0, %f2, %f4
+       fmuld           %f0, %f2, %f6
+       faddd           %f0, %f2, %f8
+@@ -257,8 +257,10 @@ cplus_fptrap_insn_1:
+       add             %g6, TI_FPREGS + 0xc0, %g2
+       faddd           %f0, %f2, %f8
+       fmuld           %f0, %f2, %f10
+-      ldda            [%g1] ASI_BLK_S, %f32   ! grrr, where is ASI_BLK_NUCLEUS 8-(
++      membar          #Sync
++      ldda            [%g1] ASI_BLK_S, %f32
+       ldda            [%g2] ASI_BLK_S, %f48
++      membar          #Sync
+       faddd           %f0, %f2, %f12
+       fmuld           %f0, %f2, %f14
+       faddd           %f0, %f2, %f16
+@@ -269,7 +271,6 @@ cplus_fptrap_insn_1:
+       fmuld           %f0, %f2, %f26
+       faddd           %f0, %f2, %f28
+       fmuld           %f0, %f2, %f30
+-      membar          #Sync
+       b,pt            %xcc, fpdis_exit
+        nop
+ 2:    andcc           %g5, FPRS_DU, %g0
+@@ -286,8 +287,10 @@ cplus_fptrap_insn_2:
+       add             %g6, TI_FPREGS + 0x40, %g2
+       faddd           %f32, %f34, %f36
+       fmuld           %f32, %f34, %f38
+-      ldda            [%g1] ASI_BLK_S, %f0    ! grrr, where is ASI_BLK_NUCLEUS 8-(
++      membar          #Sync
++      ldda            [%g1] ASI_BLK_S, %f0
+       ldda            [%g2] ASI_BLK_S, %f16
++      membar          #Sync
+       faddd           %f32, %f34, %f40
+       fmuld           %f32, %f34, %f42
+       faddd           %f32, %f34, %f44
+@@ -300,7 +303,6 @@ cplus_fptrap_insn_2:
+       fmuld           %f32, %f34, %f58
+       faddd           %f32, %f34, %f60
+       fmuld           %f32, %f34, %f62
+-      membar          #Sync
+       ba,pt           %xcc, fpdis_exit
+        nop
+ 3:    mov             SECONDARY_CONTEXT, %g3
+@@ -311,7 +313,8 @@ cplus_fptrap_insn_3:
+       stxa            %g2, [%g3] ASI_DMMU
+       membar          #Sync
+       mov             0x40, %g2
+-      ldda            [%g1] ASI_BLK_S, %f0            ! grrr, where is ASI_BLK_NUCLEUS 8-(
++      membar          #Sync
++      ldda            [%g1] ASI_BLK_S, %f0
+       ldda            [%g1 + %g2] ASI_BLK_S, %f16
+       add             %g1, 0x80, %g1
+       ldda            [%g1] ASI_BLK_S, %f32
+Index: linux-2.6.13.y/arch/sparc64/kernel/rtrap.S
+===================================================================
+--- linux-2.6.13.y.orig/arch/sparc64/kernel/rtrap.S
++++ linux-2.6.13.y/arch/sparc64/kernel/rtrap.S
+@@ -310,32 +310,33 @@ kern_fpucheck:   ldub                    [%g6 + TI_FPDEPTH]
+               wr                      %g1, FPRS_FEF, %fprs
+               ldx                     [%o1 + %o5], %g1
+               add                     %g6, TI_XFSR, %o1
+-              membar                  #StoreLoad | #LoadLoad
+               sll                     %o0, 8, %o2
+               add                     %g6, TI_FPREGS, %o3
+               brz,pn                  %l6, 1f
+                add                    %g6, TI_FPREGS+0x40, %o4
++              membar                  #Sync
+               ldda                    [%o3 + %o2] ASI_BLK_P, %f0
+               ldda                    [%o4 + %o2] ASI_BLK_P, %f16
++              membar                  #Sync
+ 1:            andcc                   %l2, FPRS_DU, %g0
+               be,pn                   %icc, 1f
+                wr                     %g1, 0, %gsr
+               add                     %o2, 0x80, %o2
++              membar                  #Sync
+               ldda                    [%o3 + %o2] ASI_BLK_P, %f32
+               ldda                    [%o4 + %o2] ASI_BLK_P, %f48
+-
+ 1:            membar                  #Sync
+               ldx                     [%o1 + %o5], %fsr
+ 2:            stb                     %l5, [%g6 + TI_FPDEPTH]
+               ba,pt                   %xcc, rt_continue
+                nop
+ 5:            wr                      %g0, FPRS_FEF, %fprs
+-              membar                  #StoreLoad | #LoadLoad
+               sll                     %o0, 8, %o2
+               add                     %g6, TI_FPREGS+0x80, %o3
+               add                     %g6, TI_FPREGS+0xc0, %o4
++              membar                  #Sync
+               ldda                    [%o3 + %o2] ASI_BLK_P, %f32
+               ldda                    [%o4 + %o2] ASI_BLK_P, %f48
+               membar                  #Sync
+Index: linux-2.6.13.y/arch/sparc64/lib/VISsave.S
+===================================================================
+--- linux-2.6.13.y.orig/arch/sparc64/lib/VISsave.S
++++ linux-2.6.13.y/arch/sparc64/lib/VISsave.S
+@@ -59,15 +59,17 @@ vis1:      ldub            [%g6 + TI_FPSAVED], %g3
+       be,pn           %icc, 9b
+        add            %g6, TI_FPREGS, %g2
+       andcc           %o5, FPRS_DL, %g0
+-      membar          #StoreStore | #LoadStore
+       be,pn           %icc, 4f
+        add            %g6, TI_FPREGS+0x40, %g3
++      membar          #Sync
+       stda            %f0, [%g2 + %g1] ASI_BLK_P
+       stda            %f16, [%g3 + %g1] ASI_BLK_P
++      membar          #Sync
+       andcc           %o5, FPRS_DU, %g0
+       be,pn           %icc, 5f
+ 4:     add            %g1, 128, %g1
++      membar          #Sync
+       stda            %f32, [%g2 + %g1] ASI_BLK_P
+       stda            %f48, [%g3 + %g1] ASI_BLK_P
+@@ -87,7 +89,7 @@ vis1:        ldub            [%g6 + TI_FPSAVED], %g3
+       sll             %g1, 5, %g1
+       add             %g6, TI_FPREGS+0xc0, %g3
+       wr              %g0, FPRS_FEF, %fprs
+-      membar          #StoreStore | #LoadStore
++      membar          #Sync
+       stda            %f32, [%g2 + %g1] ASI_BLK_P
+       stda            %f48, [%g3 + %g1] ASI_BLK_P
+       membar          #Sync
+@@ -128,8 +130,8 @@ VISenterhalf:
+       be,pn           %icc, 4f
+        add            %g6, TI_FPREGS, %g2
+-      membar          #StoreStore | #LoadStore
+       add             %g6, TI_FPREGS+0x40, %g3
++      membar          #Sync
+       stda            %f0, [%g2 + %g1] ASI_BLK_P
+       stda            %f16, [%g3 + %g1] ASI_BLK_P
+       membar          #Sync
index a6e9b53c29730db86aa178a9054bf3b7da02365e..8273aa286fe89d976588b11bf17690e484a6a429 100644 (file)
@@ -2,3 +2,4 @@ ieee1394-sbp2-fixes-for-hot-unplug-and-module-unloading.patch
 orinoco-info-leak.patch
 tcp-congestion-control-bug.patch
 drm-module_param-permissions-fix.patch
+fix-sparc64-fpu-register-corruption.patch