From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753909AbbEDMve (ORCPT ); Mon, 4 May 2015 08:51:34 -0400 Received: from mx1.redhat.com ([209.132.183.28]:50266 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753788AbbEDMtg (ORCPT ); Mon, 4 May 2015 08:49:36 -0400 Date: Mon, 4 May 2015 14:49:10 +0200 From: Oleg Nesterov To: Ananth N Mavinakayanahalli , Anton Arapov , David Long , Denys Vlasenko , "Frank Ch. Eigler" , Ingo Molnar , Jan Willeke , Jim Keniston , Mark Wielaard , Pratyush Anand , Srikar Dronamraju Cc: linux-kernel@vger.kernel.org Subject: [PATCH 06/10] uprobes: Introduce struct arch_uretprobe Message-ID: <20150504124910.GA22505@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20150504124835.GA22462@redhat.com> User-Agent: Mutt/1.5.18 (2008-05-17) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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