]> git.karo-electronics.de Git - linux-beck.git/commitdiff
sh: DSP save/restore ordering and a0 sign extension fixups.
authorPaul Mundt <lethal@linux-sh.org>
Thu, 20 Aug 2009 05:02:20 +0000 (14:02 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Thu, 20 Aug 2009 05:02:20 +0000 (14:02 +0900)
As an excellent indicator of how much testing the DSP code gets, a couple
of rather glaring bugs in the DSP save/restore paths were found:

- In the DSP restore case a0 needs to be popped off before a0g,
  or the value of a0g is clobbered by the MSB of a0 in the case
  of sign extension.

- Beyond that, the save and restore orders were out of sync,
  so this fixes that up as well. At the same time, we switch over
  to using movs.l for both the save and restore of the general DSP
  registers as opposed to using sts.l (which was initially put in
  place to work around a bug in ancient binutils versions which
  the kernel no longer supports).

Reported-by: Chee Soon Yip <yip.cheesoon@renesas.com>
Cc: Chu Lih Kwek <kwek.chulih@renesas.com>,
Cc: General Lai <general.lai@renesas.com>,
Cc: Robert Cozens <Robert.Cozens@renesas.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/include/asm/system_32.h

index 6c68a51f1cc589e7d9773893fa8807aba452645a..81e0d668eefd0a9dadf456ccb6c032cfbabab8eb 100644 (file)
@@ -14,12 +14,12 @@ do {                                                                        \
                        (u32 *)&tsk->thread.dsp_status;                 \
        __asm__ __volatile__ (                                          \
                ".balign 4\n\t"                                         \
+               "movs.l @r2+, a0\n\t"                                   \
                "movs.l @r2+, a1\n\t"                                   \
                "movs.l @r2+, a0g\n\t"                                  \
                "movs.l @r2+, a1g\n\t"                                  \
                "movs.l @r2+, m0\n\t"                                   \
                "movs.l @r2+, m1\n\t"                                   \
-               "movs.l @r2+, a0\n\t"                                   \
                "movs.l @r2+, x0\n\t"                                   \
                "movs.l @r2+, x1\n\t"                                   \
                "movs.l @r2+, y0\n\t"                                   \
@@ -39,20 +39,20 @@ do {                                                                        \
                                                                        \
        __asm__ __volatile__ (                                          \
                ".balign 4\n\t"                                         \
-               "stc.l  mod, @-r2\n\t"                          \
+               "stc.l  mod, @-r2\n\t"                                  \
                "stc.l  re, @-r2\n\t"                                   \
                "stc.l  rs, @-r2\n\t"                                   \
-               "sts.l  dsr, @-r2\n\t"                          \
-               "sts.l  y1, @-r2\n\t"                                   \
-               "sts.l  y0, @-r2\n\t"                                   \
-               "sts.l  x1, @-r2\n\t"                                   \
-               "sts.l  x0, @-r2\n\t"                                   \
-               "sts.l  a0, @-r2\n\t"                                   \
-               ".word  0xf653          ! movs.l        a1, @-r2\n\t"   \
-               ".word  0xf6f3          ! movs.l        a0g, @-r2\n\t"  \
-               ".word  0xf6d3          ! movs.l        a1g, @-r2\n\t"  \
-               ".word  0xf6c3          ! movs.l        m0, @-r2\n\t"   \
-               ".word  0xf6e3          ! movs.l        m1, @-r2\n\t"   \
+               "sts.l  dsr, @-r2\n\t"                                  \
+               "movs.l y1, @-r2\n\t"                                   \
+               "movs.l y0, @-r2\n\t"                                   \
+               "movs.l x1, @-r2\n\t"                                   \
+               "movs.l x0, @-r2\n\t"                                   \
+               "movs.l m1, @-r2\n\t"                                   \
+               "movs.l m0, @-r2\n\t"                                   \
+               "movs.l a1g, @-r2\n\t"                                  \
+               "movs.l a0g, @-r2\n\t"                                  \
+               "movs.l a1, @-r2\n\t"                                   \
+               "movs.l a0, @-r2\n\t"                                   \
                : : "r" (__ts2));                                       \
 } while (0)