* @param regs Pointer to CPU registers data.
* @return Void.
*/
-void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
+static void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
{
int cpu = smp_processor_id();
regs->ARM_pc = (unsigned long)p->ainsn.insn;
}
}
-EXPORT_SYMBOL_GPL(prepare_singlestep);
/**
* @brief Saves previous kprobe.
unsigned long flags;
local_irq_save(flags);
- preempt_disable();
if (likely(instr == BREAKPOINT_INSTRUCTION)) {
ret = kprobe_handler(regs);
ret = p && (p->opcode == instr) ? 0 : 1;
}
- swap_preempt_enable_no_resched();
local_irq_restore(flags);
return ret;
* @param regs Pointer to CPU registers data.
* @return Void.
*/
-void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
+static void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
{
- int cpu = smp_processor_id();
+ regs->flags |= TF_MASK;
+ regs->flags &= ~IF_MASK;
- if (p->ss_addr[cpu]) {
- regs->EREG(ip) = (unsigned long)p->ss_addr[cpu];
- p->ss_addr[cpu] = NULL;
- } else {
- regs->EREG(flags) |= TF_MASK;
- regs->EREG(flags) &= ~IF_MASK;
- /* single step inline if the instruction is an int3 */
- if (p->opcode == BREAKPOINT_INSTRUCTION) {
- regs->EREG(ip) = (unsigned long) p->addr;
- /* printk(KERN_INFO "break_insn!!!\n"); */
- } else
- regs->EREG(ip) = (unsigned long) p->ainsn.insn;
- }
+ /* single step inline if the instruction is an int3 */
+ if (p->opcode == BREAKPOINT_INSTRUCTION)
+ regs->ip = (unsigned long)p->addr;
+ else
+ regs->ip = (unsigned long)p->ainsn.insn;
}
-EXPORT_SYMBOL_GPL(prepare_singlestep);
/**
* @brief Saves previous kprobe.
/* Boost up -- we can execute copied instructions directly */
swap_kprobe_running_set(NULL);
regs->ip = (unsigned long)p->ainsn.insn;
- swap_preempt_enable_no_resched();
return 1;
}
addr = (kprobe_opcode_t *) (regs->EREG(ip) - sizeof(kprobe_opcode_t));
- preempt_disable();
-
kcb = swap_get_kprobe_ctlblk();
p = swap_get_kprobe(addr);
return 1;
no_kprobe:
- swap_preempt_enable_no_resched();
-
return ret;
}
}
swap_kprobe_running_set(NULL);
out:
- swap_preempt_enable_no_resched();
-
/*
* if somebody else is singlestepping across a probe point, eflags
* will have TF set, in which case, continue the remaining processing
restore_previous_kprobe(kcb);
else
swap_kprobe_running_set(NULL);
- swap_preempt_enable_no_resched();
break;
case KPROBE_HIT_ACTIVE:
case KPROBE_HIT_SSDONE:
ret = NOTIFY_STOP;
break;
case DIE_GPF:
- /* swap_kprobe_running() needs smp_processor_id() */
- preempt_disable();
if (swap_kprobe_running() &&
kprobe_fault_handler(args->regs, args->trapnr))
ret = NOTIFY_STOP;
- preempt_enable();
break;
default:
break;
*regs = kcb->jprobe_saved_regs;
memcpy((kprobe_opcode_t *) stack_addr, kcb->jprobes_stack,
MIN_STACK_SIZE(stack_addr));
- swap_preempt_enable_no_resched();
return 1;
}
regs->ip = (unsigned long)&kjump_trampoline;
swap_kprobe_running_set(NULL);
- swap_preempt_enable_no_resched();
return 1;
}
#endif
-/*
- * TODO: possibly unnided
- * check and remove swap_preempt_enable_no_resched() call
- */
-#if (defined(MODULE) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)))
-
-#ifdef CONFIG_PREEMPT_COUNT
-#define swap_preempt_enable_no_resched() \
-do { \
- barrier(); \
- preempt_count_dec(); \
-} while (0)
-#else /* !CONFIG_PREEMPT_COUNT */
-#define swap_preempt_enable_no_resched() barrier()
-#endif /* CONFIG_PREEMPT_COUNT */
-
-#else /* !(defined(MODULE) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) */
-
-#define swap_preempt_enable_no_resched() preempt_enable_no_resched()
-
-#endif /* !(defined(MODULE) && (LINUX_VERSION_CODE >= KERNEL_VERSION(3,14,0)) */
-
-
#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 1, 0)
#define task_job(task) (task->jobctl)
#else /* LINUX_VERSION_CODE > KERNEL_VERSION(3, 1, 0) */