static int arch_copy_kprobe(struct kprobe *p) { int ret; /* Copy an instruction with recovering if other optprobe modifies it.*/ ret = __copy_instruction(p->ainsn.insn, p->addr); if (!ret) return -EINVAL; /* * __copy_instruction can modify the displacement of the instruction, * but it doesn't affect boostable check. */ if (can_boost(p->ainsn.insn)) p->ainsn.boostable = 0; else p->ainsn.boostable = -1; /* Check whether the instruction modifies Interrupt Flag or not */ p->ainsn.if_modifier = is_IF_modifier(p->ainsn.insn); /* Also, displacement change doesn't affect the first byte */ p->opcode = p->ainsn.insn[0]; return 0; }
static int arch_copy_kprobe(struct kprobe *p) { struct insn insn; kprobe_opcode_t buf[MAX_INSN_SIZE]; int len; /* Copy an instruction with recovering if other optprobe modifies it.*/ len = __copy_instruction(buf, p->addr, p->ainsn.insn, &insn); if (!len) return -EINVAL; /* * __copy_instruction can modify the displacement of the instruction, * but it doesn't affect boostable check. */ len = prepare_boost(buf, p, &insn); /* Check whether the instruction modifies Interrupt Flag or not */ p->ainsn.if_modifier = is_IF_modifier(buf); /* Also, displacement change doesn't affect the first byte */ p->opcode = buf[0]; /* OK, write back the instruction(s) into ROX insn buffer */ text_poke(p->ainsn.insn, buf, len); return 0; }
static void __kprobes arch_copy_kprobe(struct kprobe *p) { /* * Copy an instruction without recovering int3, because it will be * put by another subsystem. */ __copy_instruction(p->ainsn.insn, p->addr, 0); if (can_boost(p->addr)) p->ainsn.boostable = 0; else p->ainsn.boostable = -1; p->opcode = *p->addr; }
static void __kprobes arch_copy_kprobe(struct kprobe *p) { /* Copy an instruction with recovering if other optprobe modifies it.*/ __copy_instruction(p->ainsn.insn, p->addr); /* * __copy_instruction can modify the displacement of the instruction, * but it doesn't affect boostable check. */ if (can_boost(p->ainsn.insn)) p->ainsn.boostable = 0; else p->ainsn.boostable = -1; /* Also, displacement change doesn't affect the first byte */ p->opcode = p->ainsn.insn[0]; }