improved monitor: type check, expression evaluator, memory dump, disassembly

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@703 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2004-04-04 12:57:25 +00:00
parent 40c3bac35a
commit 9307c4c1d9
3 changed files with 845 additions and 123 deletions

70
disas.c
View File

@ -1,12 +1,12 @@
/* General "disassemble this chunk" code. Used for debugging. */ /* General "disassemble this chunk" code. Used for debugging. */
#include "config.h" #include "config.h"
#include "dis-asm.h" #include "dis-asm.h"
#include "disas.h"
#include "elf.h" #include "elf.h"
#include <errno.h> #include <errno.h>
#include "cpu.h" #include "cpu.h"
#include "exec-all.h" #include "exec-all.h"
#include "disas.h"
/* Filled in by elfload.c. Simplistic, but will do for now. */ /* Filled in by elfload.c. Simplistic, but will do for now. */
unsigned int disas_num_syms; unsigned int disas_num_syms;
@ -219,3 +219,71 @@ const char *lookup_symbol(void *orig_addr)
} }
return ""; return "";
} }
#if !defined(CONFIG_USER_ONLY)
static int monitor_disas_is_physical;
static int
monitor_read_memory (memaddr, myaddr, length, info)
bfd_vma memaddr;
bfd_byte *myaddr;
int length;
struct disassemble_info *info;
{
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);
}
return 0;
}
void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags)
{
FILE *out;
int count, i;
struct disassemble_info disasm_info;
int (*print_insn)(bfd_vma pc, disassemble_info *info);
out = stdout;
INIT_DISASSEMBLE_INFO(disasm_info, out, fprintf);
monitor_disas_is_physical = is_physical;
disasm_info.read_memory_func = monitor_read_memory;
disasm_info.buffer_vma = pc;
#ifdef TARGET_WORDS_BIGENDIAN
disasm_info.endian = BFD_ENDIAN_BIG;
#else
disasm_info.endian = BFD_ENDIAN_LITTLE;
#endif
#if defined(TARGET_I386)
if (!flags)
disasm_info.mach = bfd_mach_i386_i386;
else
disasm_info.mach = bfd_mach_i386_i8086;
print_insn = print_insn_i386;
#elif defined(TARGET_ARM)
print_insn = print_insn_arm;
#elif defined(TARGET_SPARC)
print_insn = print_insn_sparc;
#elif defined(TARGET_PPC)
print_insn = print_insn_ppc;
#else
fprintf(out, "Asm output not supported on this arch\n");
return;
#endif
for(i = 0; i < nb_insn; i++) {
fprintf(out, "0x%08lx: ", (unsigned long)pc);
count = print_insn(pc, &disasm_info);
fprintf(out, "\n");
if (count < 0)
break;
pc += count;
}
}
#endif

View File

@ -3,6 +3,7 @@
/* Disassemble this for me please... (debugging). */ /* Disassemble this for me please... (debugging). */
void disas(FILE *out, void *code, unsigned long size, int is_host, int flags); void disas(FILE *out, void *code, unsigned long size, int is_host, int flags);
void monitor_disas(target_ulong pc, int nb_insn, int is_physical, int flags);
/* Look up symbol for debugging purpose. Returns "" if unknown. */ /* Look up symbol for debugging purpose. Returns "" if unknown. */
const char *lookup_symbol(void *orig_addr); const char *lookup_symbol(void *orig_addr);

921
monitor.c

File diff suppressed because it is too large Load Diff