DECLARE_MOD_DEP_WRAPPER(show_registers, void, struct pt_regs * regs)
IMP_MOD_DEP_WRAPPER(show_registers, regs)
+#define stack_addr(regs) ((unsigned long *)kernel_stack_pointer(regs))
+
/*
* Function return probe trampoline:
* - init_kprobes() establishes a probepoint here
entry = (entry_point_t) jp->entry;
kcb->jprobe_saved_regs = *regs;
- kcb->jprobe_saved_esp = ®s->EREG(sp);
+ kcb->jprobe_saved_esp = stack_addr(regs);
addr = (unsigned long)(kcb->jprobe_saved_esp);
/* TBD: As Linus pointed out, gcc assumes that the callee
regs->EREG (flags) &= ~TF_MASK;
- tos = (unsigned long *)®s->EREG(sp);
+ tos = stack_addr(regs);
insns[0] = p->ainsn.insn[0];
insns[1] = p->ainsn.insn[1];
if ((addr > (u8 *) dbi_jprobe_return) && (addr < (u8 *) dbi_jprobe_return_end))
{
- if ((unsigned long *)(®s->EREG(sp)) != kcb->jprobe_saved_esp)
- {
+ if (stack_addr(regs) != kcb->jprobe_saved_esp) {
struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
- printk ("current esp %p does not match saved esp %p\n", ®s->EREG (sp), kcb->jprobe_saved_esp);
+ printk("current esp %p does not match saved esp %p\n",
+ stack_addr(regs), kcb->jprobe_saved_esp);
printk ("Saved registers for jprobe %p\n", jp);
show_registers (saved_regs);
printk ("Current registers\n");
void arch_prepare_kretprobe(struct kretprobe_instance *ri, struct pt_regs *regs)
{
- unsigned long *ptr_ret_addr;
+ unsigned long *ptr_ret_addr = stack_addr(regs);
/* for __switch_to probe */
if ((unsigned long)ri->rp->kp.addr == sched_addr) {
- ptr_ret_addr = (unsigned long *)kernel_stack_pointer(regs);
ri->sp = NULL;
ri->task = (struct task_struct *)regs->dx;
} else {
- ptr_ret_addr = (unsigned long *)®s->sp;
- ri->sp = ®s->sp;
+ ri->sp = ptr_ret_addr;
}
/* Save the return address */