From: Prasanna S Panchamukhi <prasanna@in.ibm.com>
To: systemtap@sources.redhat.com
Subject: Re: [3/5 PATCH] Kprobes fix for broken fault handling for ppc64
Date: Tue, 07 Mar 2006 13:39:00 -0000 [thread overview]
Message-ID: <20060307134119.GB32071@in.ibm.com> (raw)
In-Reply-To: <20060307134010.GA32071@in.ibm.com>
This patch fixes the broken kprobes fault handling similar
to i386 architecture.
Signed-off-by: Prasanna S Panchamukhi <prasanna@in.ibm.com>
arch/powerpc/kernel/kprobes.c | 61 +++++++++++++++++++++++++++++++++++++-----
1 files changed, 54 insertions(+), 7 deletions(-)
diff -puN arch/powerpc/kernel/kprobes.c~kprobes-powerpc-pagefault-handling arch/powerpc/kernel/kprobes.c
--- linux-2.6.16-rc5-mm2/arch/powerpc/kernel/kprobes.c~kprobes-powerpc-pagefault-handling 2006-03-07 12:34:49.000000000 +0530
+++ linux-2.6.16-rc5-mm2-prasanna/arch/powerpc/kernel/kprobes.c 2006-03-07 12:34:49.000000000 +0530
@@ -30,9 +30,11 @@
#include <linux/kprobes.h>
#include <linux/ptrace.h>
#include <linux/preempt.h>
+#include <linux/module.h>
#include <asm/cacheflush.h>
#include <asm/kdebug.h>
#include <asm/sstep.h>
+#include <asm/uaccess.h>
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
@@ -372,17 +374,62 @@ static inline int kprobe_fault_handler(s
{
struct kprobe *cur = kprobe_running();
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
+ const struct exception_table_entry *entry;
- if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
- return 1;
-
- if (kcb->kprobe_status & KPROBE_HIT_SS) {
- resume_execution(cur, regs);
+ switch(kcb->kprobe_status) {
+ case KPROBE_HIT_SS:
+ case KPROBE_REENTER:
+ /*
+ * We are here because the instruction being single
+ * stepped caused a page fault. We reset the current
+ * kprobe and the nip points back to the probe address
+ * and allow the page fault handler to continue as a
+ * normal page fault.
+ */
+ regs->nip = (unsigned long)cur->addr;
regs->msr &= ~MSR_SE;
regs->msr |= kcb->kprobe_saved_msr;
-
- reset_current_kprobe();
+ if (kcb->kprobe_status == KPROBE_REENTER)
+ restore_previous_kprobe(kcb);
+ else
+ reset_current_kprobe();
preempt_enable_no_resched();
+ break;
+ case KPROBE_HIT_ACTIVE:
+ case KPROBE_HIT_SSDONE:
+ /*
+ * We increment the nmissed count for accounting,
+ * we can also use npre/npostfault count for accouting
+ * these specific fault cases.
+ */
+ kprobes_inc_nmissed_count(cur);
+
+ /*
+ * We come here because instructions in the pre/post
+ * handler caused the page_fault, this could happen
+ * if handler tries to access user space by
+ * copy_from_user(), get_user() etc. Let the
+ * user-specified handler try to fix it first.
+ */
+ if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
+ return 1;
+
+ /*
+ * In case the user-specified fault handler returned
+ * zero, try to fix up.
+ */
+ if ((entry = search_exception_tables(regs->nip)) != NULL) {
+ regs->nip = entry->fixup;
+ return 1;
+ }
+
+ /*
+ * fixup_exception() could not handle it,
+ * Let do_page_fault() fix it.
+ */
+ break;
+ default:
+ break;
}
return 0;
}
_
--
Prasanna S Panchamukhi
Linux Technology Center
India Software Labs, IBM Bangalore
Email: prasanna@in.ibm.com
Ph: 91-80-51776329
next prev parent reply other threads:[~2006-03-07 13:39 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-07 13:37 [1/5 PATCH] Kprobes fix for broken fault handling for i386 Prasanna S Panchamukhi
2006-03-07 13:40 ` [2/5 PATCH] Kprobes fix for broken fault handling for x86_64 Prasanna S Panchamukhi
2006-03-07 13:39 ` Prasanna S Panchamukhi [this message]
2006-03-07 13:40 ` [4/5 PATCH] Kprobes fix for broken fault handling for ia64 Prasanna S Panchamukhi
2006-03-07 13:41 ` [5/5 PATCH] Kprobes fix for broken fault handling for sparc64 Prasanna S Panchamukhi
2006-03-08 8:13 ` [4/5 PATCH] Kprobes fix for broken fault handling for ia64 bibo,mao
2006-03-08 11:17 ` Prasanna S Panchamukhi
2006-03-07 21:26 ` [1/5 PATCH] Kprobes fix for broken fault handling for i386 Keshavamurthy Anil S
2006-03-07 22:24 ` Hien Nguyen
2006-03-08 5:13 ` Prasanna S Panchamukhi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20060307134119.GB32071@in.ibm.com \
--to=prasanna@in.ibm.com \
--cc=systemtap@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).