This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
Re: [RFC -mm][PATCH 1/6] jprobe bugfix and cleanup
- From: Ananth N Mavinakayanahalli <ananth at in dot ibm dot com>
- To: Masami Hiramatsu <mhiramat at redhat dot com>
- Cc: Jim Keniston <jkenisto at us dot ibm dot com>, Roland McGrath <roland at redhat dot com>, Arjan van de Ven <arjan at infradead dot org>, prasanna at in dot ibm dot com, anil dot s dot keshavamurthy at intel dot com, davem at davemloft dot net, systemtap-ml <systemtap at sources dot redhat dot com>
- Date: Tue, 11 Dec 2007 15:57:10 +0530
- Subject: Re: [RFC -mm][PATCH 1/6] jprobe bugfix and cleanup
- References: <475DC34F.4070504@redhat.com>
- Reply-to: ananth at in dot ibm dot com
On Mon, Dec 10, 2007 at 05:53:03PM -0500, Masami Hiramatsu wrote:
> This patch fixes a bug of jprobe and cleans up.
> jprobe for x86-64 can cause kernel page fault when the jprobe_return()
> is called from incorrect function. Anyway, that path finally invokes
> BUG() macro, so this is not so serious.
>
> - Use jprobe_saved_regs instead getting it from stack.
> (Especially on x86-64, it may get incorrect data, because
> pt_regs can not be get by using container_of(rsp))
> - Change the type of stack pointer to unsigned long *.
>
> Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com>
Acked-by: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
> ---
> arch/x86/kernel/kprobes_32.c | 4 +---
> arch/x86/kernel/kprobes_64.c | 4 +---
> include/asm-x86/kprobes_32.h | 2 +-
> include/asm-x86/kprobes_64.h | 2 +-
> 4 files changed, 4 insertions(+), 8 deletions(-)
>
> Index: 2.6.24-rc4-mm1/arch/x86/kernel/kprobes_32.c
> ===================================================================
> --- 2.6.24-rc4-mm1.orig/arch/x86/kernel/kprobes_32.c
> +++ 2.6.24-rc4-mm1/arch/x86/kernel/kprobes_32.c
> @@ -742,9 +742,7 @@ int __kprobes longjmp_break_handler(stru
>
> if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
> if (®s->sp != kcb->jprobe_saved_esp) {
> - struct pt_regs *saved_regs =
> - container_of(kcb->jprobe_saved_esp,
> - struct pt_regs, sp);
> + struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
> printk("current sp %p does not match saved sp %p\n",
> ®s->sp, kcb->jprobe_saved_esp);
> printk("Saved registers for jprobe %p\n", jp);
> Index: 2.6.24-rc4-mm1/arch/x86/kernel/kprobes_64.c
> ===================================================================
> --- 2.6.24-rc4-mm1.orig/arch/x86/kernel/kprobes_64.c
> +++ 2.6.24-rc4-mm1/arch/x86/kernel/kprobes_64.c
> @@ -732,9 +732,7 @@ int __kprobes longjmp_break_handler(stru
>
> if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
> if ((long *)regs->sp != kcb->jprobe_saved_rsp) {
> - struct pt_regs *saved_regs =
> - container_of(kcb->jprobe_saved_rsp,
> - struct pt_regs, sp);
> + struct pt_regs *saved_regs = &kcb->jprobe_saved_regs;
> printk("current sp %p does not match saved sp %p\n",
> (long *)regs->sp, kcb->jprobe_saved_rsp);
> printk("Saved registers for jprobe %p\n", jp);
> Index: 2.6.24-rc4-mm1/include/asm-x86/kprobes_32.h
> ===================================================================
> --- 2.6.24-rc4-mm1.orig/include/asm-x86/kprobes_32.h
> +++ 2.6.24-rc4-mm1/include/asm-x86/kprobes_32.h
> @@ -73,7 +73,7 @@ struct kprobe_ctlblk {
> unsigned long kprobe_status;
> unsigned long kprobe_old_eflags;
> unsigned long kprobe_saved_eflags;
> - long *jprobe_saved_esp;
> + unsigned long *jprobe_saved_esp;
> struct pt_regs jprobe_saved_regs;
> kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE];
> struct prev_kprobe prev_kprobe;
> Index: 2.6.24-rc4-mm1/include/asm-x86/kprobes_64.h
> ===================================================================
> --- 2.6.24-rc4-mm1.orig/include/asm-x86/kprobes_64.h
> +++ 2.6.24-rc4-mm1/include/asm-x86/kprobes_64.h
> @@ -66,7 +66,7 @@ struct kprobe_ctlblk {
> unsigned long kprobe_status;
> unsigned long kprobe_old_rflags;
> unsigned long kprobe_saved_rflags;
> - long *jprobe_saved_rsp;
> + unsigned long *jprobe_saved_rsp;
> struct pt_regs jprobe_saved_regs;
> kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE];
> struct prev_kprobe prev_kprobe;
>
> --
> Masami Hiramatsu
>
> Software Engineer
> Hitachi Computer Products (America) Inc.
> Software Solutions Division
>
> e-mail: mhiramat@redhat.com, masami.hiramatsu.pt@hitachi.com