first part of single stepping support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@342 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
61a2ad53cb
commit
c33a346edf
|
@ -315,6 +315,7 @@ void cpu_interrupt(CPUState *s, int mask);
|
||||||
|
|
||||||
int cpu_breakpoint_insert(CPUState *env, uint32_t pc);
|
int cpu_breakpoint_insert(CPUState *env, uint32_t pc);
|
||||||
int cpu_breakpoint_remove(CPUState *env, uint32_t pc);
|
int cpu_breakpoint_remove(CPUState *env, uint32_t pc);
|
||||||
|
void cpu_single_step(CPUState *env, int enabled);
|
||||||
|
|
||||||
/* gdb stub API */
|
/* gdb stub API */
|
||||||
extern int gdbstub_fd;
|
extern int gdbstub_fd;
|
||||||
|
|
17
exec.c
17
exec.c
|
@ -617,7 +617,8 @@ static void tb_reset_jump_recursive(TranslationBlock *tb)
|
||||||
tb_reset_jump_recursive2(tb, 1);
|
tb_reset_jump_recursive2(tb, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* add a breakpoint */
|
/* add a breakpoint. EXCP_DEBUG is returned by the CPU loop if a
|
||||||
|
breakpoint is reached */
|
||||||
int cpu_breakpoint_insert(CPUState *env, uint32_t pc)
|
int cpu_breakpoint_insert(CPUState *env, uint32_t pc)
|
||||||
{
|
{
|
||||||
#if defined(TARGET_I386)
|
#if defined(TARGET_I386)
|
||||||
|
@ -659,6 +660,20 @@ int cpu_breakpoint_remove(CPUState *env, uint32_t pc)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* enable or disable single step mode. EXCP_DEBUG is returned by the
|
||||||
|
CPU loop after each instruction */
|
||||||
|
void cpu_single_step(CPUState *env, int enabled)
|
||||||
|
{
|
||||||
|
#if defined(TARGET_I386)
|
||||||
|
if (env->singlestep_enabled != enabled) {
|
||||||
|
env->singlestep_enabled = enabled;
|
||||||
|
/* must flush all the translated code to avoid inconsistancies */
|
||||||
|
tb_flush();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* mask must never be zero */
|
/* mask must never be zero */
|
||||||
void cpu_interrupt(CPUState *env, int mask)
|
void cpu_interrupt(CPUState *env, int mask)
|
||||||
{
|
{
|
||||||
|
|
18
gdbstub.c
18
gdbstub.c
|
@ -324,6 +324,24 @@ int cpu_gdbstub(void *opaque, int (*main_loop)(void *opaque), int port)
|
||||||
snprintf(buf, sizeof(buf), "S%02x", ret);
|
snprintf(buf, sizeof(buf), "S%02x", ret);
|
||||||
put_packet(buf);
|
put_packet(buf);
|
||||||
break;
|
break;
|
||||||
|
case 's':
|
||||||
|
env = cpu_gdbstub_get_env(opaque);
|
||||||
|
if (*p != '\0') {
|
||||||
|
addr = strtoul(p, (char **)&p, 16);
|
||||||
|
#if defined(TARGET_I386)
|
||||||
|
env->eip = addr;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
cpu_single_step(env, 1);
|
||||||
|
ret = main_loop(opaque);
|
||||||
|
cpu_single_step(env, 0);
|
||||||
|
if (ret == EXCP_DEBUG)
|
||||||
|
ret = SIGTRAP;
|
||||||
|
else
|
||||||
|
ret = 0;
|
||||||
|
snprintf(buf, sizeof(buf), "S%02x", ret);
|
||||||
|
put_packet(buf);
|
||||||
|
break;
|
||||||
case 'g':
|
case 'g':
|
||||||
env = cpu_gdbstub_get_env(opaque);
|
env = cpu_gdbstub_get_env(opaque);
|
||||||
registers = (void *)mem_buf;
|
registers = (void *)mem_buf;
|
||||||
|
|
Loading…
Reference in a new issue