Using .set mips3/32/64 without .set push/pop is fragile. This patch
solves this issue by sync'ing the inline-asm functions with the
latest Linux ones.

Signed-off-by: Stefan Roese <s...@denx.de>
---

 arch/mips/include/asm/mipsregs.h | 44 +++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 18 deletions(-)

diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 459ef43fa6..bf09e35e16 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -934,9 +934,10 @@ do {                                                       
        \
                        : "=r" (__res));                                \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips32\n\t"                              \
                        "mfc0\t%0, " #source ", " #sel "\n\t"           \
-                       ".set\tmips0\n\t"                               \
+                       ".set\tpop\n\t"                                 \
                        : "=r" (__res));                                \
        __res;                                                          \
 })
@@ -947,15 +948,17 @@ do {                                                      
        \
                __res = __read_64bit_c0_split(source, sel);             \
        else if (sel == 0)                                              \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips3\n\t"                               \
                        "dmfc0\t%0, " #source "\n\t"                    \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : "=r" (__res));                                \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
                        "dmfc0\t%0, " #source ", " #sel "\n\t"          \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : "=r" (__res));                                \
        __res;                                                          \
 })
@@ -968,9 +971,10 @@ do {                                                       
                \
                        : : "Jr" ((unsigned int)(value)));              \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips32\n\t"                              \
                        "mtc0\t%z0, " #register ", " #sel "\n\t"        \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : : "Jr" ((unsigned int)(value)));              \
 } while (0)
 
@@ -980,15 +984,17 @@ do {                                                      
                \
                __write_64bit_c0_split(register, sel, value);           \
        else if (sel == 0)                                              \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips3\n\t"                               \
                        "dmtc0\t%z0, " #register "\n\t"                 \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : : "Jr" (value));                              \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
                        "dmtc0\t%z0, " #register ", " #sel "\n\t"       \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : : "Jr" (value));                              \
 } while (0)
 
@@ -1033,21 +1039,21 @@ do {                                                    
                \
                                                                        \
        if (sel == 0)                                                   \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
-                       "dmfc0\t%M0, " #source "\n\t"                   \
-                       "dsll\t%L0, %M0, 32\n\t"                        \
-                       "dsra\t%M0, %M0, 32\n\t"                        \
-                       "dsra\t%L0, %L0, 32\n\t"                        \
-                       ".set\tmips0"                                   \
+                       "dmfc0\t%L0, " #source "\n\t"                   \
+                       "dsra\t%M0, %L0, 32\n\t"                        \
+                       "sll\t%L0, %L0, 0\n\t"                          \
+                       ".set\tpop"                                     \
                        : "=r" (__val));                                \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
-                       "dmfc0\t%M0, " #source ", " #sel "\n\t"         \
-                       "dsll\t%L0, %M0, 32\n\t"                        \
-                       "dsra\t%M0, %M0, 32\n\t"                        \
-                       "dsra\t%L0, %L0, 32\n\t"                        \
-                       ".set\tmips0"                                   \
+                       "dmfc0\t%L0, " #source ", " #sel "\n\t"         \
+                       "dsra\t%M0, %L0, 32\n\t"                        \
+                       "sll\t%L0, %L0, 0\n\t"                          \
+                       ".set\tpop"                                     \
                        : "=r" (__val));                                \
                                                                        \
        __val;                                                          \
@@ -1057,23 +1063,25 @@ do {                                                    
                \
 do {                                                                   \
        if (sel == 0)                                                   \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
                        "dsll\t%L0, %L0, 32\n\t"                        \
                        "dsrl\t%L0, %L0, 32\n\t"                        \
                        "dsll\t%M0, %M0, 32\n\t"                        \
                        "or\t%L0, %L0, %M0\n\t"                         \
                        "dmtc0\t%L0, " #source "\n\t"                   \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : : "r" (val));                                 \
        else                                                            \
                __asm__ __volatile__(                                   \
+                       ".set\tpush\n\t"                                \
                        ".set\tmips64\n\t"                              \
                        "dsll\t%L0, %L0, 32\n\t"                        \
                        "dsrl\t%L0, %L0, 32\n\t"                        \
                        "dsll\t%M0, %M0, 32\n\t"                        \
                        "or\t%L0, %L0, %M0\n\t"                         \
                        "dmtc0\t%L0, " #source ", " #sel "\n\t"         \
-                       ".set\tmips0"                                   \
+                       ".set\tpop"                                     \
                        : : "r" (val));                                 \
 } while (0)
 
-- 
2.26.2

Reply via email to