• Home
  • Raw
  • Download

Lines Matching +full:ri +full:- +full:override

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * 2005-Apr Rusty Lynch <rusty.lynch@intel.com> and Anil S Keshavamurthy
69 s64 rel = ((s64) to - (s64) from) >> 4; in set_brl_inst()
72 brl->quad0.template = 0x05; /* [MLX](stop) */ in set_brl_inst()
73 brl->quad0.slot0 = NOP_M_INST; /* nop.m 0x0 */ in set_brl_inst()
74 brl->quad0.slot1_p0 = ((rel >> 20) & 0x7fffffffff) << 2; in set_brl_inst()
75 brl->quad1.slot1_p1 = (((rel >> 20) & 0x7fffffffff) << 2) >> (64 - 46); in set_brl_inst()
77 brl->quad1.slot2 = BRL_INST(rel >> 59, rel & 0xfffff); in set_brl_inst()
90 p->ainsn.inst_flag = 0; in update_kprobe_inst_flag()
91 p->ainsn.target_br_reg = 0; in update_kprobe_inst_flag()
92 p->ainsn.slot = slot; in update_kprobe_inst_flag()
101 p->ainsn.inst_flag |= INST_FLAG_BREAK_INST; in update_kprobe_inst_flag()
108 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG; in update_kprobe_inst_flag()
109 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7); in update_kprobe_inst_flag()
113 p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR; in update_kprobe_inst_flag()
116 p->ainsn.inst_flag |= INST_FLAG_FIX_RELATIVE_IP_ADDR; in update_kprobe_inst_flag()
117 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG; in update_kprobe_inst_flag()
118 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7); in update_kprobe_inst_flag()
124 p->ainsn.inst_flag |= INST_FLAG_FIX_BRANCH_REG; in update_kprobe_inst_flag()
125 p->ainsn.target_br_reg = ((kprobe_inst >> 6) & 0x7); in update_kprobe_inst_flag()
155 /* Integer compare - Register Register (A6 type)*/ in is_cmp_ctype_unc_inst()
160 /* Integer compare - Immediate Register (A8 type)*/ in is_cmp_ctype_unc_inst()
172 * Returns -EINVAL if unsupported
187 return -EINVAL; in unsupported_inst()
196 * - Bit 33-35 to be equal to 0x1 in unsupported_inst()
202 return -EINVAL; in unsupported_inst()
206 * - Bit 27-35 to be equal to 0x30 in unsupported_inst()
212 return -EINVAL; in unsupported_inst()
219 * bit 33-36 to be equal to 0 in unsupported_inst()
226 return -EINVAL; in unsupported_inst()
233 /* IP-Relative Predict major code is 7 */ in unsupported_inst()
234 printk(KERN_WARNING "Kprobes on IP-Relative" in unsupported_inst()
236 return -EINVAL; in unsupported_inst()
240 * bit 27-32 to be equal to 10 or 11 in unsupported_inst()
246 return -EINVAL; in unsupported_inst()
261 return -EINVAL; in unsupported_inst()
273 return -EINVAL; in unsupported_inst()
282 * In this function we override the bundle with
292 bundle_t *bundle = &p->opcode.bundle; in prepare_break_inst()
302 bundle->quad0.slot0 = break_inst; in prepare_break_inst()
305 bundle->quad0.slot1_p0 = break_inst; in prepare_break_inst()
306 bundle->quad1.slot1_p1 = break_inst >> (64-46); in prepare_break_inst()
309 bundle->quad1.slot2 = break_inst; in prepare_break_inst()
327 template = bundle->quad0.template; in get_kprobe_inst()
331 *major_opcode = (bundle->quad0.slot0 >> SLOT0_OPCODE_SHIFT); in get_kprobe_inst()
332 *kprobe_inst = bundle->quad0.slot0; in get_kprobe_inst()
335 *major_opcode = (bundle->quad1.slot1_p1 >> SLOT1_p1_OPCODE_SHIFT); in get_kprobe_inst()
336 kprobe_inst_p0 = bundle->quad0.slot1_p0; in get_kprobe_inst()
337 kprobe_inst_p1 = bundle->quad1.slot1_p1; in get_kprobe_inst()
338 *kprobe_inst = kprobe_inst_p0 | (kprobe_inst_p1 << (64-46)); in get_kprobe_inst()
341 *major_opcode = (bundle->quad1.slot2 >> SLOT2_OPCODE_SHIFT); in get_kprobe_inst()
342 *kprobe_inst = bundle->quad1.slot2; in get_kprobe_inst()
347 /* Returns non-zero if the addr is in the Interrupt Vector Table */
360 return -EINVAL; in valid_kprobe_addr()
366 return -EINVAL; in valid_kprobe_addr()
375 i = atomic_add_return(1, &kcb->prev_kprobe_index); in save_previous_kprobe()
376 kcb->prev_kprobe[i-1].kp = kprobe_running(); in save_previous_kprobe()
377 kcb->prev_kprobe[i-1].status = kcb->kprobe_status; in save_previous_kprobe()
383 i = atomic_read(&kcb->prev_kprobe_index); in restore_previous_kprobe()
384 __this_cpu_write(current_kprobe, kcb->prev_kprobe[i-1].kp); in restore_previous_kprobe()
385 kcb->kprobe_status = kcb->prev_kprobe[i-1].status; in restore_previous_kprobe()
386 atomic_sub(1, &kcb->prev_kprobe_index); in restore_previous_kprobe()
401 regs->cr_iip = __kretprobe_trampoline_handler(regs, in trampoline_probe_handler()
404 * By returning a non-zero value, we are telling in trampoline_probe_handler()
406 * to run (and have re-enabled preemption) in trampoline_probe_handler()
411 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri, in arch_prepare_kretprobe() argument
414 ri->ret_addr = (kprobe_opcode_t *)regs->b0; in arch_prepare_kretprobe()
415 ri->fp = NULL; in arch_prepare_kretprobe()
418 regs->b0 = (unsigned long)dereference_function_descriptor(kretprobe_trampoline); in arch_prepare_kretprobe()
425 unsigned int template = bundle->quad0.template; in __is_ia64_break_inst()
456 unsigned int template = bundle->quad0.template; in can_boost()
475 unsigned long addr = (unsigned long)p->addr & ~0xFULL; in prepare_booster()
476 unsigned int slot = (unsigned long)p->addr & 0xf; in prepare_booster()
479 if (can_boost(&p->ainsn.insn[0].bundle, slot, addr)) { in prepare_booster()
480 set_brl_inst(&p->ainsn.insn[1].bundle, (bundle_t *)addr + 1); in prepare_booster()
481 p->ainsn.inst_flag |= INST_FLAG_BOOSTABLE; in prepare_booster()
485 for (; addr < (unsigned long)p->addr; addr++) { in prepare_booster()
488 other_kp->ainsn.inst_flag &= ~INST_FLAG_BOOSTABLE; in prepare_booster()
494 unsigned long addr = (unsigned long) p->addr; in arch_prepare_kprobe()
501 bundle = &((kprobe_opcode_t *)kprobe_addr)->bundle; in arch_prepare_kprobe()
502 template = bundle->quad0.template; in arch_prepare_kprobe()
505 return -EINVAL; in arch_prepare_kprobe()
516 return -EINVAL; in arch_prepare_kprobe()
518 p->ainsn.insn = get_insn_slot(); in arch_prepare_kprobe()
519 if (!p->ainsn.insn) in arch_prepare_kprobe()
520 return -ENOMEM; in arch_prepare_kprobe()
521 memcpy(&p->opcode, kprobe_addr, sizeof(kprobe_opcode_t)); in arch_prepare_kprobe()
522 memcpy(p->ainsn.insn, kprobe_addr, sizeof(kprobe_opcode_t)); in arch_prepare_kprobe()
536 arm_addr = ((unsigned long)p->addr) & ~0xFUL; in arch_arm_kprobe()
537 dest = &((kprobe_opcode_t *)arm_addr)->bundle; in arch_arm_kprobe()
538 src = &p->opcode.bundle; in arch_arm_kprobe()
540 flush_icache_range((unsigned long)p->ainsn.insn, in arch_arm_kprobe()
541 (unsigned long)p->ainsn.insn + in arch_arm_kprobe()
544 switch (p->ainsn.slot) { in arch_arm_kprobe()
546 dest->quad0.slot0 = src->quad0.slot0; in arch_arm_kprobe()
549 dest->quad1.slot1_p1 = src->quad1.slot1_p1; in arch_arm_kprobe()
552 dest->quad1.slot2 = src->quad1.slot2; in arch_arm_kprobe()
563 arm_addr = ((unsigned long)p->addr) & ~0xFUL; in arch_disarm_kprobe()
564 dest = &((kprobe_opcode_t *)arm_addr)->bundle; in arch_disarm_kprobe()
565 /* p->ainsn.insn contains the original unaltered kprobe_opcode_t */ in arch_disarm_kprobe()
566 src = &p->ainsn.insn->bundle; in arch_disarm_kprobe()
567 switch (p->ainsn.slot) { in arch_disarm_kprobe()
569 dest->quad0.slot0 = src->quad0.slot0; in arch_disarm_kprobe()
572 dest->quad1.slot1_p1 = src->quad1.slot1_p1; in arch_disarm_kprobe()
575 dest->quad1.slot2 = src->quad1.slot2; in arch_disarm_kprobe()
583 if (p->ainsn.insn) { in arch_remove_kprobe()
584 free_insn_slot(p->ainsn.insn, in arch_remove_kprobe()
585 p->ainsn.inst_flag & INST_FLAG_BOOSTABLE); in arch_remove_kprobe()
586 p->ainsn.insn = NULL; in arch_remove_kprobe()
592 * located in the kprobe (p->ainsn.insn->bundle). We still need to adjust
599 unsigned long bundle_addr = (unsigned long) (&p->ainsn.insn->bundle); in resume_execution()
600 unsigned long resume_addr = (unsigned long)p->addr & ~0xFULL; in resume_execution()
602 int slot = ((unsigned long)p->addr & 0xf); in resume_execution()
604 template = p->ainsn.insn->bundle.quad0.template; in resume_execution()
609 if (p->ainsn.inst_flag & ~INST_FLAG_BOOSTABLE) { in resume_execution()
611 if (p->ainsn.inst_flag & INST_FLAG_FIX_RELATIVE_IP_ADDR) { in resume_execution()
613 regs->cr_iip = (regs->cr_iip - bundle_addr) + in resume_execution()
617 if (p->ainsn.inst_flag & INST_FLAG_FIX_BRANCH_REG) { in resume_execution()
623 switch (p->ainsn.target_br_reg) { in resume_execution()
625 if ((regs->b0 == bundle_addr) || in resume_execution()
626 (regs->b0 == bundle_addr + 0x10)) { in resume_execution()
627 regs->b0 = (regs->b0 - bundle_addr) + in resume_execution()
632 if ((regs->b6 == bundle_addr) || in resume_execution()
633 (regs->b6 == bundle_addr + 0x10)) { in resume_execution()
634 regs->b6 = (regs->b6 - bundle_addr) + in resume_execution()
639 if ((regs->b7 == bundle_addr) || in resume_execution()
640 (regs->b7 == bundle_addr + 0x10)) { in resume_execution()
641 regs->b7 = (regs->b7 - bundle_addr) + in resume_execution()
651 if (regs->cr_iip == bundle_addr + 0x10) { in resume_execution()
652 regs->cr_iip = resume_addr + 0x10; in resume_execution()
655 if (regs->cr_iip == bundle_addr) { in resume_execution()
656 regs->cr_iip = resume_addr; in resume_execution()
662 ia64_psr(regs)->ss = 0; in resume_execution()
667 unsigned long bundle_addr = (unsigned long) &p->ainsn.insn->bundle; in prepare_ss()
668 unsigned long slot = (unsigned long)p->addr & 0xf; in prepare_ss()
671 if (p->ainsn.inst_flag == INST_FLAG_BREAK_INST) in prepare_ss()
672 regs->cr_iip = (unsigned long)p->addr & ~0xFULL; in prepare_ss()
674 regs->cr_iip = bundle_addr & ~0xFULL; in prepare_ss()
679 ia64_psr(regs)->ri = slot; in prepare_ss()
682 ia64_psr(regs)->ss = 1; in prepare_ss()
687 unsigned int slot = ia64_psr(regs)->ri; in is_ia64_break_inst()
688 unsigned long *kprobe_addr = (unsigned long *)regs->cr_iip; in is_ia64_break_inst()
700 struct pt_regs *regs = args->regs; in pre_kprobes_handler()
715 if ((kcb->kprobe_status == KPROBE_HIT_SS) && in pre_kprobes_handler()
716 (p->ainsn.inst_flag == INST_FLAG_BREAK_INST)) { in pre_kprobes_handler()
717 ia64_psr(regs)->ss = 0; in pre_kprobes_handler()
730 kcb->kprobe_status = KPROBE_REENTER; in pre_kprobes_handler()
764 kcb->kprobe_status = KPROBE_HIT_ACTIVE; in pre_kprobes_handler()
766 if (p->pre_handler && p->pre_handler(p, regs)) { in pre_kprobes_handler()
773 if (p->ainsn.inst_flag == INST_FLAG_BOOSTABLE && !p->post_handler) { in pre_kprobes_handler()
774 /* Boost up -- we can execute copied instructions directly */ in pre_kprobes_handler()
775 ia64_psr(regs)->ri = p->ainsn.slot; in pre_kprobes_handler()
776 regs->cr_iip = (unsigned long)&p->ainsn.insn->bundle & ~0xFULL; in pre_kprobes_handler()
778 ia64_psr(regs)->ss = 0; in pre_kprobes_handler()
786 kcb->kprobe_status = KPROBE_HIT_SS; in pre_kprobes_handler()
802 if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { in post_kprobes_handler()
803 kcb->kprobe_status = KPROBE_HIT_SSDONE; in post_kprobes_handler()
804 cur->post_handler(cur, regs, 0); in post_kprobes_handler()
810 if (kcb->kprobe_status == KPROBE_REENTER) { in post_kprobes_handler()
827 switch(kcb->kprobe_status) { in kprobe_fault_handler()
837 regs->cr_iip = ((unsigned long)cur->addr) & ~0xFULL; in kprobe_fault_handler()
838 ia64_psr(regs)->ri = ((unsigned long)cur->addr) & 0xf; in kprobe_fault_handler()
839 if (kcb->kprobe_status == KPROBE_REENTER) in kprobe_fault_handler()
859 * user-specified handler try to fix it first. in kprobe_fault_handler()
861 if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr)) in kprobe_fault_handler()
864 * In case the user-specified fault handler returned in kprobe_fault_handler()
887 if (args->regs && user_mode(args->regs)) in kprobe_exceptions_notify()
893 if ((args->err >> 12) == (__IA64_BREAK_KPROBE >> 12) in kprobe_exceptions_notify()
894 || args->err == 0) in kprobe_exceptions_notify()
900 if (args->err == 36) in kprobe_exceptions_notify()
901 if (post_kprobes_handler(args->regs)) in kprobe_exceptions_notify()
912 return ((struct fnptr *)entry)->ip; in arch_deref_entry_point()
928 if (p->addr == in arch_trampoline_kprobe()