diff options
author | Mike Frysinger <vapier@gentoo.org> | 2011-02-05 01:42:19 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2014-08-13 06:49:47 -0400 |
commit | ba32981791a749df5e742abbc4bc2f71a3161d6e (patch) | |
tree | 9e6b30348f37650cff6851d169d5a364743261cc | |
parent | 63e1777c6c20434c9909eb0f235b14f623d1f914 (diff) | |
download | gdb-ba32981791a749df5e742abbc4bc2f71a3161d6e.zip gdb-ba32981791a749df5e742abbc4bc2f71a3161d6e.tar.gz gdb-ba32981791a749df5e742abbc4bc2f71a3161d6e.tar.bz2 |
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>
-rw-r--r-- | opcodes/ChangeLog | 6 | ||||
-rw-r--r-- | opcodes/bfin-dis.c | 58 |
2 files changed, 45 insertions, 19 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 79c42a2..fc1b494 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -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... 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; |