|
6 | 6 | #include "qemu/osdep.h" |
7 | 7 | #include "disas/disas.h" |
8 | 8 | #include "disas/capstone.h" |
| 9 | +#include "exec/translator.h" |
9 | 10 | #include "disas-internal.h" |
10 | 11 |
|
11 | 12 |
|
12 | | -void target_disas(FILE *out, CPUState *cpu, uint64_t code, size_t size) |
| 13 | +static int translator_read_memory(bfd_vma memaddr, bfd_byte *myaddr, |
| 14 | + int length, struct disassemble_info *info) |
13 | 15 | { |
| 16 | + const DisasContextBase *db = info->application_data; |
| 17 | + return translator_st(db, myaddr, memaddr, length) ? 0 : EIO; |
| 18 | +} |
| 19 | + |
| 20 | +void target_disas(FILE *out, CPUState *cpu, const struct DisasContextBase *db) |
| 21 | +{ |
| 22 | + uint64_t code = db->pc_first; |
| 23 | + size_t size = translator_st_len(db); |
14 | 24 | uint64_t pc; |
15 | 25 | int count; |
16 | 26 | CPUDebug s; |
17 | 27 |
|
18 | 28 | disas_initialize_debug_target(&s, cpu); |
| 29 | + s.info.read_memory_func = translator_read_memory; |
| 30 | + s.info.application_data = (void *)db; |
19 | 31 | s.info.fprintf_func = fprintf; |
20 | 32 | s.info.stream = out; |
21 | 33 | s.info.buffer_vma = code; |
@@ -58,12 +70,15 @@ static void plugin_print_address(bfd_vma addr, struct disassemble_info *info) |
58 | 70 | * there is left over it usually indicates the front end has read more |
59 | 71 | * bytes than it needed. |
60 | 72 | */ |
61 | | -char *plugin_disas(CPUState *cpu, uint64_t addr, size_t size) |
| 73 | +char *plugin_disas(CPUState *cpu, const DisasContextBase *db, |
| 74 | + uint64_t addr, size_t size) |
62 | 75 | { |
63 | 76 | CPUDebug s; |
64 | 77 | GString *ds = g_string_new(NULL); |
65 | 78 |
|
66 | 79 | disas_initialize_debug_target(&s, cpu); |
| 80 | + s.info.read_memory_func = translator_read_memory; |
| 81 | + s.info.application_data = (void *)db; |
67 | 82 | s.info.fprintf_func = disas_gstring_printf; |
68 | 83 | s.info.stream = (FILE *)ds; /* abuse this slot */ |
69 | 84 | s.info.buffer_vma = addr; |
|
0 commit comments