diff --git a/target/i386/translate.c b/target/i386/translate.c index 0dd5fbe4..0d405fb6 100644 --- a/target/i386/translate.c +++ b/target/i386/translate.c @@ -32,6 +32,8 @@ #include "trace-tcg.h" #include "exec/log.h" +#include "../patches/afl-qemu-cpu-translate-inl.h" + #define PREFIX_REPZ 0x01 #define PREFIX_REPNZ 0x02 #define PREFIX_LOCK 0x04 @@ -1343,9 +1345,11 @@ static void gen_op(DisasContext *s1, int op, TCGMemOp ot, int d) tcg_gen_atomic_fetch_add_tl(s1->cc_srcT, s1->A0, s1->T0, s1->mem_index, ot | MO_LE); tcg_gen_sub_tl(s1->T0, s1->cc_srcT, s1->T1); + afl_gen_compcov(s1->pc, s1->cc_srcT, s1->T1, ot, d == OR_EAX); } else { tcg_gen_mov_tl(s1->cc_srcT, s1->T0); tcg_gen_sub_tl(s1->T0, s1->T0, s1->T1); + afl_gen_compcov(s1->pc, s1->T0, s1->T1, ot, d == OR_EAX); gen_op_st_rm_T0_A0(s1, ot, d); } gen_op_update2_cc(s1); @@ -1389,6 +1393,7 @@ static void gen_op(DisasContext *s1, int op, TCGMemOp ot, int d) tcg_gen_mov_tl(cpu_cc_src, s1->T1); tcg_gen_mov_tl(s1->cc_srcT, s1->T0); tcg_gen_sub_tl(cpu_cc_dst, s1->T0, s1->T1); + afl_gen_compcov(s1->pc, s1->T0, s1->T1, ot, d == OR_EAX); set_cc_op(s1, CC_OP_SUBB + ot); break; } @@ -4508,6 +4513,8 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu) rex_w = -1; rex_r = 0; + AFL_QEMU_TARGET_I386_SNIPPET + next_byte: b = x86_ldub_code(env, s); /* Collect prefixes. */ @@ -5056,6 +5063,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu) tcg_gen_ext16u_tl(s->T0, s->T0); } next_eip = s->pc - s->cs_base; + if (__afl_cmp_map && next_eip >= afl_start_code && + next_eip < afl_end_code) + gen_helper_afl_cmplog_rtn(cpu_env); tcg_gen_movi_tl(s->T1, next_eip); gen_push_v(s, s->T1); gen_op_jmp_v(s->T0); @@ -6544,6 +6554,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu) tval = (int16_t)insn_get(env, s, MO_16); } next_eip = s->pc - s->cs_base; + if (__afl_cmp_map && next_eip >= afl_start_code && + next_eip < afl_end_code) + gen_helper_afl_cmplog_rtn(cpu_env); tval += next_eip; if (dflag == MO_16) { tval &= 0xffff;