From: Prasanna S Panchamukhi <prasanna@in.ibm.com>
To: systemtap@sources.redhat.com
Subject: Re: [5/5 PATCH] Kprobes fix for broken fault handling for sparc64
Date: Tue, 07 Mar 2006 13:41:00 -0000 [thread overview]
Message-ID: <20060307134259.GD32071@in.ibm.com> (raw)
In-Reply-To: <20060307134208.GC32071@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/sparc64/kernel/kprobes.c | 66 ++++++++++++++++++++++++++++++++++++++----
1 files changed, 60 insertions(+), 6 deletions(-)
diff -puN arch/sparc64/kernel/kprobes.c~kprobes-sparc64-pagefault-handling arch/sparc64/kernel/kprobes.c
--- linux-2.6.16-rc5-mm2/arch/sparc64/kernel/kprobes.c~kprobes-sparc64-pagefault-handling 2006-03-07 17:36:16.000000000 +0530
+++ linux-2.6.16-rc5-mm2-prasanna/arch/sparc64/kernel/kprobes.c 2006-03-07 17:38:01.000000000 +0530
@@ -6,9 +6,11 @@
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/kprobes.h>
+#include <linux/module.h>
#include <asm/kdebug.h>
#include <asm/signal.h>
#include <asm/cacheflush.h>
+#include <asm/uaccess.h>
/* We do not have hardware single-stepping on sparc64.
* So we implement software single-stepping with breakpoint
@@ -302,16 +304,68 @@ 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;
+ 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 tpc points back to the probe address
+ * and allow the page fault handler to continue as a
+ * normal page fault.
+ */
+ regs->tpc = (unsigned long) curr->addr;
+ regs->tnpc = kcb->kprobe_orig_tnpc;
+ regs->tstate = ((regs->tstate & ~TSTATE_PIL) |
+ kcb->kprobe_orig_tstate_pil);
+ 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);
- if (kcb->kprobe_status & KPROBE_HIT_SS) {
- resume_execution(cur, regs, kcb);
+ /*
+ * 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;
- reset_current_kprobe();
- preempt_enable_no_resched();
+ /*
+ * In case the user-specified fault handler returned
+ * zero, try to fix up.
+ */
+
+ entry = search_exception_tables(regs->tpc);
+ if (entry) {
+ regs->tpc = entry->fixup;
+ regs->tnpc = regs->tpc + 4;
+ 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:41 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 ` [3/5 PATCH] Kprobes fix for broken fault handling for ppc64 Prasanna S Panchamukhi
2006-03-07 13:40 ` [4/5 PATCH] Kprobes fix for broken fault handling for ia64 Prasanna S Panchamukhi
2006-03-07 13:41 ` Prasanna S Panchamukhi [this message]
2006-03-08 8:13 ` 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=20060307134259.GD32071@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).