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; | ... | ... |