Commit c6105c0a042ba0ecb59038f9f2edab8aa4322baf
1 parent
93a40ea9
added correct memory access code for system emulation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@407 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
33 additions
and
6 deletions
disas.c
... | ... | @@ -5,6 +5,9 @@ |
5 | 5 | #include "elf.h" |
6 | 6 | #include <errno.h> |
7 | 7 | |
8 | +#include "cpu.h" | |
9 | +#include "exec-all.h" | |
10 | + | |
8 | 11 | /* Filled in by elfload.c. Simplistic, but will do for now. */ |
9 | 12 | unsigned int disas_num_syms; |
10 | 13 | void *disas_symtab; |
... | ... | @@ -19,14 +22,32 @@ buffer_read_memory (memaddr, myaddr, length, info) |
19 | 22 | int length; |
20 | 23 | struct disassemble_info *info; |
21 | 24 | { |
22 | - if (memaddr < info->buffer_vma | |
23 | - || memaddr + length > info->buffer_vma + info->buffer_length) | |
24 | - /* Out of bounds. Use EIO because GDB uses it. */ | |
25 | - return EIO; | |
26 | - memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); | |
27 | - return 0; | |
25 | + if (memaddr < info->buffer_vma | |
26 | + || memaddr + length > info->buffer_vma + info->buffer_length) | |
27 | + /* Out of bounds. Use EIO because GDB uses it. */ | |
28 | + return EIO; | |
29 | + memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); | |
30 | + return 0; | |
28 | 31 | } |
29 | 32 | |
33 | +#if !defined(CONFIG_USER_ONLY) | |
34 | +/* Get LENGTH bytes from info's buffer, at target address memaddr. | |
35 | + Transfer them to myaddr. */ | |
36 | +static int | |
37 | +target_read_memory (memaddr, myaddr, length, info) | |
38 | + bfd_vma memaddr; | |
39 | + bfd_byte *myaddr; | |
40 | + int length; | |
41 | + struct disassemble_info *info; | |
42 | +{ | |
43 | + int i; | |
44 | + for(i = 0; i < length; i++) { | |
45 | + myaddr[i] = ldub_code((void *)((long)memaddr)); | |
46 | + } | |
47 | + return 0; | |
48 | +} | |
49 | +#endif | |
50 | + | |
30 | 51 | /* Print an error message. We can assume that this is in response to |
31 | 52 | an error return from buffer_read_memory. */ |
32 | 53 | void |
... | ... | @@ -103,6 +124,12 @@ void disas(FILE *out, void *code, unsigned long size, int is_host, int flags) |
103 | 124 | |
104 | 125 | INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf); |
105 | 126 | |
127 | +#if !defined(CONFIG_USER_ONLY) | |
128 | + if (!is_host) { | |
129 | + disasm_info.read_memory_func = target_read_memory; | |
130 | + } | |
131 | +#endif | |
132 | + | |
106 | 133 | disasm_info.buffer = code; |
107 | 134 | disasm_info.buffer_vma = (unsigned long)code; |
108 | 135 | disasm_info.buffer_length = size; | ... | ... |