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>
This commit is contained in:
Mike Frysinger 2011-02-05 01:42:19 -05:00
parent 63e1777c6c
commit ba32981791
2 changed files with 45 additions and 19 deletions

View 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...

View File

@ -4639,24 +4639,42 @@ decode_pseudodbg_assert_0 (TIword iw0, TIword iw1, disassemble_info *outf)
return 4;
}
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;