Lines Matching refs:insn

41 #define OPCODE1(insn)		((insn)->opcode.bytes[0])  argument
42 #define OPCODE2(insn) ((insn)->opcode.bytes[1]) argument
43 #define OPCODE3(insn) ((insn)->opcode.bytes[2]) argument
44 #define MODRM_REG(insn) X86_MODRM_REG((insn)->modrm.value) argument
256 static bool is_prefix_bad(struct insn *insn) in is_prefix_bad() argument
261 for_each_insn_prefix(insn, i, p) { in is_prefix_bad()
277 static int uprobe_init_insn(struct arch_uprobe *auprobe, struct insn *insn, bool x86_64) in uprobe_init_insn() argument
283 ret = insn_decode(insn, auprobe->insn, sizeof(auprobe->insn), m); in uprobe_init_insn()
287 if (is_prefix_bad(insn)) in uprobe_init_insn()
291 if (insn_masking_exception(insn)) in uprobe_init_insn()
299 if (test_bit(OPCODE1(insn), (unsigned long *)good_insns)) in uprobe_init_insn()
302 if (insn->opcode.nbytes == 2) { in uprobe_init_insn()
303 if (test_bit(OPCODE2(insn), (unsigned long *)good_2byte_insns)) in uprobe_init_insn()
335 static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) in riprel_analyze() argument
341 if (!insn_rip_relative(insn)) in riprel_analyze()
349 if (insn->rex_prefix.nbytes) { in riprel_analyze()
350 cursor = auprobe->insn + insn_offset_rex_prefix(insn); in riprel_analyze()
358 if (insn->vex_prefix.nbytes >= 3) { in riprel_analyze()
369 cursor = auprobe->insn + insn_offset_vex_prefix(insn) + 1; in riprel_analyze()
413 reg = MODRM_REG(insn); /* Fetch modrm.reg */ in riprel_analyze()
415 if (insn->vex_prefix.nbytes) in riprel_analyze()
416 reg2 = insn->vex_prefix.bytes[2]; in riprel_analyze()
447 cursor = auprobe->insn + insn_offset_modrm(insn); in riprel_analyze()
494 static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) in riprel_analyze() argument
686 static void branch_clear_offset(struct arch_uprobe *auprobe, struct insn *insn) in branch_clear_offset() argument
702 memset(auprobe->insn + insn_offset_immediate(insn), in branch_clear_offset()
703 0, insn->immediate.nbytes); in branch_clear_offset()
716 static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn) in branch_setup_xol_ops() argument
718 u8 opc1 = OPCODE1(insn); in branch_setup_xol_ops()
729 branch_clear_offset(auprobe, insn); in branch_setup_xol_ops()
733 if (insn->opcode.nbytes != 2) in branch_setup_xol_ops()
739 opc1 = OPCODE2(insn) - 0x10; in branch_setup_xol_ops()
751 for_each_insn_prefix(insn, i, p) { in branch_setup_xol_ops()
757 auprobe->branch.ilen = insn->length; in branch_setup_xol_ops()
758 auprobe->branch.offs = insn->immediate.value; in branch_setup_xol_ops()
765 static int push_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn) in push_setup_xol_ops() argument
767 u8 opc1 = OPCODE1(insn), reg_offset = 0; in push_setup_xol_ops()
772 if (insn->length > 2) in push_setup_xol_ops()
774 if (insn->length == 2) { in push_setup_xol_ops()
777 if (insn->rex_prefix.nbytes != 1 || in push_setup_xol_ops()
778 insn->rex_prefix.bytes[0] != 0x41) in push_setup_xol_ops()
840 auprobe->push.ilen = insn->length; in push_setup_xol_ops()
854 struct insn insn; in arch_uprobe_analyze_insn() local
858 ret = uprobe_init_insn(auprobe, &insn, is_64bit_mm(mm)); in arch_uprobe_analyze_insn()
862 ret = branch_setup_xol_ops(auprobe, &insn); in arch_uprobe_analyze_insn()
866 ret = push_setup_xol_ops(auprobe, &insn); in arch_uprobe_analyze_insn()
874 switch (OPCODE1(&insn)) { in arch_uprobe_analyze_insn()
889 switch (MODRM_REG(&insn)) { in arch_uprobe_analyze_insn()
899 riprel_analyze(auprobe, &insn); in arch_uprobe_analyze_insn()
902 auprobe->defparam.ilen = insn.length; in arch_uprobe_analyze_insn()