This is the mail archive of the systemtap@sourceware.org mailing list for the systemtap project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [4/5 PATCH] Kprobes fix for broken fault handling for ia64


On Wed, Mar 08, 2006 at 04:05:27PM +0800, bibo,mao wrote:
> Prasanna S Panchamukhi wrote:
> >This patch fixes the broken kprobes fault handling similar
> >to i386 architecture.
> >
> >Signed-off-by: Prasanna S Panchamukhi <prasanna@in.ibm.com>
> >Acked-by: Anil S Keshavamurthy<anil.s.keshavamurthy@intel.com>
> >
> >
> > arch/ia64/kernel/kprobes.c |   55 
> > ++++++++++++++++++++++++++++++++++++++++-----
> > 1 files changed, 50 insertions(+), 5 deletions(-)
> >
> >diff -puN arch/ia64/kernel/kprobes.c~kprobes-ia64-pagefault-handling 
> >arch/ia64/kernel/kprobes.c
> >--- 
> >linux-2.6.16-rc5-mm2/arch/ia64/kernel/kprobes.c~kprobes-ia64-pagefault-handling	2006-03-07 11:18:46.000000000 +0530
> >+++ linux-2.6.16-rc5-mm2-prasanna/arch/ia64/kernel/kprobes.c	2006-03-07 
> >11:21:12.000000000 +0530
> >@@ -34,6 +34,7 @@
> > #include <asm/pgtable.h>
> > #include <asm/kdebug.h>
> > #include <asm/sections.h>
> >+#include <asm/uaccess.h>
> > 
> > extern void jprobe_inst_return(void);
> > 
> >@@ -722,13 +723,57 @@ static int __kprobes kprobes_fault_handl
> > 	struct kprobe *cur = kprobe_running();
> > 	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
> > 
> >-	if (cur->fault_handler && cur->fault_handler(cur, regs, trapnr))
> >-		return 1;
> > 
> >-	if (kcb->kprobe_status & KPROBE_HIT_SS) {
> >-		resume_execution(cur, regs);
> >-		reset_current_kprobe();
> >+	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 instruction pointer points back to
> >+		 * the probe address and allow the page fault handler
> >+		 * to continue as a normal page fault.
> >+		 */
> >+		regs->cr_iip = ((unsigned long)cur->addr) & ~0xFULL;
> >+		ia64_psr(regs) = ((unsigned long)cur->addr) & 0xf;
> It should be:
> 		regs->cr_iip = ((unsigned long)cur->addr) & ~0xFULL;
>                 ia64_psr(regs)->ri  = ((unsigned long)cur->addr) & 0xf;
> And I test this patch in IA64 platform, it passed. But find that 
> sometime user space copy is incomplete. If page fault happens in kprobe 
> prehandler/posthandler, if will first call fix_exception() and return, 
> Normally in page fault process procedure system will load page into 
> memory, and the system will call fix_exceptioin if failed to load page 
> into memory.

Bibo,

Thanks for testing this on ia64, I will make the changes before sending
it upstream.

Since the system page fault handler might sleep while 
loading the page into the memory and we cannot afford to
sleep at this point, we skip loading the page into the memory
and just call fixup_exception.

Thanks
Prasanna

> 
> The attachment is my test case in IA64, it is easy to port to other 
> platform.
> 
> Bibo,mao



-- 
Thanks & Regards
Prasanna S Panchamukhi
Linux Technology Center
India Software Labs, IBM Bangalore
Email: prasanna@in.ibm.com
Ph: 91-80-51776329


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]