diff --git a/accel/tcg/tcg-runtime.c b/accel/tcg/tcg-runtime.c index 11c934cf3f..bc21bc34e0 100644 --- a/accel/tcg/tcg-runtime.c +++ b/accel/tcg/tcg-runtime.c @@ -87,12 +87,18 @@ void libafl_load_qemu_snapshot(char *name) #define EXCP_LIBAFL_BP 0xf4775747 +int libafl_qemu_break_asap = 0; + void libafl_qemu_trigger_breakpoint(CPUState* cpu); void libafl_qemu_trigger_breakpoint(CPUState* cpu) { - cpu->exception_index = EXCP_LIBAFL_BP; - cpu_loop_exit(cpu); + if (cpu->running) { + cpu->exception_index = EXCP_LIBAFL_BP; + cpu_loop_exit(cpu); + } else { + libafl_qemu_break_asap = 1; + } } void HELPER(libafl_qemu_handle_breakpoint)(CPUArchState *env) diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c index 6b45ed0041..24a0d4c5ff 100644 --- a/linux-user/aarch64/cpu_loop.c +++ b/linux-user/aarch64/cpu_loop.c @@ -82,6 +82,13 @@ void cpu_loop(CPUARMState *env) abi_long ret; for (;;) { + +//// --- Begin LibAFL code --- + + if (libafl_qemu_break_asap) return; + +//// --- End LibAFL code --- + cpu_exec_start(cs); trapnr = cpu_exec(cs); cpu_exec_end(cs); diff --git a/linux-user/arm/cpu_loop.c b/linux-user/arm/cpu_loop.c index 628afdb158..26fd82f19b 100644 --- a/linux-user/arm/cpu_loop.c +++ b/linux-user/arm/cpu_loop.c @@ -319,6 +319,13 @@ void cpu_loop(CPUARMState *env) abi_ulong ret; for(;;) { + +//// --- Begin LibAFL code --- + + if (libafl_qemu_break_asap) return; + +//// --- End LibAFL code --- + cpu_exec_start(cs); trapnr = cpu_exec(cs); cpu_exec_end(cs); diff --git a/linux-user/cpu_loop-common.h b/linux-user/cpu_loop-common.h index 36ff5b14f2..b7e09d9e77 100644 --- a/linux-user/cpu_loop-common.h +++ b/linux-user/cpu_loop-common.h @@ -23,6 +23,12 @@ #include "exec/log.h" #include "special-errno.h" +//// --- Begin LibAFL code --- + +extern int libafl_qemu_break_asap; + +//// --- End LibAFL code --- + #define EXCP_DUMP(env, fmt, ...) \ do { \ CPUState *cs = env_cpu(env); \ diff --git a/linux-user/i386/cpu_loop.c b/linux-user/i386/cpu_loop.c index a3ed4b4f6f..71afa3b76a 100644 --- a/linux-user/i386/cpu_loop.c +++ b/linux-user/i386/cpu_loop.c @@ -205,6 +205,13 @@ void cpu_loop(CPUX86State *env) abi_ulong ret; for(;;) { + +//// --- Begin LibAFL code --- + + if (libafl_qemu_break_asap) return; + +//// --- End LibAFL code --- + cpu_exec_start(cs); trapnr = cpu_exec(cs); cpu_exec_end(cs);