
From: Hien Nguyen <hien@us.ibm.com>

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 <hien@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
---

 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;
_
