]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - opcodes/dis-buf.c
* dis-buf.c (buffer_read_memory): Give error for reading just
[thirdparty/binutils-gdb.git] / opcodes / dis-buf.c
CommitLineData
252b5132 1/* Disassemble from a buffer, for GNU.
9b201bb5 2 Copyright 1993, 1994, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2005,
f66187fd 3 2007, 2009, 2010 Free Software Foundation, Inc.
252b5132 4
9b201bb5
NC
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
47b0e7ad 8 it under the terms of the GNU General Public License as published by
9b201bb5
NC
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
252b5132 11
9b201bb5
NC
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
252b5132 16
47b0e7ad
NC
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
252b5132
RH
21
22#include "sysdep.h"
23#include "dis-asm.h"
24#include <errno.h>
25#include "opintl.h"
26
27/* Get LENGTH bytes from info's buffer, at target address memaddr.
28 Transfer them to myaddr. */
29int
47b0e7ad
NC
30buffer_read_memory (bfd_vma memaddr,
31 bfd_byte *myaddr,
32 unsigned int length,
33 struct disassemble_info *info)
252b5132 34{
f6af82bd
AM
35 unsigned int opb = info->octets_per_byte;
36 unsigned int end_addr_offset = length / opb;
37 unsigned int max_addr_offset = info->buffer_length / opb;
38 unsigned int octets = (memaddr - info->buffer_vma) * opb;
940b2b78 39
252b5132 40 if (memaddr < info->buffer_vma
f66187fd 41 || memaddr - info->buffer_vma > max_addr_offset
940b2b78 42 || memaddr - info->buffer_vma + end_addr_offset > max_addr_offset)
252b5132
RH
43 /* Out of bounds. Use EIO because GDB uses it. */
44 return EIO;
940b2b78
TW
45 memcpy (myaddr, info->buffer + octets, length);
46
252b5132
RH
47 return 0;
48}
49
50/* Print an error message. We can assume that this is in response to
51 an error return from buffer_read_memory. */
47b0e7ad 52
252b5132 53void
47b0e7ad
NC
54perror_memory (int status,
55 bfd_vma memaddr,
56 struct disassemble_info *info)
252b5132
RH
57{
58 if (status != EIO)
59 /* Can't happen. */
60 info->fprintf_func (info->stream, _("Unknown error %d\n"), status);
61 else
d6098898
L
62 {
63 char buf[30];
64
65 /* Actually, address between memaddr and memaddr + len was
66 out of bounds. */
67 sprintf_vma (buf, memaddr);
68 info->fprintf_func (info->stream,
69 _("Address 0x%s is out of bounds.\n"), buf);
70 }
252b5132
RH
71}
72
73/* This could be in a separate file, to save miniscule amounts of space
74 in statically linked executables. */
75
76/* Just print the address is hex. This is included for completeness even
77 though both GDB and objdump provide their own (to print symbolic
78 addresses). */
79
80void
47b0e7ad 81generic_print_address (bfd_vma addr, struct disassemble_info *info)
252b5132 82{
9c492adc
ILT
83 char buf[30];
84
85 sprintf_vma (buf, addr);
86 (*info->fprintf_func) (info->stream, "0x%s", buf);
252b5132
RH
87}
88
22a398e1 89/* Just return true. */
252b5132
RH
90
91int
47b0e7ad
NC
92generic_symbol_at_address (bfd_vma addr ATTRIBUTE_UNUSED,
93 struct disassemble_info *info ATTRIBUTE_UNUSED)
252b5132
RH
94{
95 return 1;
96}
22a398e1
NC
97
98/* Just return TRUE. */
99
100bfd_boolean
101generic_symbol_is_valid (asymbol * sym ATTRIBUTE_UNUSED,
102 struct disassemble_info *info ATTRIBUTE_UNUSED)
103{
104 return TRUE;
105}