Skip to content

Commit 1d4a3c8

Browse files
cmplog routines instrumentation for qemu mode on x86
1 parent 6e8f249 commit 1d4a3c8

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

qemu_mode/patches/afl-qemu-tcg-runtime-inl.h

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,3 +158,62 @@ void HELPER(afl_cmplog_64)(target_ulong cur_loc, target_ulong arg1,
158158

159159
}
160160

161+
#include <sys/mman.h>
162+
163+
static int area_is_mapped(void* ptr, size_t len) {
164+
165+
char* p = ptr;
166+
char* page = (char*)((uintptr_t)p & ~(sysconf(_SC_PAGE_SIZE) - 1));
167+
168+
int r = msync(page, (p - page) + len, MS_ASYNC);
169+
if (r < 0) return errno != ENOMEM;
170+
return 1;
171+
172+
}
173+
174+
void HELPER(afl_cmplog_rtn)(CPUX86State *env) {
175+
176+
#if defined(TARGET_X86_64)
177+
178+
void* ptr1 = g2h(env->regs[R_EDI]);
179+
void* ptr2 = g2h(env->regs[R_ESI]);
180+
181+
#elif defined(TARGET_I386)
182+
183+
target_ulong* stack = g2h(env->regs[R_ESP]);
184+
185+
if (!area_is_mapped(stack, sizeof(target_ulong)*2)) return;
186+
187+
// when this hook is executed, the retaddr is not on stack yet
188+
void* ptr1 = g2h(stack[0]);
189+
void* ptr2 = g2h(stack[1]);
190+
191+
#else
192+
193+
// dumb code to make it compile
194+
void* ptr1 = NULL;
195+
void* ptr2 = NULL;
196+
return;
197+
198+
#endif
199+
200+
if (!area_is_mapped(ptr1, 32) || !area_is_mapped(ptr2, 32)) return;
201+
202+
uintptr_t k = (uintptr_t)env->eip;
203+
k = (k >> 4) ^ (k << 8);
204+
k &= CMP_MAP_W - 1;
205+
206+
__afl_cmp_map->headers[k].type = CMP_TYPE_RTN;
207+
208+
u32 hits = __afl_cmp_map->headers[k].hits;
209+
__afl_cmp_map->headers[k].hits = hits + 1;
210+
211+
__afl_cmp_map->headers[k].shape = 31;
212+
213+
hits &= CMP_MAP_RTN_H - 1;
214+
__builtin_memcpy(((struct cmpfn_operands*)__afl_cmp_map->log[k])[hits].v0,
215+
ptr1, 32);
216+
__builtin_memcpy(((struct cmpfn_operands*)__afl_cmp_map->log[k])[hits].v1,
217+
ptr2, 32);
218+
219+
}

qemu_mode/patches/i386-translate.diff

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
diff --git a/target/i386/translate.c b/target/i386/translate.c
2-
index 0dd5fbe4..a23da128 100644
2+
index 0dd5fbe4..0d405fb6 100644
33
--- a/target/i386/translate.c
44
+++ b/target/i386/translate.c
55
@@ -32,6 +32,8 @@
@@ -40,3 +40,23 @@ index 0dd5fbe4..a23da128 100644
4040
next_byte:
4141
b = x86_ldub_code(env, s);
4242
/* Collect prefixes. */
43+
@@ -5056,6 +5063,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
44+
tcg_gen_ext16u_tl(s->T0, s->T0);
45+
}
46+
next_eip = s->pc - s->cs_base;
47+
+ if (__afl_cmp_map && next_eip >= afl_start_code &&
48+
+ next_eip < afl_end_code)
49+
+ gen_helper_afl_cmplog_rtn(cpu_env);
50+
tcg_gen_movi_tl(s->T1, next_eip);
51+
gen_push_v(s, s->T1);
52+
gen_op_jmp_v(s->T0);
53+
@@ -6544,6 +6554,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
54+
tval = (int16_t)insn_get(env, s, MO_16);
55+
}
56+
next_eip = s->pc - s->cs_base;
57+
+ if (__afl_cmp_map && next_eip >= afl_start_code &&
58+
+ next_eip < afl_end_code)
59+
+ gen_helper_afl_cmplog_rtn(cpu_env);
60+
tval += next_eip;
61+
if (dflag == MO_16) {
62+
tval &= 0xffff;

qemu_mode/patches/tcg-runtime-head.diff

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
diff --git a/accel/tcg/tcg-runtime.h b/accel/tcg/tcg-runtime.h
2-
index 1bd39d13..c58dee31 100644
2+
index 1bd39d13..81ef3973 100644
33
--- a/accel/tcg/tcg-runtime.h
44
+++ b/accel/tcg/tcg-runtime.h
5-
@@ -260,3 +260,12 @@ DEF_HELPER_FLAGS_4(gvec_leu8, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
5+
@@ -260,3 +260,13 @@ DEF_HELPER_FLAGS_4(gvec_leu8, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
66
DEF_HELPER_FLAGS_4(gvec_leu16, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
77
DEF_HELPER_FLAGS_4(gvec_leu32, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
88
DEF_HELPER_FLAGS_4(gvec_leu64, TCG_CALL_NO_RWG, void, ptr, ptr, ptr, i32)
@@ -15,3 +15,4 @@ index 1bd39d13..c58dee31 100644
1515
+DEF_HELPER_FLAGS_3(afl_cmplog_16, TCG_CALL_NO_RWG, void, tl, tl, tl)
1616
+DEF_HELPER_FLAGS_3(afl_cmplog_32, TCG_CALL_NO_RWG, void, tl, tl, tl)
1717
+DEF_HELPER_FLAGS_3(afl_cmplog_64, TCG_CALL_NO_RWG, void, tl, tl, tl)
18+
+DEF_HELPER_FLAGS_1(afl_cmplog_rtn, TCG_CALL_NO_RWG, void, env)

0 commit comments

Comments
 (0)