Lines Matching refs:insn
53 #define OPCODE1(insn) ((insn)->opcode.bytes[0]) argument
54 #define OPCODE2(insn) ((insn)->opcode.bytes[1]) argument
55 #define OPCODE3(insn) ((insn)->opcode.bytes[2]) argument
56 #define MODRM_REG(insn) X86_MODRM_REG((insn)->modrm.value) argument
268 static bool is_prefix_bad(struct insn *insn) in is_prefix_bad() argument
272 for (i = 0; i < insn->prefixes.nbytes; i++) { in is_prefix_bad()
273 switch (insn->prefixes.bytes[i]) { in is_prefix_bad()
285 static int uprobe_init_insn(struct arch_uprobe *auprobe, struct insn *insn, bool x86_64) in uprobe_init_insn() argument
289 insn_init(insn, auprobe->insn, sizeof(auprobe->insn), x86_64); in uprobe_init_insn()
291 insn_get_length(insn); in uprobe_init_insn()
292 if (WARN_ON_ONCE(!insn_complete(insn))) in uprobe_init_insn()
295 if (is_prefix_bad(insn)) in uprobe_init_insn()
303 if (test_bit(OPCODE1(insn), (unsigned long *)good_insns)) in uprobe_init_insn()
306 if (insn->opcode.nbytes == 2) { in uprobe_init_insn()
307 if (test_bit(OPCODE2(insn), (unsigned long *)good_2byte_insns)) in uprobe_init_insn()
344 static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) in riprel_analyze() argument
350 if (!insn_rip_relative(insn)) in riprel_analyze()
358 if (insn->rex_prefix.nbytes) { in riprel_analyze()
359 cursor = auprobe->insn + insn_offset_rex_prefix(insn); in riprel_analyze()
367 if (insn->vex_prefix.nbytes == 3) { in riprel_analyze()
376 cursor = auprobe->insn + insn_offset_vex_prefix(insn) + 1; in riprel_analyze()
420 reg = MODRM_REG(insn); /* Fetch modrm.reg */ in riprel_analyze()
422 if (insn->vex_prefix.nbytes == 2) in riprel_analyze()
423 reg2 = insn->vex_prefix.bytes[1]; in riprel_analyze()
424 else if (insn->vex_prefix.nbytes == 3) in riprel_analyze()
425 reg2 = insn->vex_prefix.bytes[2]; in riprel_analyze()
456 cursor = auprobe->insn + insn_offset_modrm(insn); in riprel_analyze()
507 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()
712 static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn) in branch_setup_xol_ops() argument
714 u8 opc1 = OPCODE1(insn); in branch_setup_xol_ops()
724 branch_clear_offset(auprobe, insn); in branch_setup_xol_ops()
728 if (insn->opcode.nbytes != 2) in branch_setup_xol_ops()
734 opc1 = OPCODE2(insn) - 0x10; in branch_setup_xol_ops()
745 for (i = 0; i < insn->prefixes.nbytes; i++) { in branch_setup_xol_ops()
746 if (insn->prefixes.bytes[i] == 0x66) in branch_setup_xol_ops()
751 auprobe->branch.ilen = insn->length; in branch_setup_xol_ops()
752 auprobe->branch.offs = insn->immediate.value; in branch_setup_xol_ops()
767 struct insn insn; in arch_uprobe_analyze_insn() local
771 ret = uprobe_init_insn(auprobe, &insn, is_64bit_mm(mm)); in arch_uprobe_analyze_insn()
775 ret = branch_setup_xol_ops(auprobe, &insn); in arch_uprobe_analyze_insn()
783 switch (OPCODE1(&insn)) { in arch_uprobe_analyze_insn()
798 switch (MODRM_REG(&insn)) { in arch_uprobe_analyze_insn()
808 riprel_analyze(auprobe, &insn); in arch_uprobe_analyze_insn()
811 auprobe->defparam.ilen = insn.length; in arch_uprobe_analyze_insn()