enum
probe_insn __kprobes
arm_probe_decode_insn(probe_opcode_t insn,
struct
arch_probe_insn *api)
{
if
(aarch64_insn_is_steppable(insn))
return
INSN_GOOD;
if
(aarch64_insn_is_bcond(insn)) {
api->handler = simulate_b_cond;
}
else
if
(aarch64_insn_is_cbz(insn) ||
aarch64_insn_is_cbnz(insn)) {
api->handler = simulate_cbz_cbnz;
}
else
if
(aarch64_insn_is_tbz(insn) ||
aarch64_insn_is_tbnz(insn)) {
api->handler = simulate_tbz_tbnz;
}
else
if
(aarch64_insn_is_adr_adrp(insn)) {
api->handler = simulate_adr_adrp;
}
else
if
(aarch64_insn_is_b(insn) ||
aarch64_insn_is_bl(insn)) {
api->handler = simulate_b_bl;
}
else
if
(aarch64_insn_is_br(insn) ||
aarch64_insn_is_blr(insn) ||
aarch64_insn_is_ret(insn)) {
api->handler = simulate_br_blr_ret;
}
else
if
(aarch64_insn_is_ldr_lit(insn)) {
api->handler = simulate_ldr_literal;
}
else
if
(aarch64_insn_is_ldrsw_lit(insn)) {
api->handler = simulate_ldrsw_literal;
}
else
{
return
INSN_REJECTED;
}
return
INSN_GOOD_NO_SLOT;
}