diff --git a/target/arm/translate-a64.c b/target/arm/translate-a64.c index fd36425..992bf17 100644 --- a/target/arm/translate-a64.c +++ b/target/arm/translate-a64.c @@ -39,6 +39,8 @@ #include "translate-a64.h" #include "qemu/atomic128.h" +#include "../patches/afl-qemu-cpu-translate-inl.h" + static TCGv_i64 cpu_X[32]; static TCGv_i64 cpu_pc; @@ -3365,6 +3367,12 @@ static void disas_add_sub_imm(DisasContext *s, uint32_t insn) return; } + if (rd == 31 && sub_op) { // cmp xX, imm + TCGv_i64 tcg_imm = tcg_const_i64(imm); + afl_gen_compcov(s->pc, tcg_rn, tcg_imm, is_64bit ? MO_64 : MO_32, 1); + tcg_temp_free_i64(tcg_imm); + } + tcg_result = tcg_temp_new_i64(); if (!setflags) { if (sub_op) { @@ -3972,6 +3980,9 @@ static void disas_add_sub_ext_reg(DisasContext *s, uint32_t insn) tcg_rm = read_cpu_reg(s, rm, sf); ext_and_shift_reg(tcg_rm, tcg_rm, option, imm3); + + if (rd == 31 && sub_op) // cmp xX, xY + afl_gen_compcov(s->pc, tcg_rn, tcg_rm, sf ? MO_64 : MO_32, 0); tcg_result = tcg_temp_new_i64(); @@ -4037,6 +4048,9 @@ static void disas_add_sub_reg(DisasContext *s, uint32_t insn) shift_reg_imm(tcg_rm, tcg_rm, sf, shift_type, imm6); + if (rd == 31 && sub_op) // cmp xX, xY + afl_gen_compcov(s->pc, tcg_rn, tcg_rm, sf ? MO_64 : MO_32, 0); + tcg_result = tcg_temp_new_i64(); if (!setflags) { @@ -4246,6 +4260,8 @@ static void disas_cc(DisasContext *s, uint32_t insn) tcg_y = cpu_reg(s, y); } tcg_rn = cpu_reg(s, rn); + + afl_gen_compcov(s->pc, tcg_rn, tcg_y, sf ? MO_64 : MO_32, is_imm); /* Set the flags for the new comparison. */ tcg_tmp = tcg_temp_new_i64(); @@ -13317,6 +13333,8 @@ static void disas_data_proc_simd_fp(DisasContext *s, uint32_t insn) static void disas_a64_insn(CPUARMState *env, DisasContext *s) { uint32_t insn; + + AFL_QEMU_TARGET_ARM64_SNIPPET insn = arm_ldl_code(env, s->pc, s->sctlr_b); s->insn = insn;