projects
/
qemu
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
0.8.0-alt1
[qemu]
/
qemu
/
disas.c
diff --git
a/qemu/disas.c
b/qemu/disas.c
index
aea8cfe
..
f8281b5
100644
(file)
--- a/
qemu/disas.c
+++ b/
qemu/disas.c
@@
-138,6
+138,7
@@
print_insn_thumb1(bfd_vma pc, disassemble_info *info)
values:
i386 - nonzero means 16 bit code
arm - nonzero means thumb code
values:
i386 - nonzero means 16 bit code
arm - nonzero means thumb code
+ ppc - nonzero means little endian
other targets - unused
*/
void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
other targets - unused
*/
void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
@@
-177,7
+178,7
@@
void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
disasm_info.mach = bfd_mach_sparc_v9b;
#endif
#elif defined(TARGET_PPC)
disasm_info.mach = bfd_mach_sparc_v9b;
#endif
#elif defined(TARGET_PPC)
- if (cpu_single_env->msr[MSR_LE])
+ if (flags)
disasm_info.endian = BFD_ENDIAN_LITTLE;
#ifdef TARGET_PPC64
disasm_info.mach = bfd_mach_ppc64;
disasm_info.endian = BFD_ENDIAN_LITTLE;
#ifdef TARGET_PPC64
disasm_info.mach = bfd_mach_ppc64;
@@
-186,8
+187,14
@@
void target_disas(FILE *out, target_ulong code, target_ulong size, int flags)
#endif
print_insn = print_insn_ppc;
#elif defined(TARGET_MIPS)
#endif
print_insn = print_insn_ppc;
#elif defined(TARGET_MIPS)
+#ifdef TARGET_WORDS_BIGENDIAN
print_insn = print_insn_big_mips;
#else
print_insn = print_insn_big_mips;
#else
+ print_insn = print_insn_little_mips;
+#endif
+#elif defined(TARGET_M68K)
+ print_insn = print_insn_m68k;
+#else
fprintf(out, "0x" TARGET_FMT_lx
": Asm output not supported on this arch\n", code);
return;
fprintf(out, "0x" TARGET_FMT_lx
": Asm output not supported on this arch\n", code);
return;
@@
-251,6
+258,8
@@
void disas(FILE *out, void *code, unsigned long size)
print_insn = print_insn_big_mips;
#elif defined(__MIPSEL__)
print_insn = print_insn_little_mips;
print_insn = print_insn_big_mips;
#elif defined(__MIPSEL__)
print_insn = print_insn_little_mips;
+#elif defined(__m68k__)
+ print_insn = print_insn_m68k;
#else
fprintf(out, "0x%lx: Asm output not supported on this arch\n",
(long) code);
#else
fprintf(out, "0x%lx: Asm output not supported on this arch\n",
(long) code);
@@
-279,6
+288,7
@@
const char *lookup_symbol(target_ulong orig_addr)
/* Hack, because we know this is x86. */
Elf32_Sym *sym;
struct syminfo *s;
/* Hack, because we know this is x86. */
Elf32_Sym *sym;
struct syminfo *s;
+ target_ulong addr;
for (s = syminfos; s; s = s->next) {
sym = s->disas_symtab;
for (s = syminfos; s; s = s->next) {
sym = s->disas_symtab;
@@
-290,8
+300,13
@@
const char *lookup_symbol(target_ulong orig_addr)
if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)
continue;
if (ELF_ST_TYPE(sym[i].st_info) != STT_FUNC)
continue;
- if (orig_addr >= sym[i].st_value
- && orig_addr < sym[i].st_value + sym[i].st_size)
+ addr = sym[i].st_value;
+#ifdef TARGET_ARM
+ /* The bottom address bit marks a Thumb symbol. */
+ addr &= ~(target_ulong)1;
+#endif
+ if (orig_addr >= addr
+ && orig_addr < addr + sym[i].st_size)
return s->disas_strtab + sym[i].st_name;
}
}
return s->disas_strtab + sym[i].st_name;
}
}
@@
-304,6
+319,7
@@
void term_vprintf(const char *fmt, va_list ap);
void term_printf(const char *fmt, ...);
static int monitor_disas_is_physical;
void term_printf(const char *fmt, ...);
static int monitor_disas_is_physical;
+static CPUState *monitor_disas_env;
static int
monitor_read_memory (memaddr, myaddr, length, info)
static int
monitor_read_memory (memaddr, myaddr, length, info)
@@
-315,7
+331,7
@@
monitor_read_memory (memaddr, myaddr, length, info)
if (monitor_disas_is_physical) {
cpu_physical_memory_rw(memaddr, myaddr, length, 0);
} else {
if (monitor_disas_is_physical) {
cpu_physical_memory_rw(memaddr, myaddr, length, 0);
} else {
- cpu_memory_rw_debug(cpu_single_env, memaddr,myaddr, length, 0);
+ cpu_memory_rw_debug(monitor_disas_env, memaddr,myaddr, length, 0);
}
return 0;
}
}
return 0;
}
@@
-329,7
+345,8
@@
static int monitor_fprintf(FILE *stream, const char *fmt, ...)
return 0;
}
return 0;
}
-void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
+void monitor_disas(CPUState *env,
+ target_ulong pc, int nb_insn, int is_physical, int flags)
{
int count, i;
struct disassemble_info disasm_info;
{
int count, i;
struct disassemble_info disasm_info;
@@
-337,6
+354,7
@@
void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
INIT_DISASSEMBLE_INFO(disasm_info, NULL, monitor_fprintf);
INIT_DISASSEMBLE_INFO(disasm_info, NULL, monitor_fprintf);
+ monitor_disas_env = env;
monitor_disas_is_physical = is_physical;
disasm_info.read_memory_func = monitor_read_memory;
monitor_disas_is_physical = is_physical;
disasm_info.read_memory_func = monitor_read_memory;
@@
-367,8
+385,14
@@
void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
#endif
print_insn = print_insn_ppc;
#elif defined(TARGET_MIPS)
#endif
print_insn = print_insn_ppc;
#elif defined(TARGET_MIPS)
+#ifdef TARGET_WORDS_BIGENDIAN
print_insn = print_insn_big_mips;
#else
print_insn = print_insn_big_mips;
#else
+ print_insn = print_insn_little_mips;
+#endif
+#elif defined(TARGET_M68K)
+ print_insn = print_insn_m68k;
+#else
term_printf("0x" TARGET_FMT_lx
": Asm output not supported on this arch\n", pc);
return;
term_printf("0x" TARGET_FMT_lx
": Asm output not supported on this arch\n", pc);
return;