opcodes: blackfin: handle memory read errors
authorMike Frysinger <vapier@gentoo.org>
Sat, 5 Feb 2011 06:42:19 +0000 (01:42 -0500)
committerMike Frysinger <vapier@gentoo.org>
Wed, 13 Aug 2014 10:49:47 +0000 (06:49 -0400)
The current code ignores memory read errors which isn't a great idea.
So add a helper function which takes care of error checking and update
the code to use that.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
opcodes/ChangeLog
opcodes/bfin-dis.c

index 79c42a2..fc1b494 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-13  Mike Frysinger  <vapier@gentoo.org>
+
+       * bfin-dis.c (ifetch): New function.
+       (_print_insn_bfin, print_insn_bfin): Call new ifetch and return
+       -1 when it errors.
+
 2014-07-29  Matthew Fortune  <matthew.fortune@imgtec.com>
 
        * micromips-opc.c (COD): Rename throughout to...
index 1c223ac..6991915 100644 (file)
@@ -4640,23 +4640,41 @@ decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
 }
 
 static int
+ifetch (bfd_vma pc, disassemble_info *outf, TIword *iw)
+{
+  bfd_byte buf[2];
+  int status;
+
+  status = (*outf->read_memory_func) (pc & ~0x01, buf, 2, outf);
+  if (status != 0)
+    {
+      (*outf->memory_error_func) (status, pc, outf);
+      return -1;
+    }
+
+  *iw = bfd_getl16 (buf);
+  return 0;
+}
+
+static int
 _print_insn_bfin (bfd_vma pc, disassemble_info *outf)
 {
-  bfd_byte buf[4];
   TIword iw0;
   TIword iw1;
-  int status;
   int rv = 0;
 
-  status = (*outf->read_memory_func) (pc & ~0x1, buf, 2, outf);
-  /* FIXME */
-  (void) status;
-  status = (*outf->read_memory_func) ((pc + 2) & ~0x1, buf + 2, 2, outf);
-  /* FIXME */
-  (void) status;
+  if (ifetch (pc, outf, &iw0))
+    return -1;
 
-  iw0 = bfd_getl16 (buf);
-  iw1 = bfd_getl16 (buf + 2);
+  if ((iw0 & 0xc000) == 0xc000)
+    {
+      /* 32-bit insn.  */
+      if (ifetch (pc + 2, outf, &iw1))
+       return -1;
+    }
+  else
+    /* 16-bit insn.  */
+    iw1 = 0;
 
   if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
     {
@@ -4752,17 +4770,15 @@ _print_insn_bfin (bfd_vma pc, disassemble_info *outf)
 int
 print_insn_bfin (bfd_vma pc, disassemble_info *outf)
 {
-  bfd_byte buf[2];
-  unsigned short iw0;
-  int status;
-  int count = 0;
+  TIword iw0;
+  int count;
 
-  status = (*outf->read_memory_func) (pc & ~0x01, buf, 2, outf);
-  /* FIXME */
-  (void) status;
-  iw0 = bfd_getl16 (buf);
+  if (ifetch (pc, outf, &iw0) == -1)
+    return -1;
 
-  count += _print_insn_bfin (pc, outf);
+  count = _print_insn_bfin (pc, outf);
+  if (count == -1)
+    return -1;
 
   /* Proper display of multiple issue instructions.  */
 
@@ -4775,10 +4791,14 @@ print_insn_bfin (bfd_vma pc, disassemble_info *outf)
       parallel = 1;
       OUTS (outf, " || ");
       len = _print_insn_bfin (pc + 4, outf);
+      if (len == -1)
+       return -1;
       OUTS (outf, " || ");
       if (len != 2)
        legal = 0;
       len = _print_insn_bfin (pc + 6, outf);
+      if (len == -1)
+       return -1;
       if (len != 2)
        legal = 0;