diff options
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 14 | ||||
-rw-r--r-- | opcodes/bfin-dis.c | 2 | ||||
-rw-r--r-- | opcodes/dis-buf.c | 4 | ||||
-rw-r--r-- | opcodes/mcore-dis.c | 11 | ||||
-rw-r--r-- | opcodes/sh-dis.c | 2 | ||||
-rw-r--r-- | opcodes/tic6x-dis.c | 3 | ||||
-rw-r--r-- | opcodes/vax-dis.c | 3 |
7 files changed, 33 insertions, 6 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index f764473..0697cbe 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,17 @@ +2015-06-22 Nick Clifton <nickc@redhat.com> + + * dis-buf.c (buffer_read_memory): Fail is stop_vma is set and the + requested region lies beyond it. + * bfin-dis.c (print_insn_bfin): Ignore sysop instructions when + looking for 32-bit insns. + * mcore-dis.c (print_insn_mcore): Disable stop_vma when reading + data. + * sh-dis.c (print_insn_sh): Likewise. + * tic6x-dis.c (print_insn_tic6x): Disable stop_vma when reading + blocks of instructions. + * vax-dis.c (print_insn_vax): Check that the requested address + does not clash with the stop_vma. + 2015-06-19 Peter Bergner <bergner@vnet.ibm.com> * ppc-dis.h (skip_optional_operands): Use ppc_optional_operand_value. diff --git a/opcodes/bfin-dis.c b/opcodes/bfin-dis.c index cf66b79..bf2052e 100644 --- a/opcodes/bfin-dis.c +++ b/opcodes/bfin-dis.c @@ -4664,7 +4664,7 @@ _print_insn_bfin (bfd_vma pc, disassemble_info *outf) return -1; priv->iw0 = iw0; - if ((iw0 & 0xc000) == 0xc000) + if (((iw0 & 0xc000) == 0xc000) && ((iw0 & 0xff00) != 0xf800)) { /* 32-bit insn. */ if (ifetch (pc + 2, outf, &iw1)) diff --git a/opcodes/dis-buf.c b/opcodes/dis-buf.c index cc0e3ad..7c5d9ad 100644 --- a/opcodes/dis-buf.c +++ b/opcodes/dis-buf.c @@ -38,7 +38,9 @@ buffer_read_memory (bfd_vma memaddr, if (memaddr < info->buffer_vma || memaddr - info->buffer_vma > max_addr_offset - || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset) + || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset + || (info->stop_vma && (memaddr >= info->stop_vma + || memaddr + end_addr_offset > info->stop_vma))) /* Out of bounds. Use EIO because GDB uses it. */ return EIO; memcpy (myaddr, info->buffer + octets, length); diff --git a/opcodes/mcore-dis.c b/opcodes/mcore-dis.c index dc62099..536f79b 100644 --- a/opcodes/mcore-dis.c +++ b/opcodes/mcore-dis.c @@ -88,9 +88,8 @@ static const char *crname[] = { static const unsigned isiz[] = { 2, 0, 1, 0 }; int -print_insn_mcore (memaddr, info) - bfd_vma memaddr; - struct disassemble_info *info; +print_insn_mcore (bfd_vma memaddr, + struct disassemble_info *info) { unsigned char ibytes[4]; fprintf_ftype print_func = info->fprintf_func; @@ -233,6 +232,9 @@ print_insn_mcore (memaddr, info) val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC; + /* We are not reading an instruction, so allow + reads to extend beyond the next symbol. */ + info->stop_vma = 0; status = info->read_memory_func (val, ibytes, 4, info); if (status != 0) { @@ -263,6 +265,9 @@ print_insn_mcore (memaddr, info) val = (memaddr + 2 + ((inst & 0xFF) << 2)) & 0xFFFFFFFC; + /* We are not reading an instruction, so allow + reads to extend beyond the next symbol. */ + info->stop_vma = 0; status = info->read_memory_func (val, ibytes, 4, info); if (status != 0) { diff --git a/opcodes/sh-dis.c b/opcodes/sh-dis.c index 74de9f6..a3f645d 100644 --- a/opcodes/sh-dis.c +++ b/opcodes/sh-dis.c @@ -905,6 +905,8 @@ print_insn_sh (bfd_vma memaddr, struct disassemble_info *info) size = 2; else size = 4; + /* Not reading an instruction - disable stop_vma. */ + info->stop_vma = 0; status = info->read_memory_func (disp_pc_addr, bytes, size, info); if (status == 0) { diff --git a/opcodes/tic6x-dis.c b/opcodes/tic6x-dis.c index e027340..498ffe0 100644 --- a/opcodes/tic6x-dis.c +++ b/opcodes/tic6x-dis.c @@ -249,6 +249,9 @@ print_insn_tic6x (bfd_vma addr, struct disassemble_info *info) fp_offset = addr & 0x1f; fp_addr = addr - fp_offset; + /* Read in a block of instructions. Since there might be a + symbol in the middle of this block, disable stop_vma. */ + info->stop_vma = 0; status = info->read_memory_func (fp_addr, fp, 32, info); if (status) { diff --git a/opcodes/vax-dis.c b/opcodes/vax-dis.c index a7a1ccb..da4ba7c 100644 --- a/opcodes/vax-dis.c +++ b/opcodes/vax-dis.c @@ -402,7 +402,8 @@ print_insn_vax (bfd_vma memaddr, disassemble_info *info) argp = NULL; /* Check if the info buffer has more than one byte left since the last opcode might be a single byte with no argument data. */ - if (info->buffer_length - (memaddr - info->buffer_vma) > 1) + if (info->buffer_length - (memaddr - info->buffer_vma) > 1 + && (info->stop_vma == 0 || memaddr < (info->stop_vma - 1))) { FETCH_DATA (info, buffer + 2); } |