MIPS: Loongson-3: Calculate ra properly when unwinding the stack
authorHuacai Chen <chenhc@lemote.com>
Mon, 21 Sep 2020 09:12:28 +0000 (17:12 +0800)
committerThomas Bogendoerfer <tsbogend@alpha.franken.de>
Mon, 21 Sep 2020 20:15:22 +0000 (22:15 +0200)
Loongson-3 has 16-bytes load/store instructions: gslq and gssq. This
patch calculate ra properly when unwinding the stack, if ra is saved
by gssq and restored by gslq.

Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
arch/mips/kernel/process.c

index b36297ee2b37827c00a1904dfd2d5dfd14843a7b..37f05c8605c2eeec186766ce3354d30c7eada665 100644 (file)
@@ -279,7 +279,21 @@ static inline int is_ra_save_ins(union mips_instruction *ip, int *poff)
                *poff = ip->i_format.simmediate / sizeof(ulong);
                return 1;
        }
-
+#ifdef CONFIG_CPU_LOONGSON64
+       if ((ip->loongson3_lswc2_format.opcode == swc2_op) &&
+                     (ip->loongson3_lswc2_format.ls == 1) &&
+                     (ip->loongson3_lswc2_format.fr == 0) &&
+                     (ip->loongson3_lswc2_format.base == 29)) {
+               if (ip->loongson3_lswc2_format.rt == 31) {
+                       *poff = ip->loongson3_lswc2_format.offset << 1;
+                       return 1;
+               }
+               if (ip->loongson3_lswc2_format.rq == 31) {
+                       *poff = (ip->loongson3_lswc2_format.offset << 1) + 1;
+                       return 1;
+               }
+       }
+#endif
        return 0;
 #endif
 }