if ((ri = get_free_rp_inst(rp)) != NULL) {
ri->rp = rp;
ri->task = current;
+
+ if (rp->entry_handler) {
+ rp->entry_handler(ri, regs, ri->rp->priv_arg);
+ }
+
ri->ret_addr = (kprobe_opcode_t *)regs->uregs[14];
ri->sp = (kprobe_opcode_t *)regs->ARM_sp; //uregs[13];
spin_lock_irqsave(&kretprobe_lock, flags);
if (!rp->disarm)
arch_prepare_kretprobe(rp, regs);
+
spin_unlock_irqrestore(&kretprobe_lock, flags);
DBPRINTF ("END\n");
return 0;
}
for (i = 0; i < alloc_nodes; i++) {
- inst = kmalloc(sizeof(struct kretprobe_instance), GFP_ATOMIC);
+ inst = kmalloc(sizeof(inst) + rp->data_size, GFP_ATOMIC);
if (inst == NULL) {
free_rp_inst(rp);
return -ENOMEM;
INIT_HLIST_HEAD(&rp->used_instances);
INIT_HLIST_HEAD(&rp->free_instances);
for (i = 0; i < rp->maxactive; i++) {
- inst = kmalloc(sizeof(struct kretprobe_instance), GFP_KERNEL);
+ inst = kmalloc(sizeof(*inst) + rp->data_size, GFP_KERNEL);
if (inst == NULL) {
free_rp_inst(rp);
return -ENOMEM;
{
struct kprobe kp;
kretprobe_handler_t handler;
+ kretprobe_handler_t entry_handler;
void *priv_arg;
int maxactive;
int nmissed;
int disarm;
+ size_t data_size;
struct hlist_head free_instances;
struct hlist_head used_instances;
};
kprobe_opcode_t *ret_addr;
kprobe_opcode_t *sp;
struct task_struct *task;
+ char data[0];
};