All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/4] x86: fix jprobe_saved_sp handling
@ 2007-12-17 21:26 Harvey Harrison
  0 siblings, 0 replies; only message in thread
From: Harvey Harrison @ 2007-12-17 21:26 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: Ananth N Mavinakayanahalli, Jim Keniston, Roland McGrath,
	Arjan van de Ven, prasanna, anil.s.keshavamurthy, davem,
	systemtap-ml, LKML, Andrew Morton

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.

Based on patch from Masami Hiramatsu <mhiramat@redhat.com>

- 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: Harvey Harrison <harvey.harrison@gmail.com>
---
 arch/x86/kernel/kprobes.c |    8 ++------
 include/asm-x86/kprobes.h |    2 +-
 2 files changed, 3 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kernel/kprobes.c b/arch/x86/kernel/kprobes.c
index e5b7d07..9130c01 100644
--- a/arch/x86/kernel/kprobes.c
+++ b/arch/x86/kernel/kprobes.c
@@ -1022,16 +1022,12 @@ int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
 	if ((addr > (u8 *) jprobe_return) && (addr < (u8 *) jprobe_return_end)) {
 #ifdef CONFIG_X86_32
 		if (&regs->sp != kcb->jprobe_saved_sp) {
-			struct pt_regs *saved_regs =
-			    container_of(kcb->jprobe_saved_sp,
-					    struct pt_regs, sp);
+			struct pt_regs *saved_regs = &kcb->jprobe_saved_sp;
 			printk("current sp %p does not match saved sp %p\n",
 			       &regs->sp, kcb->jprobe_saved_sp);
 #else
 		if ((long *)regs->sp != kcb->jprobe_saved_sp) {
-			struct pt_regs *saved_regs =
-			    container_of(kcb->jprobe_saved_sp,
-					    struct pt_regs, sp);
+			struct pt_regs *saved_regs = &kcb->jprobe_saved_sp;
 			printk("current sp %p does not match saved sp %p\n",
 			       (long *)regs->sp, kcb->jprobe_saved_sp);
 #endif
diff --git a/include/asm-x86/kprobes.h b/include/asm-x86/kprobes.h
index e348ed6..7319c62 100644
--- a/include/asm-x86/kprobes.h
+++ b/include/asm-x86/kprobes.h
@@ -79,7 +79,7 @@ struct kprobe_ctlblk {
 	unsigned long kprobe_status;
 	unsigned long kprobe_old_flags;
 	unsigned long kprobe_saved_flags;
-	long *jprobe_saved_sp;
+	unsigned long *jprobe_saved_sp;
 	struct pt_regs jprobe_saved_regs;
 	kprobe_opcode_t jprobes_stack[MAX_STACK_SIZE];
 	struct prev_kprobe prev_kprobe;
-- 
1.5.4.rc0.1083.gf568



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2007-12-17 21:27 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-12-17 21:26 [PATCH 1/4] x86: fix jprobe_saved_sp handling Harvey Harrison

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.