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:
parent
40c3bac35a
commit
9307c4c1d9
70
disas.c
70
disas.c
@ -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
|
||||||
|
1
disas.h
1
disas.h
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user