ri->task = current;
if (rp->entry_handler) {
- rp->entry_handler(ri, regs, ri->rp->priv_arg);
+ rp->entry_handler(ri, regs);
}
arch_prepare_kretprobe(ri, regs);
if (ri->rp && ri->rp->handler) {
__get_cpu_var(current_kprobe) = &ri->rp->kp;
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
- ri->rp->handler(ri, regs, ri->rp->priv_arg);
+ ri->rp->handler(ri, regs);
__get_cpu_var(current_kprobe) = NULL;
}
typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *);
typedef void (*kprobe_post_handler_t) (struct kprobe *, struct pt_regs *, unsigned long flags);
typedef int (*kprobe_fault_handler_t) (struct kprobe *, struct pt_regs *, int trapnr);
-typedef int (*kretprobe_handler_t) (struct kretprobe_instance *, struct pt_regs *, void *);
+typedef int (*kretprobe_handler_t) (struct kretprobe_instance *, struct pt_regs *);
struct kprobe
{
struct kprobe kp;
kretprobe_handler_t handler;
kretprobe_handler_t entry_handler;
- void *priv_arg;
int maxactive;
int nmissed;
size_t data_size;
}
/* ========================= HANDLERS ========================= */
-static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs, void *priv_arg)
+static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
- struct ks_probe *ksp = (struct ks_probe *)priv_arg;
- const char *fmt = ksp->args;
- int sub_type = ksp->sub_type;
+ struct kretprobe *rp = ri->rp;
- entry_event(fmt, regs, PT_KS, sub_type);
+ if (rp) {
+ struct ks_probe *ksp = container_of(rp, struct ks_probe, rp);
+ const char *fmt = ksp->args;
+ int sub_type = ksp->sub_type;
+
+ entry_event(fmt, regs, PT_KS, sub_type);
+ }
return 0;
}
-static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs, void *priv_arg)
+static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
{
- struct ks_probe *ksp = (struct ks_probe *)priv_arg;
- unsigned long func_addr = ri->rp ? ri->rp->kp.addr : 0;
+ struct kretprobe *rp = ri->rp;
- exit_event(regs, func_addr);
+ if (rp) {
+ unsigned long func_addr = rp->kp.addr;
+
+ exit_event(regs, func_addr);
+ }
return 0;
}
ksp[id].rp.entry_handler = entry_handler;
ksp[id].rp.handler = ret_handler;
- ksp[id].rp.priv_arg = &ksp[id];
ret = dbi_register_kretprobe(&ksp[id].rp);