This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] opcodes: blackfin: handle memory read errors


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>

2011-02-04  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.
---
 opcodes/bfin-dis.c | 58 ++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 39 insertions(+), 19 deletions(-)

diff --git a/opcodes/bfin-dis.c b/opcodes/bfin-dis.c
index 1c223ac..6991915 100644
--- a/opcodes/bfin-dis.c
+++ b/opcodes/bfin-dis.c
@@ -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;
 
-- 
2.0.0


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]