From: Timothy Wall Date: Thu, 3 Feb 2000 18:12:54 +0000 (+0000) Subject: octets vs bytes changes for binutils X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=4f92b0f966f50f57d80017b227074ac71a2d66bb;p=pf3gnuchains%2Fpf3gnuchains3x.git octets vs bytes changes for binutils --- diff --git a/include/ChangeLog b/include/ChangeLog index c526639d5f..062d73233b 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,8 @@ +2000-02-03 Timothy Wall + + * dis-asm.h (struct disassemble_info): Added octets_per_byte + field and initialize it to one (1). + 2000-01-27 Nick Clifton * dis-asm.h: Add prototype for disassembler_usage(). diff --git a/include/dis-asm.h b/include/dis-asm.h index 98a7d1737a..8dc9b712e3 100644 --- a/include/dis-asm.h +++ b/include/dis-asm.h @@ -121,6 +121,11 @@ typedef struct disassemble_info { int bytes_per_chunk; enum bfd_endian display_endian; + /* Number of octets per incremented target address + Normally one, but some DSPs have byte sizes of 16 or 32 bits + */ + int octets_per_byte; + /* Results from instruction decoders. Not all decoders yet support this information. This info is set each time an instruction is decoded, and is only valid for the last such instruction. @@ -229,6 +234,7 @@ extern int generic_symbol_at_address (INFO).arch = bfd_arch_unknown, \ (INFO).mach = 0, \ (INFO).endian = BFD_ENDIAN_UNKNOWN, \ + (INFO).octets_per_byte = 1, \ INIT_DISASSEMBLE_INFO_NO_ARCH(INFO, STREAM, FPRINTF_FUNC) /* Call this macro to initialize only the internal variables for the diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index cda0156132..2b72067cb1 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,9 @@ +2000-02-03 Timothy Wall + + * dis-buf.c (buffer_read_memory): Use octets_per_byte field + to adjust target address bounds checking and calculate the + appropriate octet offset into data. + 2000-01-27 Nick Clifton * arm-dis.c: (parse_disassembler_option): Rename to diff --git a/opcodes/dis-buf.c b/opcodes/dis-buf.c index 523fe72789..65b1edb3e6 100644 --- a/opcodes/dis-buf.c +++ b/opcodes/dis-buf.c @@ -29,11 +29,17 @@ buffer_read_memory (memaddr, myaddr, length, info) int length; struct disassemble_info *info; { + int opb = info->octets_per_byte; + int end_addr_offset = length / opb; + int max_addr_offset = info->buffer_length / opb; + int octets = (memaddr - info->buffer_vma) * opb; + if (memaddr < info->buffer_vma - || memaddr - info->buffer_vma + length > info->buffer_length) + || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset) /* Out of bounds. Use EIO because GDB uses it. */ return EIO; - memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); + memcpy (myaddr, info->buffer + octets, length); + return 0; }