Commit 95cbfc643dd8e0c4dd3690fbbbbc20f2a8af5998
1 parent
5898e816
changed disas() prototype for multi target support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@233 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
18 additions
and
13 deletions
disas.c
... | ... | @@ -92,8 +92,9 @@ bfd_vma bfd_getb32 (const bfd_byte *addr) |
92 | 92 | return (bfd_vma) v; |
93 | 93 | } |
94 | 94 | |
95 | -/* Disassemble this for me please... (debugging). */ | |
96 | -void disas(FILE *out, void *code, unsigned long size, enum disas_type type) | |
95 | +/* Disassemble this for me please... (debugging). 'flags' is only used | |
96 | + for i386: non zero means 16 bit code */ | |
97 | +void disas(FILE *out, void *code, unsigned long size, int is_host, int flags) | |
97 | 98 | { |
98 | 99 | uint8_t *pc; |
99 | 100 | int count; |
... | ... | @@ -106,7 +107,7 @@ void disas(FILE *out, void *code, unsigned long size, enum disas_type type) |
106 | 107 | disasm_info.buffer_vma = (unsigned long)code; |
107 | 108 | disasm_info.buffer_length = size; |
108 | 109 | |
109 | - if (type == DISAS_TARGET) { | |
110 | + if (is_host) { | |
110 | 111 | #ifdef WORDS_BIGENDIAN |
111 | 112 | disasm_info.endian = BFD_ENDIAN_BIG; |
112 | 113 | #else |
... | ... | @@ -128,13 +129,23 @@ void disas(FILE *out, void *code, unsigned long size, enum disas_type type) |
128 | 129 | return; |
129 | 130 | #endif |
130 | 131 | } else { |
131 | - /* Currently only source supported in x86. */ | |
132 | +#ifdef TARGET_WORDS_BIGENDIAN | |
133 | + disasm_info.endian = BFD_ENDIAN_BIG; | |
134 | +#else | |
132 | 135 | disasm_info.endian = BFD_ENDIAN_LITTLE; |
133 | - if (type == DISAS_I386_I386) | |
136 | +#endif | |
137 | +#if defined(TARGET_I386) | |
138 | + if (!flags) | |
134 | 139 | disasm_info.mach = bfd_mach_i386_i386; |
135 | 140 | else |
136 | 141 | disasm_info.mach = bfd_mach_i386_i8086; |
137 | 142 | print_insn = print_insn_i386; |
143 | +#elif defined(TARGET_ARM) | |
144 | + print_insn = print_insn_arm; | |
145 | +#else | |
146 | + fprintf(out, "Asm output not supported on this arch\n"); | |
147 | + return; | |
148 | +#endif | |
138 | 149 | } |
139 | 150 | |
140 | 151 | for (pc = code; pc < (uint8_t *)code + size; pc += count) { |
... | ... | @@ -142,7 +153,7 @@ void disas(FILE *out, void *code, unsigned long size, enum disas_type type) |
142 | 153 | #ifdef __arm__ |
143 | 154 | /* since data are included in the code, it is better to |
144 | 155 | display code data too */ |
145 | - if (type == DISAS_TARGET) { | |
156 | + if (is_host) { | |
146 | 157 | fprintf(out, "%08x ", (int)bfd_getl32((const bfd_byte *)pc)); |
147 | 158 | } |
148 | 159 | #endif | ... | ... |
disas.h
1 | 1 | #ifndef _QEMU_DISAS_H |
2 | 2 | #define _QEMU_DISAS_H |
3 | 3 | |
4 | -enum disas_type { | |
5 | - DISAS_I386_I386, | |
6 | - DISAS_I386_I8086, | |
7 | - DISAS_TARGET, /* whatever host is. */ | |
8 | -}; | |
9 | - | |
10 | 4 | /* Disassemble this for me please... (debugging). */ |
11 | -void disas(FILE *out, void *code, unsigned long size, enum disas_type type); | |
5 | +void disas(FILE *out, void *code, unsigned long size, int is_host, int flags); | |
12 | 6 | |
13 | 7 | /* Look up symbol for debugging purpose. Returns "" if unknown. */ |
14 | 8 | const char *lookup_symbol(void *orig_addr); | ... | ... |