microMIPS: Add SYSCALL instruction decoding
authorMaciej W. Rozycki <macro@mips.com>
Wed, 18 Jul 2018 18:17:39 +0000 (19:17 +0100)
committerMaciej W. Rozycki <macro@mips.com>
Wed, 18 Jul 2018 18:17:39 +0000 (19:17 +0100)
Fix a bug with commit 4cc0665f24bb ("microMIPS support"),
<https://sourceware.org/ml/gdb-patches/2012-05/msg00724.html>, and add
missing microMIPS SYSCALL instruction decoding needed to determine the
location to put a breakpoint at when single-stepping though a syscall.

gdb/
* mips-tdep.c (micromips_next_pc): Add SYSCALL instruction
decoding.

gdb/ChangeLog
gdb/mips-tdep.c

index 7e7f88a12b93eb39b026ae7924dfa20579b55971..a30780a351ac3245025b6de09d6d00580e900dc2 100644 (file)
@@ -1,3 +1,8 @@
+2018-07-18  Maciej W. Rozycki  <macro@mips.com>
+
+       * mips-tdep.c (micromips_next_pc): Add SYSCALL instruction
+       decoding.
+
 2018-07-17  Tom Tromey  <tom@tromey.com>
 
        * guile/scm-param.c (pascm_set_func, pascm_show_func)
index 36fae02cb00d90fd5e402c5d08f4e1f99775a26e..37a12a9f559bb8b2600275e308e4dde57d4eb696 100644 (file)
@@ -1898,12 +1898,30 @@ micromips_next_pc (struct regcache *regcache, CORE_ADDR pc)
       switch (micromips_op (insn >> 16))
        {
        case 0x00: /* POOL32A: bits 000000 */
-         if (b0s6_op (insn) == 0x3c
-                               /* POOL32Axf: bits 000000 ... 111100 */
-             && (b6s10_ext (insn) & 0x2bf) == 0x3c)
-                               /* JALR, JALR.HB: 000000 000x111100 111100 */
-                               /* JALRS, JALRS.HB: 000000 010x111100 111100 */
-           pc = regcache_raw_get_signed (regcache, b0s5_reg (insn >> 16));
+         switch (b0s6_op (insn))
+           {
+           case 0x3c: /* POOL32Axf: bits 000000 ... 111100 */
+             switch (b6s10_ext (insn))
+               {
+               case 0x3c:  /* JALR:     000000 0000111100 111100 */
+               case 0x7c:  /* JALR.HB:  000000 0001111100 111100 */
+               case 0x13c: /* JALRS:    000000 0100111100 111100 */
+               case 0x17c: /* JALRS.HB: 000000 0101111100 111100 */
+                 pc = regcache_raw_get_signed (regcache,
+                                               b0s5_reg (insn >> 16));
+                 break;
+               case 0x22d: /* SYSCALL:  000000 1000101101 111100 */
+                 {
+                   struct gdbarch_tdep *tdep;
+
+                   tdep = gdbarch_tdep (gdbarch);
+                   if (tdep->syscall_next_pc != NULL)
+                     pc = tdep->syscall_next_pc (get_current_frame ());
+                 }
+                 break;
+               }
+             break;
+           }
          break;
 
        case 0x10: /* POOL32I: bits 010000 */