Lines Matching refs:insn

54 #define OPCODE1(insn)		((insn)->opcode.bytes[0])  argument
55 #define OPCODE2(insn) ((insn)->opcode.bytes[1]) argument
56 #define OPCODE3(insn) ((insn)->opcode.bytes[2]) argument
57 #define MODRM_REG(insn) X86_MODRM_REG((insn)->modrm.value) argument
269 static bool is_prefix_bad(struct insn *insn) in is_prefix_bad() argument
273 for (i = 0; i < insn->prefixes.nbytes; i++) { in is_prefix_bad()
274 switch (insn->prefixes.bytes[i]) { in is_prefix_bad()
286 static int uprobe_init_insn(struct arch_uprobe *auprobe, struct insn *insn, bool x86_64) in uprobe_init_insn() argument
290 insn_init(insn, auprobe->insn, sizeof(auprobe->insn), x86_64); in uprobe_init_insn()
292 insn_get_length(insn); in uprobe_init_insn()
293 if (WARN_ON_ONCE(!insn_complete(insn))) in uprobe_init_insn()
296 if (is_prefix_bad(insn)) in uprobe_init_insn()
304 if (test_bit(OPCODE1(insn), (unsigned long *)good_insns)) in uprobe_init_insn()
307 if (insn->opcode.nbytes == 2) { in uprobe_init_insn()
308 if (test_bit(OPCODE2(insn), (unsigned long *)good_2byte_insns)) in uprobe_init_insn()
340 static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) in riprel_analyze() argument
346 if (!insn_rip_relative(insn)) in riprel_analyze()
354 if (insn->rex_prefix.nbytes) { in riprel_analyze()
355 cursor = auprobe->insn + insn_offset_rex_prefix(insn); in riprel_analyze()
363 if (insn->vex_prefix.nbytes == 3) { in riprel_analyze()
372 cursor = auprobe->insn + insn_offset_vex_prefix(insn) + 1; in riprel_analyze()
416 reg = MODRM_REG(insn); /* Fetch modrm.reg */ in riprel_analyze()
418 if (insn->vex_prefix.nbytes == 2) in riprel_analyze()
419 reg2 = insn->vex_prefix.bytes[1]; in riprel_analyze()
420 else if (insn->vex_prefix.nbytes == 3) in riprel_analyze()
421 reg2 = insn->vex_prefix.bytes[2]; in riprel_analyze()
452 cursor = auprobe->insn + insn_offset_modrm(insn); in riprel_analyze()
499 static void riprel_analyze(struct arch_uprobe *auprobe, struct insn *insn) in riprel_analyze() argument
678 static void branch_clear_offset(struct arch_uprobe *auprobe, struct insn *insn) in branch_clear_offset() argument
694 memset(auprobe->insn + insn_offset_immediate(insn), in branch_clear_offset()
695 0, insn->immediate.nbytes); in branch_clear_offset()
704 static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn) in branch_setup_xol_ops() argument
706 u8 opc1 = OPCODE1(insn); in branch_setup_xol_ops()
716 branch_clear_offset(auprobe, insn); in branch_setup_xol_ops()
720 if (insn->opcode.nbytes != 2) in branch_setup_xol_ops()
726 opc1 = OPCODE2(insn) - 0x10; in branch_setup_xol_ops()
737 for (i = 0; i < insn->prefixes.nbytes; i++) { in branch_setup_xol_ops()
738 if (insn->prefixes.bytes[i] == 0x66) in branch_setup_xol_ops()
743 auprobe->branch.ilen = insn->length; in branch_setup_xol_ops()
744 auprobe->branch.offs = insn->immediate.value; in branch_setup_xol_ops()
759 struct insn insn; in arch_uprobe_analyze_insn() local
763 ret = uprobe_init_insn(auprobe, &insn, is_64bit_mm(mm)); in arch_uprobe_analyze_insn()
767 ret = branch_setup_xol_ops(auprobe, &insn); in arch_uprobe_analyze_insn()
775 switch (OPCODE1(&insn)) { in arch_uprobe_analyze_insn()
790 switch (MODRM_REG(&insn)) { in arch_uprobe_analyze_insn()
800 riprel_analyze(auprobe, &insn); in arch_uprobe_analyze_insn()
803 auprobe->defparam.ilen = insn.length; in arch_uprobe_analyze_insn()