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