| diff --git a/target/arm/translate.c b/target/arm/translate.c |
| index 7c4675f..e3d999a 100644 |
| --- a/target/arm/translate.c |
| +++ b/target/arm/translate.c |
| @@ -59,6 +59,8 @@ |
| #define IS_USER(s) (s->user) |
| #endif |
| |
| +#include "../patches/afl-qemu-cpu-translate-inl.h" |
| + |
| /* We reuse the same 64-bit temporaries for efficiency. */ |
| static TCGv_i64 cpu_V0, cpu_V1, cpu_M0; |
| static TCGv_i32 cpu_R[16]; |
| @@ -9541,6 +9543,7 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn) |
| } else { |
| if (set_cc) { |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, insn & (1 << 25)); |
| } else { |
| tcg_gen_sub_i32(tmp, tmp, tmp2); |
| } |
| @@ -9550,6 +9553,7 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn) |
| case 0x03: |
| if (set_cc) { |
| gen_sub_CC(tmp, tmp2, tmp); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, insn & (1 << 25)); |
| } else { |
| tcg_gen_sub_i32(tmp, tmp2, tmp); |
| } |
| @@ -9604,6 +9608,7 @@ static void disas_arm_insn(DisasContext *s, unsigned int insn) |
| case 0x0a: |
| if (set_cc) { |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, insn & (1 << 25)); |
| } |
| tcg_temp_free_i32(tmp); |
| break; |
| @@ -10565,7 +10570,7 @@ thumb2_logic_op(int op) |
| |
| static int |
| gen_thumb2_data_op(DisasContext *s, int op, int conds, uint32_t shifter_out, |
| - TCGv_i32 t0, TCGv_i32 t1) |
| + TCGv_i32 t0, TCGv_i32 t1, int has_imm) |
| { |
| int logic_cc; |
| |
| @@ -10611,15 +10616,17 @@ gen_thumb2_data_op(DisasContext *s, int op, int conds, uint32_t shifter_out, |
| } |
| break; |
| case 13: /* sub */ |
| - if (conds) |
| + if (conds) { |
| gen_sub_CC(t0, t0, t1); |
| - else |
| + afl_gen_compcov(s->pc, t0, t1, MO_32, has_imm); |
| + } else |
| tcg_gen_sub_i32(t0, t0, t1); |
| break; |
| case 14: /* rsb */ |
| - if (conds) |
| + if (conds) { |
| gen_sub_CC(t0, t1, t0); |
| - else |
| + afl_gen_compcov(s->pc, t0, t1, MO_32, has_imm); |
| + } else |
| tcg_gen_sub_i32(t0, t1, t0); |
| break; |
| default: /* 5, 6, 7, 9, 12, 15. */ |
| @@ -11085,7 +11092,7 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn) |
| conds = (insn & (1 << 20)) != 0; |
| logic_cc = (conds && thumb2_logic_op(op)); |
| gen_arm_shift_im(tmp2, shiftop, shift, logic_cc); |
| - if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) |
| + if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2, insn & (1 << 10))) |
| goto illegal_op; |
| tcg_temp_free_i32(tmp2); |
| if (rd == 13 && |
| @@ -11955,7 +11962,7 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn) |
| } |
| op = (insn >> 21) & 0xf; |
| if (gen_thumb2_data_op(s, op, (insn & (1 << 20)) != 0, |
| - shifter_out, tmp, tmp2)) |
| + shifter_out, tmp, tmp2, insn & (1 << 10))) |
| goto illegal_op; |
| tcg_temp_free_i32(tmp2); |
| rd = (insn >> 8) & 0xf; |
| @@ -12206,8 +12213,10 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn) |
| if (insn & (1 << 9)) { |
| if (s->condexec_mask) |
| tcg_gen_sub_i32(tmp, tmp, tmp2); |
| - else |
| + else { |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, insn & (1 << 10)); |
| + } |
| } else { |
| if (s->condexec_mask) |
| tcg_gen_add_i32(tmp, tmp, tmp2); |
| @@ -12247,6 +12256,7 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn) |
| switch (op) { |
| case 1: /* cmp */ |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, 1); |
| tcg_temp_free_i32(tmp); |
| tcg_temp_free_i32(tmp2); |
| break; |
| @@ -12261,8 +12271,10 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn) |
| case 3: /* sub */ |
| if (s->condexec_mask) |
| tcg_gen_sub_i32(tmp, tmp, tmp2); |
| - else |
| + else { |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, 1); |
| + } |
| tcg_temp_free_i32(tmp2); |
| store_reg(s, rd, tmp); |
| break; |
| @@ -12308,6 +12320,7 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn) |
| tmp = load_reg(s, rd); |
| tmp2 = load_reg(s, rm); |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, 0); |
| tcg_temp_free_i32(tmp2); |
| tcg_temp_free_i32(tmp); |
| break; |
| @@ -12466,6 +12479,7 @@ static void disas_thumb_insn(DisasContext *s, uint32_t insn) |
| break; |
| case 0xa: /* cmp */ |
| gen_sub_CC(tmp, tmp, tmp2); |
| + afl_gen_compcov(s->pc, tmp, tmp2, MO_32, 0); |
| rd = 16; |
| break; |
| case 0xb: /* cmn */ |
| @@ -13233,6 +13247,8 @@ static void arm_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) |
| return; |
| } |
| |
| + AFL_QEMU_TARGET_ARM_SNIPPET |
| + |
| insn = arm_ldl_code(env, dc->pc, dc->sctlr_b); |
| dc->insn = insn; |
| dc->pc += 4; |
| @@ -13301,6 +13317,8 @@ static void thumb_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) |
| return; |
| } |
| |
| + AFL_QEMU_TARGET_ARM_SNIPPET |
| + |
| insn = arm_lduw_code(env, dc->pc, dc->sctlr_b); |
| is_16bit = thumb_insn_is_16bit(dc, insn); |
| dc->pc += 2; |