From: Hien Nguyen 1. Undo kprobes-function-return-probes-fix-2.patch, and add the fix for cross compiling in include/linux/kprobes.h 2. Move the core of kprobe_flush_task function into arch specific. Signed-off-by: Hien Nguyen Signed-off-by: Andrew Morton --- arch/i386/kernel/kprobes.c | 13 +++++++++++++ include/linux/kprobes.h | 13 ++++++++++++- kernel/kprobes.c | 20 +------------------- 3 files changed, 26 insertions(+), 20 deletions(-) diff -puN arch/i386/kernel/kprobes.c~kprobes-function-return-probes-fix-3 arch/i386/kernel/kprobes.c --- 25/arch/i386/kernel/kprobes.c~kprobes-function-return-probes-fix-3 Tue May 10 16:12:45 2005 +++ 25-akpm/arch/i386/kernel/kprobes.c Tue May 10 16:12:45 2005 @@ -128,6 +128,19 @@ void arch_prepare_kretprobe(struct kretp } } +void arch_kprobe_flush_task(struct task_struct *tk, spinlock_t *kp_lock) +{ + unsigned long flags = 0; + struct kretprobe_instance *ri; + spin_lock_irqsave(kp_lock, flags); + while ((ri = get_rp_inst_tsk(tk)) != NULL) { + *((unsigned long *)(ri->stack_addr)) = + (unsigned long) ri->ret_addr; + recycle_rp_inst(ri); + } + spin_unlock_irqrestore(kp_lock, flags); +} + /* * Interrupts are disabled on entry as trap3 is an interrupt gate and they * remain disabled thorough out this function. diff -puN include/linux/kprobes.h~kprobes-function-return-probes-fix-3 include/linux/kprobes.h --- 25/include/linux/kprobes.h~kprobes-function-return-probes-fix-3 Tue May 10 16:12:45 2005 +++ 25-akpm/include/linux/kprobes.h Tue May 10 16:12:45 2005 @@ -37,6 +37,7 @@ struct kprobe; struct pt_regs; +struct kretprobe; struct kretprobe_instance; typedef int (*kprobe_pre_handler_t) (struct kprobe *, struct pt_regs *); typedef int (*kprobe_break_handler_t) (struct kprobe *, struct pt_regs *); @@ -97,6 +98,8 @@ extern int trampoline_probe_handler(stru extern void trampoline_post_handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags); extern struct task_struct *arch_get_kprobe_task(void *ptr); +extern void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs); +extern void arch_kprobe_flush_task(struct task_struct *tk, spinlock_t *kp_lock); #else #define arch_supports_kretprobes 0 static inline void kretprobe_trampoline(void) @@ -111,6 +114,14 @@ static inline void trampoline_post_handl struct pt_regs *regs, unsigned long flags) { } +static inline void arch_prepare_kretprobe(struct kretprobe *rp, + struct pt_regs *regs) +{ +} +static inline void arch_kprobe_flush_task(struct task_struct *tk, + spinlock_t *kp_lock) +{ +} #define arch_get_kprobe_task(ptr) ((struct task_struct *)NULL) #endif /* @@ -155,7 +166,6 @@ static inline int kprobe_running(void) extern int arch_prepare_kprobe(struct kprobe *p); extern void arch_copy_kprobe(struct kprobe *p); extern void arch_remove_kprobe(struct kprobe *p); -extern void arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs); extern void show_registers(struct pt_regs *regs); /* Get the kprobe at this addr (if any). Must have called lock_kprobes */ @@ -175,6 +185,7 @@ void unregister_kretprobe(struct kretpro struct kretprobe_instance *get_free_rp_inst(struct kretprobe *rp); struct kretprobe_instance *get_rp_inst(void *sara); +struct kretprobe_instance *get_rp_inst_tsk(struct task_struct *tk); void add_rp_inst(struct kretprobe_instance *ri); void kprobe_flush_task(struct task_struct *tk); void recycle_rp_inst(struct kretprobe_instance *ri); diff -puN kernel/kprobes.c~kprobes-function-return-probes-fix-3 kernel/kprobes.c --- 25/kernel/kprobes.c~kprobes-function-return-probes-fix-3 Tue May 10 16:12:45 2005 +++ 25-akpm/kernel/kprobes.c Tue May 10 16:12:45 2005 @@ -228,20 +228,7 @@ struct kretprobe_instance *get_rp_inst_t */ void kprobe_flush_task(struct task_struct *tk) { - unsigned long flags = 0; - struct kretprobe_instance *ri; - - if (!arch_supports_kretprobes) - return; - - spin_lock_irqsave(&kprobe_lock, flags); - while ((ri = get_rp_inst_tsk(tk)) != NULL) { - /* TODO: arch specific */ - *((unsigned long *)(ri->stack_addr)) = - (unsigned long) ri->ret_addr; - recycle_rp_inst(ri); - } - spin_unlock_irqrestore(&kprobe_lock, flags); + arch_kprobe_flush_task(tk, &kprobe_lock); } /* @@ -441,11 +428,6 @@ int register_kretprobe(struct kretprobe return ret; } -void __attribute__((weak)) -arch_prepare_kretprobe(struct kretprobe *rp, struct pt_regs *regs) -{ -} - void unregister_kretprobe(struct kretprobe *rp) { unsigned long flags; _