diff options
Diffstat (limited to 'arch/sparc/kernel/kprobes.c')
| -rw-r--r-- | arch/sparc/kernel/kprobes.c | 65 | 
1 files changed, 6 insertions, 59 deletions
diff --git a/arch/sparc/kernel/kprobes.c b/arch/sparc/kernel/kprobes.c index ab4ba4347941..dfbca2470536 100644 --- a/arch/sparc/kernel/kprobes.c +++ b/arch/sparc/kernel/kprobes.c @@ -147,18 +147,12 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)  			kcb->kprobe_status = KPROBE_REENTER;  			prepare_singlestep(p, regs, kcb);  			return 1; -		} else { -			if (*(u32 *)addr != BREAKPOINT_INSTRUCTION) { +		} else if (*(u32 *)addr != BREAKPOINT_INSTRUCTION) {  			/* The breakpoint instruction was removed by  			 * another cpu right after we hit, no further  			 * handling of this interrupt is appropriate  			 */ -				ret = 1; -				goto no_kprobe; -			} -			p = __this_cpu_read(current_kprobe); -			if (p->break_handler && p->break_handler(p, regs)) -				goto ss_probe; +			ret = 1;  		}  		goto no_kprobe;  	} @@ -181,10 +175,12 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)  	set_current_kprobe(p, regs, kcb);  	kcb->kprobe_status = KPROBE_HIT_ACTIVE; -	if (p->pre_handler && p->pre_handler(p, regs)) +	if (p->pre_handler && p->pre_handler(p, regs)) { +		reset_current_kprobe(); +		preempt_enable_no_resched();  		return 1; +	} -ss_probe:  	prepare_singlestep(p, regs, kcb);  	kcb->kprobe_status = KPROBE_HIT_SS;  	return 1; @@ -441,53 +437,6 @@ out:  	exception_exit(prev_state);  } -/* Jprobes support.  */ -int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) -{ -	struct jprobe *jp = container_of(p, struct jprobe, kp); -	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); - -	memcpy(&(kcb->jprobe_saved_regs), regs, sizeof(*regs)); - -	regs->tpc  = (unsigned long) jp->entry; -	regs->tnpc = ((unsigned long) jp->entry) + 0x4UL; -	regs->tstate |= TSTATE_PIL; - -	return 1; -} - -void __kprobes jprobe_return(void) -{ -	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); -	register unsigned long orig_fp asm("g1"); - -	orig_fp = kcb->jprobe_saved_regs.u_regs[UREG_FP]; -	__asm__ __volatile__("\n" -"1:	cmp		%%sp, %0\n\t" -	"blu,a,pt	%%xcc, 1b\n\t" -	" restore\n\t" -	".globl		jprobe_return_trap_instruction\n" -"jprobe_return_trap_instruction:\n\t" -	"ta		0x70" -	: /* no outputs */ -	: "r" (orig_fp)); -} - -extern void jprobe_return_trap_instruction(void); - -int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) -{ -	u32 *addr = (u32 *) regs->tpc; -	struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); - -	if (addr == (u32 *) jprobe_return_trap_instruction) { -		memcpy(regs, &(kcb->jprobe_saved_regs), sizeof(*regs)); -		preempt_enable_no_resched(); -		return 1; -	} -	return 0; -} -  /* The value stored in the return address register is actually 2   * instructions before where the callee will return to.   * Sequences usually look something like this @@ -562,9 +511,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,  	regs->tpc = orig_ret_address;  	regs->tnpc = orig_ret_address + 4; -	reset_current_kprobe();  	kretprobe_hash_unlock(current, &flags); -	preempt_enable_no_resched();  	hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {  		hlist_del(&ri->hlist);  | 
