intarch_uprobe_analyze_insn(structarch_uprobe*auprobe,structmm_struct*mm,unsignedlongaddr){probe_opcode_tinsn;/* TODO: Currently we do not support AARCH32 instruction probing */if(mm->context.flags&MMCF_AARCH32)return-EOPNOTSUPP;elseif(!IS_ALIGNED(addr,AARCH64_INSN_SIZE))return-EINVAL;insn=*(probe_opcode_t*)(&auprobe->insn[0]);switch(arm_probe_decode_insn(insn,&auprobe->api)){caseINSN_REJECTED:return-EINVAL;caseINSN_GOOD_NO_SLOT:auprobe->simulate=true;break;default:break;}return0;}
enumprobe_insn__kprobesarm_probe_decode_insn(probe_opcode_tinsn,structarch_probe_insn*api){/*
* Instructions reading or modifying the PC won't work from the XOL
* slot.
*/if(aarch64_insn_is_steppable(insn))returnINSN_GOOD;if(aarch64_insn_is_bcond(insn)){api->handler=simulate_b_cond;}elseif(aarch64_insn_is_cbz(insn)||aarch64_insn_is_cbnz(insn)){api->handler=simulate_cbz_cbnz;}elseif(aarch64_insn_is_tbz(insn)||aarch64_insn_is_tbnz(insn)){api->handler=simulate_tbz_tbnz;}elseif(aarch64_insn_is_adr_adrp(insn)){api->handler=simulate_adr_adrp;}elseif(aarch64_insn_is_b(insn)||aarch64_insn_is_bl(insn)){api->handler=simulate_b_bl;}elseif(aarch64_insn_is_br(insn)||aarch64_insn_is_blr(insn)||aarch64_insn_is_ret(insn)){api->handler=simulate_br_blr_ret;}elseif(aarch64_insn_is_ldr_lit(insn)){api->handler=simulate_ldr_literal;}elseif(aarch64_insn_is_ldrsw_lit(insn)){api->handler=simulate_ldrsw_literal;}else{/*
* Instruction cannot be stepped out-of-line and we don't
* (yet) simulate it.
*/returnINSN_REJECTED;}returnINSN_GOOD_NO_SLOT;}