Lines Matching defs:insn

55 #include <asm/insn.h>
115 } __packed *insn;
117 insn = (struct __arch_relative_insn *)dest;
118 insn->raddr = (s32)((long)(to) - ((long)(from) + 5));
119 insn->op = op;
140 bool can_boost(struct insn *insn, void *addr)
150 if (insn->opcode.nbytes == 2)
151 return test_bit(insn->opcode.bytes[1],
154 if (insn->opcode.nbytes != 1)
157 for_each_insn_prefix(insn, i, prefix) {
166 opcode = insn->opcode.bytes[0];
186 return X86_MODRM_REG(insn->modrm.bytes[0]) != 0b110;
189 return X86_MODRM_REG(insn->modrm.bytes[0]) != 0b001;
192 return X86_MODRM_REG(insn->modrm.bytes[0]) == 0b000 ||
193 X86_MODRM_REG(insn->modrm.bytes[0]) == 0b001;
196 return X86_MODRM_REG(insn->modrm.bytes[0]) == 0b000 ||
197 X86_MODRM_REG(insn->modrm.bytes[0]) == 0b001 ||
198 X86_MODRM_REG(insn->modrm.bytes[0]) == 0b100;
220 * Basically, kp->ainsn.insn has an original instruction.
224 * from the kp->ainsn.insn.
266 /* Check if insn is INT or UD */
267 static inline bool is_exception_insn(struct insn *insn)
270 if (insn->opcode.bytes[0] == 0x0f) {
272 return insn->opcode.bytes[1] == 0xff ||
273 insn->opcode.bytes[1] == 0xb9 ||
274 insn->opcode.bytes[1] == 0x0b;
278 return insn->opcode.bytes[0] == 0xcc ||
279 insn->opcode.bytes[0] == 0xcd ||
280 insn->opcode.bytes[0] == 0xce ||
281 insn->opcode.bytes[0] == 0xf1;
291 struct insn insn;
312 if (insn_decode_kernel(&insn, (void *)__addr) < 0)
320 if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
324 addr += insn.length;
335 if (insn_decode_kernel(&insn, (void *)__addr) < 0)
339 if (is_exception_insn(&insn))
356 if (insn.opcode.value == 0xBA)
358 else if (insn.opcode.value == 0x3)
376 u32 insn;
382 if (copy_from_kernel_nofault(&insn, (void *)addr, sizeof(u32)))
385 if (is_endbr(insn)) {
404 int __copy_instruction(u8 *dest, u8 *src, u8 *real, struct insn *insn)
410 if (!recovered_insn || !insn)
418 ret = insn_decode_kernel(insn, dest);
423 if (insn_has_emulate_prefix(insn))
427 if (insn->opcode.bytes[0] == INT3_INSN_OPCODE)
431 if (insn_masking_exception(insn))
436 if (insn_rip_relative(insn)) {
451 newdisp = (u8 *) src + (s64) insn->displacement.value
457 disp = (u8 *) dest + insn_offset_displacement(insn);
461 return insn->length;
466 struct insn *insn)
468 int len = insn->length;
471 !p->post_handler && can_boost(insn, p->addr) &&
477 synthesize_reljump(buf + len, p->ainsn.insn + len,
478 p->addr + insn->length);
639 static int prepare_emulation(struct kprobe *p, struct insn *insn)
641 insn_byte_t opcode = insn->opcode.bytes[0];
669 if (insn->immediate.nbytes == 2)
670 p->ainsn.rel32 = *(s16 *)&insn->immediate.value;
672 p->ainsn.rel32 = *(s32 *)&insn->immediate.value;
677 if (insn->immediate.nbytes == 1)
678 p->ainsn.rel32 = *(s8 *)&insn->immediate.value;
679 else if (insn->immediate.nbytes == 2)
680 p->ainsn.rel32 = *(s16 *)&insn->immediate.value;
682 p->ainsn.rel32 = *(s32 *)&insn->immediate.value;
688 p->ainsn.rel32 = insn->immediate.value;
691 opcode = insn->opcode.bytes[1];
696 if (insn->immediate.nbytes == 2)
697 p->ainsn.rel32 = *(s16 *)&insn->immediate.value;
699 p->ainsn.rel32 = *(s32 *)&insn->immediate.value;
701 X86_MODRM_REG(insn->modrm.bytes[0]) == 0 &&
702 X86_MODRM_MOD(insn->modrm.bytes[0]) == 3) {
713 p->ainsn.loop.asize = insn->addr_bytes * 8;
714 p->ainsn.rel32 = *(s8 *)&insn->immediate.value;
721 opcode = insn->modrm.bytes[0];
737 if (insn->addr_bytes != sizeof(unsigned long))
744 if (X86_REX_B(insn->rex_prefix.value))
751 p->ainsn.size = insn->length;
758 struct insn insn;
763 len = __copy_instruction(buf, p->addr, p->ainsn.insn, &insn);
768 ret = prepare_emulation(p, &insn);
773 len = prepare_singlestep(buf, p, &insn);
781 perf_event_text_poke(p->ainsn.insn, NULL, 0, buf, len);
783 /* OK, write back the instruction(s) into ROX insn buffer */
784 text_poke(p->ainsn.insn, buf, len);
801 /* insn: must be on special executable page on x86. */
802 p->ainsn.insn = get_insn_slot();
803 if (!p->ainsn.insn)
808 free_insn_slot(p->ainsn.insn, 0);
809 p->ainsn.insn = NULL;
835 if (p->ainsn.insn) {
837 perf_event_text_poke(p->ainsn.insn, p->ainsn.insn,
839 free_insn_slot(p->ainsn.insn, p->ainsn.boostable);
840 p->ainsn.insn = NULL;
907 regs->ip = (unsigned long)p->ainsn.insn;
926 regs->ip = (unsigned long)p->ainsn.insn;
936 * copy is p->ainsn.insn. We also doesn't use trap, but "int3" again
951 unsigned long copy_ip = (unsigned long)p->ainsn.insn;
1048 if ((unsigned long)p->ainsn.insn < regs->ip &&
1049 (unsigned long)p->ainsn.insn + MAX_INSN_SIZE > regs->ip) {
1066 if (unlikely(regs->ip == (unsigned long)cur->ainsn.insn)) {