Introduce the empty "struct arch_uretprobe", add the new member
of this type into "struct return_instance" and pass it as the new
argument to arch_uretprobe_hijack_return_addr().

Signed-off-by: Oleg Nesterov <[email protected]>
---
 arch/arm/include/asm/uprobes.h     |    3 +++
 arch/arm/probes/uprobes/core.c     |    3 ++-
 arch/powerpc/include/asm/uprobes.h |    3 +++
 arch/powerpc/kernel/uprobes.c      |    3 ++-
 arch/s390/include/asm/uprobes.h    |    3 +++
 arch/s390/kernel/uprobes.c         |    3 ++-
 arch/x86/include/asm/uprobes.h     |    3 +++
 arch/x86/kernel/uprobes.c          |    3 ++-
 include/linux/uprobes.h            |    3 ++-
 kernel/events/uprobes.c            |    6 ++++--
 10 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/arch/arm/include/asm/uprobes.h b/arch/arm/include/asm/uprobes.h
index 9472c20..dec6313 100644
--- a/arch/arm/include/asm/uprobes.h
+++ b/arch/arm/include/asm/uprobes.h
@@ -27,6 +27,9 @@ struct arch_uprobe_task {
        unsigned long   saved_trap_no;
 };
 
+struct arch_uretprobe {
+};
+
 struct arch_uprobe {
        u8 insn[MAX_UINSN_BYTES];
        unsigned long ixol[2];
diff --git a/arch/arm/probes/uprobes/core.c b/arch/arm/probes/uprobes/core.c
index d1329f1..2787490 100644
--- a/arch/arm/probes/uprobes/core.c
+++ b/arch/arm/probes/uprobes/core.c
@@ -61,7 +61,8 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
 }
 
 unsigned long
-arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr,
+arch_uretprobe_hijack_return_addr(struct arch_uretprobe *auret,
+                                 unsigned long trampoline_vaddr,
                                  struct pt_regs *regs)
 {
        unsigned long orig_ret_vaddr;
diff --git a/arch/powerpc/include/asm/uprobes.h 
b/arch/powerpc/include/asm/uprobes.h
index 7422a99..82ecba9 100644
--- a/arch/powerpc/include/asm/uprobes.h
+++ b/arch/powerpc/include/asm/uprobes.h
@@ -41,6 +41,9 @@ struct arch_uprobe {
        };
 };
 
+struct arch_uretprobe {
+};
+
 struct arch_uprobe_task {
        unsigned long   saved_trap_nr;
 };
diff --git a/arch/powerpc/kernel/uprobes.c b/arch/powerpc/kernel/uprobes.c
index 003b209..70e3a31 100644
--- a/arch/powerpc/kernel/uprobes.c
+++ b/arch/powerpc/kernel/uprobes.c
@@ -194,7 +194,8 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
 }
 
 unsigned long
-arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct 
pt_regs *regs)
+arch_uretprobe_hijack_return_addr(struct arch_uretprobe *auret,
+                               unsigned long trampoline_vaddr, struct pt_regs 
*regs)
 {
        unsigned long orig_ret_vaddr;
 
diff --git a/arch/s390/include/asm/uprobes.h b/arch/s390/include/asm/uprobes.h
index 1411dff..a59c10f 100644
--- a/arch/s390/include/asm/uprobes.h
+++ b/arch/s390/include/asm/uprobes.h
@@ -26,6 +26,9 @@ struct arch_uprobe {
        unsigned int saved_int_code;
 };
 
+struct arch_uretprobe {
+};
+
 struct arch_uprobe_task {
 };
 
diff --git a/arch/s390/kernel/uprobes.c b/arch/s390/kernel/uprobes.c
index cc73280..dc03d3c 100644
--- a/arch/s390/kernel/uprobes.c
+++ b/arch/s390/kernel/uprobes.c
@@ -137,7 +137,8 @@ void arch_uprobe_abort_xol(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
        current->thread.per_event.address = current->utask->vaddr;
 }
 
-unsigned long arch_uretprobe_hijack_return_addr(unsigned long trampoline,
+unsigned long arch_uretprobe_hijack_return_addr(struct arch_uretprobe *auret,
+                                               unsigned long trampoline,
                                                struct pt_regs *regs)
 {
        unsigned long orig;
diff --git a/arch/x86/include/asm/uprobes.h b/arch/x86/include/asm/uprobes.h
index 74f4c2f..f011fd0 100644
--- a/arch/x86/include/asm/uprobes.h
+++ b/arch/x86/include/asm/uprobes.h
@@ -56,6 +56,9 @@ struct arch_uprobe {
        };
 };
 
+struct arch_uretprobe {
+};
+
 struct arch_uprobe_task {
 #ifdef CONFIG_X86_64
        unsigned long                   saved_scratch_register;
diff --git a/arch/x86/kernel/uprobes.c b/arch/x86/kernel/uprobes.c
index 8b96a94..0270315 100644
--- a/arch/x86/kernel/uprobes.c
+++ b/arch/x86/kernel/uprobes.c
@@ -901,7 +901,8 @@ bool arch_uprobe_skip_sstep(struct arch_uprobe *auprobe, 
struct pt_regs *regs)
 }
 
 unsigned long
-arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct 
pt_regs *regs)
+arch_uretprobe_hijack_return_addr(struct arch_uretprobe *auret,
+                               unsigned long trampoline_vaddr, struct pt_regs 
*regs)
 {
        int rasize = sizeof_long(), nleft;
        unsigned long orig_ret_vaddr = 0; /* clear high bits for 32-bit apps */
diff --git a/include/linux/uprobes.h b/include/linux/uprobes.h
index 60beb5d..144571b 100644
--- a/include/linux/uprobes.h
+++ b/include/linux/uprobes.h
@@ -127,7 +127,8 @@ extern int  arch_uprobe_post_xol(struct arch_uprobe *aup, 
struct pt_regs *regs);
 extern bool arch_uprobe_xol_was_trapped(struct task_struct *tsk);
 extern int  arch_uprobe_exception_notify(struct notifier_block *self, unsigned 
long val, void *data);
 extern void arch_uprobe_abort_xol(struct arch_uprobe *aup, struct pt_regs 
*regs);
-extern unsigned long arch_uretprobe_hijack_return_addr(unsigned long 
trampoline_vaddr, struct pt_regs *regs);
+extern unsigned long arch_uretprobe_hijack_return_addr(struct arch_uretprobe 
*auret,
+                                       unsigned long trampoline_vaddr, struct 
pt_regs *regs);
 extern bool arch_uprobe_ignore(struct arch_uprobe *aup, struct pt_regs *regs);
 extern void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
                                         void *src, unsigned long len);
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index 12245ad..19af44a 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -90,9 +90,11 @@ struct return_instance {
        struct uprobe           *uprobe;
        unsigned long           func;
        unsigned long           orig_ret_vaddr; /* original return address */
-       bool                    chained;        /* true, if instance is nested 
*/
 
+       bool                    chained;        /* true, if instance is nested 
*/
        struct return_instance  *next;          /* keep as stack */
+
+       struct arch_uretprobe   auret;
 };
 
 /*
@@ -1546,7 +1548,7 @@ static void prepare_uretprobe(struct uprobe *uprobe, 
struct pt_regs *regs)
                return;
 
        trampoline_vaddr = get_trampoline_vaddr();
-       orig_ret_vaddr = arch_uretprobe_hijack_return_addr(trampoline_vaddr, 
regs);
+       orig_ret_vaddr = arch_uretprobe_hijack_return_addr(&ri->auret, 
trampoline_vaddr, regs);
        if (orig_ret_vaddr == -1)
                goto fail;
 
-- 
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to