about summary refs log tree commit diff
path: root/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
diff options
context:
space:
mode:
authorAndrea Fioraldi <andreafioraldi@gmail.com>2019-09-13 11:37:26 +0200
committerGitHub <noreply@github.com>2019-09-13 11:37:26 +0200
commit8ee11fecc475dd6bcaab7f1e5a38c1cfac4c7e56 (patch)
treef728ee952e94bb299bd5fc603009fbcd51dd85cb /qemu_mode/patches/afl-qemu-cpu-translate-inl.h
parenta67d86c6e2ca58db81f2ddf6d0a4c837be88271d (diff)
parent36020c41df88ae863fbc2a148765f9c61c7f8bf8 (diff)
downloadafl++-8ee11fecc475dd6bcaab7f1e5a38c1cfac4c7e56.tar.gz
Merge pull request #57 from vanhauser-thc/persistent_qemu
Persistent mode in QEMU
Diffstat (limited to 'qemu_mode/patches/afl-qemu-cpu-translate-inl.h')
-rw-r--r--qemu_mode/patches/afl-qemu-cpu-translate-inl.h36
1 files changed, 27 insertions, 9 deletions
diff --git a/qemu_mode/patches/afl-qemu-cpu-translate-inl.h b/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
index 3d3c1b6b..cd5c21aa 100644
--- a/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
+++ b/qemu_mode/patches/afl-qemu-cpu-translate-inl.h
@@ -35,15 +35,6 @@
 #include "tcg.h"
 #include "tcg-op.h"
 
-/* Declared in afl-qemu-cpu-inl.h */
-extern unsigned char *afl_area_ptr;
-extern unsigned int   afl_inst_rms;
-extern abi_ulong      afl_start_code, afl_end_code;
-extern u8             afl_compcov_level;
-
-void tcg_gen_afl_compcov_log_call(void *func, target_ulong cur_loc,
-                                  TCGv_i64 arg1, TCGv_i64 arg2);
-
 static void afl_compcov_log_16(target_ulong cur_loc, target_ulong arg1,
                                target_ulong arg2) {
 
@@ -137,3 +128,30 @@ static void afl_gen_compcov(target_ulong cur_loc, TCGv_i64 arg1, TCGv_i64 arg2,
 
 }
 
+#define AFL_QEMU_TARGET_i386_SNIPPET                                          \
+  if (is_persistent) {                                                        \
+                                                                              \
+    if (s->pc == afl_persistent_addr) {                                       \
+                                                                              \
+      if (afl_persistent_ret_addr == 0) {                                     \
+                                                                              \
+        TCGv_ptr stack_off_ptr = tcg_const_ptr(&persistent_stack_offset);     \
+        TCGv     stack_off = tcg_temp_new();                                  \
+        tcg_gen_ld_tl(stack_off, stack_off_ptr, 0);                           \
+        tcg_gen_sub_tl(cpu_regs[R_ESP], cpu_regs[R_ESP], stack_off);          \
+        tcg_temp_free(stack_off);                                             \
+                                                                              \
+      }                                                                       \
+      TCGv_ptr paddr = tcg_const_ptr(afl_persistent_addr);                    \
+      tcg_gen_st_tl(paddr, cpu_regs[R_ESP], 0);                               \
+      tcg_gen_afl_call0(&afl_persistent_loop);                                \
+                                                                              \
+    } else if (afl_persistent_ret_addr && s->pc == afl_persistent_ret_addr) { \
+                                                                              \
+      gen_jmp_im(s, afl_persistent_addr);                                     \
+      gen_eob(s);                                                             \
+                                                                              \
+    }                                                                         \
+                                                                              \
+  }
+