Commit 83f338f7 authored by Jan Kiszka's avatar Jan Kiszka Committed by Marcelo Tosatti
Browse files

Move debug exception handling out of cpu_exec



To prepare splitting up KVM and TCG CPU entry/exit, move the debug
exception into cpus.c and invoke cpu_handle_debug_exception on return
from qemu_cpu_exec.

This also allows to clean up the debug request signaling: We can assign
the job of informing main-loop to qemu_system_debug_request and stop the
calling cpu directly in cpu_handle_debug_exception. That means a debug
stop will now only be signaled via debug_requested and not additionally
via vmstop_requested.

Signed-off-by: default avatarJan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: default avatarMarcelo Tosatti <mtosatti@redhat.com>
parent 8cf71710
Loading
Loading
Loading
Loading
+0 −24
Original line number Diff line number Diff line
@@ -196,28 +196,6 @@ static inline TranslationBlock *tb_find_fast(void)
    return tb;
}

static CPUDebugExcpHandler *debug_excp_handler;

CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler)
{
    CPUDebugExcpHandler *old_handler = debug_excp_handler;

    debug_excp_handler = handler;
    return old_handler;
}

static void cpu_handle_debug_exception(CPUState *env)
{
    CPUWatchpoint *wp;

    if (!env->watchpoint_hit)
        QTAILQ_FOREACH(wp, &env->watchpoints, entry)
            wp->flags &= ~BP_WATCHPOINT_HIT;

    if (debug_excp_handler)
        debug_excp_handler(env);
}

/* main execution loop */

volatile sig_atomic_t exit_request;
@@ -287,8 +265,6 @@ int cpu_exec(CPUState *env1)
                if (env->exception_index >= EXCP_INTERRUPT) {
                    /* exit request from the cpu execution loop */
                    ret = env->exception_index;
                    if (ret == EXCP_DEBUG)
                        cpu_handle_debug_exception(env);
                    break;
                } else {
#if defined(CONFIG_USER_ONLY)
+30 −5
Original line number Diff line number Diff line
@@ -165,10 +165,34 @@ static bool all_cpu_threads_idle(void)
    return true;
}

static void cpu_debug_handler(CPUState *env)
static CPUDebugExcpHandler *debug_excp_handler;

CPUDebugExcpHandler *cpu_set_debug_excp_handler(CPUDebugExcpHandler *handler)
{
    CPUDebugExcpHandler *old_handler = debug_excp_handler;

    debug_excp_handler = handler;
    return old_handler;
}

static void cpu_handle_debug_exception(CPUState *env)
{
    CPUWatchpoint *wp;

    if (!env->watchpoint_hit) {
        QTAILQ_FOREACH(wp, &env->watchpoints, entry) {
            wp->flags &= ~BP_WATCHPOINT_HIT;
        }
    }
    if (debug_excp_handler) {
        debug_excp_handler(env);
    }

    gdb_set_stop_cpu(env);
    qemu_system_debug_request();
#ifdef CONFIG_IOTHREAD
    env->stopped = 1;
#endif
}

#ifdef CONFIG_LINUX
@@ -479,7 +503,6 @@ int qemu_init_main_loop(void)
        return ret;
    }
#endif
    cpu_set_debug_excp_handler(cpu_debug_handler);

    qemu_init_sigbus();

@@ -653,8 +676,6 @@ int qemu_init_main_loop(void)
    int ret;
    sigset_t blocked_signals;

    cpu_set_debug_excp_handler(cpu_debug_handler);

    qemu_init_sigbus();

    blocked_signals = block_io_signals();
@@ -808,7 +829,10 @@ static void *qemu_kvm_cpu_thread_fn(void *arg)

    while (1) {
        if (cpu_can_run(env)) {
            qemu_cpu_exec(env);
            r = qemu_cpu_exec(env);
            if (r == EXCP_DEBUG) {
                cpu_handle_debug_exception(env);
            }
        }
        qemu_kvm_wait_io_event(env);
    }
@@ -1076,6 +1100,7 @@ bool cpu_exec_all(void)
                qemu_kvm_eat_signals(env);
            }
            if (r == EXCP_DEBUG) {
                cpu_handle_debug_exception(env);
                break;
            }
        } else if (env->stop) {
+1 −1
Original line number Diff line number Diff line
@@ -1315,7 +1315,7 @@ void qemu_system_powerdown_request(void)
void qemu_system_debug_request(void)
{
    debug_requested = 1;
    vm_stop(VMSTOP_DEBUG);
    qemu_notify_event();
}

void qemu_system_vmstop_request(int reason)