Lines Matching refs:insn
57 enum aarch64_insn_encoding_class __kprobes aarch64_get_insn_class(u32 insn) in aarch64_get_insn_class() argument
59 return aarch64_insn_encoding_class[(insn >> 25) & 0xf]; in aarch64_get_insn_class()
63 bool __kprobes aarch64_insn_is_nop(u32 insn) in aarch64_insn_is_nop() argument
65 if (!aarch64_insn_is_hint(insn)) in aarch64_insn_is_nop()
68 switch (insn & 0xFE0) { in aarch64_insn_is_nop()
80 bool aarch64_insn_is_branch_imm(u32 insn) in aarch64_insn_is_branch_imm() argument
82 return (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn) || in aarch64_insn_is_branch_imm()
83 aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn) || in aarch64_insn_is_branch_imm()
84 aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) || in aarch64_insn_is_branch_imm()
85 aarch64_insn_is_bcond(insn)); in aarch64_insn_is_branch_imm()
128 static int __kprobes __aarch64_insn_write(void *addr, u32 insn) in __aarch64_insn_write() argument
137 ret = probe_kernel_write(waddr, &insn, AARCH64_INSN_SIZE); in __aarch64_insn_write()
145 int __kprobes aarch64_insn_write(void *addr, u32 insn) in aarch64_insn_write() argument
147 insn = cpu_to_le32(insn); in aarch64_insn_write()
148 return __aarch64_insn_write(addr, insn); in aarch64_insn_write()
151 static bool __kprobes __aarch64_insn_hotpatch_safe(u32 insn) in __aarch64_insn_hotpatch_safe() argument
153 if (aarch64_get_insn_class(insn) != AARCH64_INSN_CLS_BR_SYS) in __aarch64_insn_hotpatch_safe()
156 return aarch64_insn_is_b(insn) || in __aarch64_insn_hotpatch_safe()
157 aarch64_insn_is_bl(insn) || in __aarch64_insn_hotpatch_safe()
158 aarch64_insn_is_svc(insn) || in __aarch64_insn_hotpatch_safe()
159 aarch64_insn_is_hvc(insn) || in __aarch64_insn_hotpatch_safe()
160 aarch64_insn_is_smc(insn) || in __aarch64_insn_hotpatch_safe()
161 aarch64_insn_is_brk(insn) || in __aarch64_insn_hotpatch_safe()
162 aarch64_insn_is_nop(insn); in __aarch64_insn_hotpatch_safe()
181 int __kprobes aarch64_insn_patch_text_nosync(void *addr, u32 insn) in aarch64_insn_patch_text_nosync() argument
190 ret = aarch64_insn_write(tp, insn); in aarch64_insn_patch_text_nosync()
250 u32 insn; in aarch64_insn_patch_text() local
254 ret = aarch64_insn_read(addrs[0], &insn); in aarch64_insn_patch_text()
258 if (aarch64_insn_hotpatch_safe(insn, insns[0])) { in aarch64_insn_patch_text()
336 u64 aarch64_insn_decode_immediate(enum aarch64_insn_imm_type type, u32 insn) in aarch64_insn_decode_immediate() argument
344 immlo = (insn >> ADR_IMM_LOSHIFT) & ADR_IMM_LOMASK; in aarch64_insn_decode_immediate()
345 immhi = (insn >> ADR_IMM_HISHIFT) & ADR_IMM_HIMASK; in aarch64_insn_decode_immediate()
346 insn = (immhi << ADR_IMM_HILOSPLIT) | immlo; in aarch64_insn_decode_immediate()
357 return (insn >> shift) & mask; in aarch64_insn_decode_immediate()
361 u32 insn, u64 imm) in aarch64_insn_encode_immediate() argument
385 insn &= ~(mask << shift); in aarch64_insn_encode_immediate()
386 insn |= (imm & mask) << shift; in aarch64_insn_encode_immediate()
388 return insn; in aarch64_insn_encode_immediate()
392 u32 insn, in aarch64_insn_encode_register() argument
423 insn &= ~(GENMASK(4, 0) << shift); in aarch64_insn_encode_register()
424 insn |= reg << shift; in aarch64_insn_encode_register()
426 return insn; in aarch64_insn_encode_register()
430 u32 insn) in aarch64_insn_encode_ldst_size() argument
452 insn &= ~GENMASK(31, 30); in aarch64_insn_encode_ldst_size()
453 insn |= size << 30; in aarch64_insn_encode_ldst_size()
455 return insn; in aarch64_insn_encode_ldst_size()
478 u32 insn; in aarch64_insn_gen_branch_imm() local
490 insn = aarch64_insn_get_bl_value(); in aarch64_insn_gen_branch_imm()
493 insn = aarch64_insn_get_b_value(); in aarch64_insn_gen_branch_imm()
500 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_26, insn, in aarch64_insn_gen_branch_imm()
509 u32 insn; in aarch64_insn_gen_comp_branch_imm() local
516 insn = aarch64_insn_get_cbz_value(); in aarch64_insn_gen_comp_branch_imm()
519 insn = aarch64_insn_get_cbnz_value(); in aarch64_insn_gen_comp_branch_imm()
530 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_comp_branch_imm()
537 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg); in aarch64_insn_gen_comp_branch_imm()
539 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn, in aarch64_insn_gen_comp_branch_imm()
546 u32 insn; in aarch64_insn_gen_cond_branch_imm() local
551 insn = aarch64_insn_get_bcond_value(); in aarch64_insn_gen_cond_branch_imm()
554 insn |= cond; in aarch64_insn_gen_cond_branch_imm()
556 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn, in aarch64_insn_gen_cond_branch_imm()
573 u32 insn; in aarch64_insn_gen_branch_reg() local
577 insn = aarch64_insn_get_br_value(); in aarch64_insn_gen_branch_reg()
580 insn = aarch64_insn_get_blr_value(); in aarch64_insn_gen_branch_reg()
583 insn = aarch64_insn_get_ret_value(); in aarch64_insn_gen_branch_reg()
590 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, reg); in aarch64_insn_gen_branch_reg()
599 u32 insn; in aarch64_insn_gen_load_store_reg() local
603 insn = aarch64_insn_get_ldr_reg_value(); in aarch64_insn_gen_load_store_reg()
606 insn = aarch64_insn_get_str_reg_value(); in aarch64_insn_gen_load_store_reg()
613 insn = aarch64_insn_encode_ldst_size(size, insn); in aarch64_insn_gen_load_store_reg()
615 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, reg); in aarch64_insn_gen_load_store_reg()
617 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, in aarch64_insn_gen_load_store_reg()
620 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, in aarch64_insn_gen_load_store_reg()
631 u32 insn; in aarch64_insn_gen_load_store_pair() local
636 insn = aarch64_insn_get_ldp_pre_value(); in aarch64_insn_gen_load_store_pair()
639 insn = aarch64_insn_get_stp_pre_value(); in aarch64_insn_gen_load_store_pair()
642 insn = aarch64_insn_get_ldp_post_value(); in aarch64_insn_gen_load_store_pair()
645 insn = aarch64_insn_get_stp_post_value(); in aarch64_insn_gen_load_store_pair()
664 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_load_store_pair()
671 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT, insn, in aarch64_insn_gen_load_store_pair()
674 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RT2, insn, in aarch64_insn_gen_load_store_pair()
677 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, in aarch64_insn_gen_load_store_pair()
680 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_7, insn, in aarch64_insn_gen_load_store_pair()
689 u32 insn; in aarch64_insn_gen_add_sub_imm() local
693 insn = aarch64_insn_get_add_imm_value(); in aarch64_insn_gen_add_sub_imm()
696 insn = aarch64_insn_get_sub_imm_value(); in aarch64_insn_gen_add_sub_imm()
699 insn = aarch64_insn_get_adds_imm_value(); in aarch64_insn_gen_add_sub_imm()
702 insn = aarch64_insn_get_subs_imm_value(); in aarch64_insn_gen_add_sub_imm()
713 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_add_sub_imm()
722 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_add_sub_imm()
724 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_add_sub_imm()
726 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_12, insn, imm); in aarch64_insn_gen_add_sub_imm()
735 u32 insn; in aarch64_insn_gen_bitfield() local
740 insn = aarch64_insn_get_bfm_value(); in aarch64_insn_gen_bitfield()
743 insn = aarch64_insn_get_ubfm_value(); in aarch64_insn_gen_bitfield()
746 insn = aarch64_insn_get_sbfm_value(); in aarch64_insn_gen_bitfield()
758 insn |= AARCH64_INSN_SF_BIT | AARCH64_INSN_N_BIT; in aarch64_insn_gen_bitfield()
769 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_bitfield()
771 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_bitfield()
773 insn = aarch64_insn_encode_immediate(AARCH64_INSN_IMM_R, insn, immr); in aarch64_insn_gen_bitfield()
775 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_S, insn, imms); in aarch64_insn_gen_bitfield()
783 u32 insn; in aarch64_insn_gen_movewide() local
787 insn = aarch64_insn_get_movz_value(); in aarch64_insn_gen_movewide()
790 insn = aarch64_insn_get_movk_value(); in aarch64_insn_gen_movewide()
793 insn = aarch64_insn_get_movn_value(); in aarch64_insn_gen_movewide()
807 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_movewide()
816 insn |= (shift >> 4) << 21; in aarch64_insn_gen_movewide()
818 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_movewide()
820 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_16, insn, imm); in aarch64_insn_gen_movewide()
830 u32 insn; in aarch64_insn_gen_add_sub_shifted_reg() local
834 insn = aarch64_insn_get_add_value(); in aarch64_insn_gen_add_sub_shifted_reg()
837 insn = aarch64_insn_get_sub_value(); in aarch64_insn_gen_add_sub_shifted_reg()
840 insn = aarch64_insn_get_adds_value(); in aarch64_insn_gen_add_sub_shifted_reg()
843 insn = aarch64_insn_get_subs_value(); in aarch64_insn_gen_add_sub_shifted_reg()
855 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_add_sub_shifted_reg()
864 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_add_sub_shifted_reg()
866 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_add_sub_shifted_reg()
868 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg); in aarch64_insn_gen_add_sub_shifted_reg()
870 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift); in aarch64_insn_gen_add_sub_shifted_reg()
878 u32 insn; in aarch64_insn_gen_data1() local
882 insn = aarch64_insn_get_rev16_value(); in aarch64_insn_gen_data1()
885 insn = aarch64_insn_get_rev32_value(); in aarch64_insn_gen_data1()
889 insn = aarch64_insn_get_rev64_value(); in aarch64_insn_gen_data1()
900 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_data1()
907 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_data1()
909 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_data1()
918 u32 insn; in aarch64_insn_gen_data2() local
922 insn = aarch64_insn_get_udiv_value(); in aarch64_insn_gen_data2()
925 insn = aarch64_insn_get_sdiv_value(); in aarch64_insn_gen_data2()
928 insn = aarch64_insn_get_lslv_value(); in aarch64_insn_gen_data2()
931 insn = aarch64_insn_get_lsrv_value(); in aarch64_insn_gen_data2()
934 insn = aarch64_insn_get_asrv_value(); in aarch64_insn_gen_data2()
937 insn = aarch64_insn_get_rorv_value(); in aarch64_insn_gen_data2()
948 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_data2()
955 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_data2()
957 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_data2()
959 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg); in aarch64_insn_gen_data2()
969 u32 insn; in aarch64_insn_gen_data3() local
973 insn = aarch64_insn_get_madd_value(); in aarch64_insn_gen_data3()
976 insn = aarch64_insn_get_msub_value(); in aarch64_insn_gen_data3()
987 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_data3()
994 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_data3()
996 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RA, insn, src); in aarch64_insn_gen_data3()
998 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, in aarch64_insn_gen_data3()
1001 return aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, in aarch64_insn_gen_data3()
1012 u32 insn; in aarch64_insn_gen_logical_shifted_reg() local
1016 insn = aarch64_insn_get_and_value(); in aarch64_insn_gen_logical_shifted_reg()
1019 insn = aarch64_insn_get_bic_value(); in aarch64_insn_gen_logical_shifted_reg()
1022 insn = aarch64_insn_get_orr_value(); in aarch64_insn_gen_logical_shifted_reg()
1025 insn = aarch64_insn_get_orn_value(); in aarch64_insn_gen_logical_shifted_reg()
1028 insn = aarch64_insn_get_eor_value(); in aarch64_insn_gen_logical_shifted_reg()
1031 insn = aarch64_insn_get_eon_value(); in aarch64_insn_gen_logical_shifted_reg()
1034 insn = aarch64_insn_get_ands_value(); in aarch64_insn_gen_logical_shifted_reg()
1037 insn = aarch64_insn_get_bics_value(); in aarch64_insn_gen_logical_shifted_reg()
1049 insn |= AARCH64_INSN_SF_BIT; in aarch64_insn_gen_logical_shifted_reg()
1058 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RD, insn, dst); in aarch64_insn_gen_logical_shifted_reg()
1060 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RN, insn, src); in aarch64_insn_gen_logical_shifted_reg()
1062 insn = aarch64_insn_encode_register(AARCH64_INSN_REGTYPE_RM, insn, reg); in aarch64_insn_gen_logical_shifted_reg()
1064 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_6, insn, shift); in aarch64_insn_gen_logical_shifted_reg()
1072 s32 aarch64_get_branch_offset(u32 insn) in aarch64_get_branch_offset() argument
1076 if (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn)) { in aarch64_get_branch_offset()
1077 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_26, insn); in aarch64_get_branch_offset()
1081 if (aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) || in aarch64_get_branch_offset()
1082 aarch64_insn_is_bcond(insn)) { in aarch64_get_branch_offset()
1083 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_19, insn); in aarch64_get_branch_offset()
1087 if (aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn)) { in aarch64_get_branch_offset()
1088 imm = aarch64_insn_decode_immediate(AARCH64_INSN_IMM_14, insn); in aarch64_get_branch_offset()
1100 u32 aarch64_set_branch_offset(u32 insn, s32 offset) in aarch64_set_branch_offset() argument
1102 if (aarch64_insn_is_b(insn) || aarch64_insn_is_bl(insn)) in aarch64_set_branch_offset()
1103 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_26, insn, in aarch64_set_branch_offset()
1106 if (aarch64_insn_is_cbz(insn) || aarch64_insn_is_cbnz(insn) || in aarch64_set_branch_offset()
1107 aarch64_insn_is_bcond(insn)) in aarch64_set_branch_offset()
1108 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_19, insn, in aarch64_set_branch_offset()
1111 if (aarch64_insn_is_tbz(insn) || aarch64_insn_is_tbnz(insn)) in aarch64_set_branch_offset()
1112 return aarch64_insn_encode_immediate(AARCH64_INSN_IMM_14, insn, in aarch64_set_branch_offset()
1119 bool aarch32_insn_is_wide(u32 insn) in aarch32_insn_is_wide() argument
1121 return insn >= 0xe800; in aarch32_insn_is_wide()
1127 u32 aarch32_insn_extract_reg_num(u32 insn, int offset) in aarch32_insn_extract_reg_num() argument
1129 return (insn & (0xf << offset)) >> offset; in aarch32_insn_extract_reg_num()
1134 u32 aarch32_insn_mcr_extract_opc2(u32 insn) in aarch32_insn_mcr_extract_opc2() argument
1136 return (insn & (OPC2_MASK << OPC2_OFFSET)) >> OPC2_OFFSET; in aarch32_insn_mcr_extract_opc2()
1140 u32 aarch32_insn_mcr_extract_crm(u32 insn) in aarch32_insn_mcr_extract_crm() argument
1142 return insn & CRM_MASK; in aarch32_insn_mcr_extract_crm()