|
49 | 49 | #include <stdlib.h> |
50 | 50 | #include <string.h> |
51 | 51 |
|
| 52 | +#include "libafl_extras/exit.h" |
| 53 | + |
52 | 54 | void libafl_save_qemu_snapshot(char *name, bool sync); |
53 | 55 | void libafl_load_qemu_snapshot(char *name, bool sync); |
54 | 56 |
|
@@ -130,57 +132,24 @@ void libafl_load_qemu_snapshot(char *name, bool sync) |
130 | 132 |
|
131 | 133 | #endif |
132 | 134 |
|
133 | | -#define EXCP_LIBAFL_BP 0xf4775747 |
| 135 | +#define EXCP_LIBAFL_EXIT 0xf4775747 |
134 | 136 |
|
135 | 137 | #ifdef CONFIG_USER_ONLY |
136 | | -__thread int libafl_qemu_break_asap = 0; |
137 | | -__thread CPUState* libafl_breakpoint_cpu; |
138 | | -__thread vaddr libafl_breakpoint_pc; |
139 | | -#else |
140 | | -int libafl_qemu_break_asap = 0; |
141 | | -CPUState* libafl_breakpoint_cpu; |
142 | | -vaddr libafl_breakpoint_pc; |
143 | | -#endif |
144 | | - |
145 | | -#ifdef TARGET_ARM |
146 | | -#define THUMB_MASK(value) (value | cpu_env(libafl_breakpoint_cpu)->thumb) |
| 138 | +extern __thread int libafl_qemu_break_asap; |
147 | 139 | #else |
148 | | -#define THUMB_MASK(value) value |
| 140 | +extern int libafl_qemu_break_asap; |
149 | 141 | #endif |
150 | 142 |
|
151 | | -void libafl_qemu_trigger_breakpoint(CPUState* cpu); |
152 | | - |
153 | | -void libafl_sync_breakpoint_cpu(void); |
154 | | - |
155 | | -void libafl_sync_breakpoint_cpu(void) |
156 | | -{ |
157 | | - if (libafl_breakpoint_pc) { |
158 | | - CPUClass* cc = CPU_GET_CLASS(libafl_breakpoint_cpu); |
159 | | - cc->set_pc(libafl_breakpoint_cpu, THUMB_MASK(libafl_breakpoint_pc)); |
160 | | - } |
161 | | - libafl_breakpoint_pc = 0; |
162 | | -} |
163 | | - |
164 | | -void libafl_qemu_trigger_breakpoint(CPUState* cpu) |
| 143 | +void HELPER(libafl_qemu_handle_breakpoint)(CPUArchState *env, uint64_t pc) |
165 | 144 | { |
166 | | - libafl_breakpoint_cpu = cpu; |
167 | | -#ifndef CONFIG_USER_ONLY |
168 | | - qemu_system_debug_request(); |
169 | | - cpu->stopped = true; |
170 | | -#endif |
171 | | - if (cpu->running) { |
172 | | - cpu->exception_index = EXCP_LIBAFL_BP; |
173 | | - cpu_loop_exit(cpu); |
174 | | - } else { |
175 | | - libafl_qemu_break_asap = 1;//TODO add a field to CPU |
176 | | - } |
| 145 | + CPUState* cpu = env_cpu(env); |
| 146 | + libafl_exit_request_breakpoint(cpu, (target_ulong) pc); |
177 | 147 | } |
178 | 148 |
|
179 | | -void HELPER(libafl_qemu_handle_breakpoint)(CPUArchState *env, uint64_t pc) |
| 149 | +void HELPER(libafl_qemu_handle_sync_backdoor)(CPUArchState *env, uint64_t pc) |
180 | 150 | { |
181 | 151 | CPUState* cpu = env_cpu(env); |
182 | | - libafl_breakpoint_pc = (target_ulong)pc; |
183 | | - libafl_qemu_trigger_breakpoint(cpu); |
| 152 | + libafl_exit_request_sync_backdoor(cpu, (target_ulong) pc); |
184 | 153 | } |
185 | 154 |
|
186 | 155 | //// --- End LibAFL code --- |
|
0 commit comments