[committed] microMIPS: Add SYSCALL instruction decoding

Message ID alpine.DEB.2.00.1807181907160.30992@tp.orcam.me.uk
State Committed
Headers

Commit Message

Maciej W. Rozycki July 18, 2018, 6:19 p.m. UTC
  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/mips-tdep.c |   30 ++++++++++++++++++++++++------
 1 file changed, 24 insertions(+), 6 deletions(-)

gdb-umips-syscall-next-pc.diff
  

Patch

Index: binutils/gdb/mips-tdep.c
===================================================================
--- binutils.orig/gdb/mips-tdep.c	2018-07-06 01:40:38.223001953 +0100
+++ binutils/gdb/mips-tdep.c	2018-07-18 14:57:54.894640266 +0100
@@ -1898,12 +1898,30 @@  micromips_next_pc (struct regcache *regc
       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 */