diff options
Diffstat (limited to 'arch/sparc/kernel/kprobes.c')
| -rw-r--r-- | arch/sparc/kernel/kprobes.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/arch/sparc/kernel/kprobes.c b/arch/sparc/kernel/kprobes.c index a39d1ba5a11..98d71284341 100644 --- a/arch/sparc/kernel/kprobes.c +++ b/arch/sparc/kernel/kprobes.c @@ -8,6 +8,7 @@  #include <linux/module.h>  #include <linux/kdebug.h>  #include <linux/slab.h> +#include <linux/context_tracking.h>  #include <asm/signal.h>  #include <asm/cacheflush.h>  #include <asm/uaccess.h> @@ -349,7 +350,7 @@ int __kprobes kprobe_fault_handler(struct pt_regs *regs, int trapnr)  	case KPROBE_HIT_SSDONE:  		/*  		 * We increment the nmissed count for accounting, -		 * we can also use npre/npostfault count for accouting +		 * we can also use npre/npostfault count for accounting  		 * these specific fault cases.  		 */  		kprobes_inc_nmissed_count(cur); @@ -418,12 +419,14 @@ int __kprobes kprobe_exceptions_notify(struct notifier_block *self,  asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,  				      struct pt_regs *regs)  { +	enum ctx_state prev_state = exception_enter(); +  	BUG_ON(trap_level != 0x170 && trap_level != 0x171);  	if (user_mode(regs)) {  		local_irq_enable();  		bad_trap(regs, trap_level); -		return; +		goto out;  	}  	/* trap_level == 0x170 --> ta 0x70 @@ -433,6 +436,8 @@ asmlinkage void __kprobes kprobe_trap(unsigned long trap_level,  		       (trap_level == 0x170) ? "debug" : "debug_2",  		       regs, 0, trap_level, SIGTRAP) != NOTIFY_STOP)  		bad_trap(regs, trap_level); +out: +	exception_exit(prev_state);  }  /* Jprobes support.  */ @@ -507,11 +512,12 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,  /*   * Called when the probe at kretprobe trampoline is hit   */ -int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) +static int __kprobes trampoline_probe_handler(struct kprobe *p, +					      struct pt_regs *regs)  {  	struct kretprobe_instance *ri = NULL;  	struct hlist_head *head, empty_rp; -	struct hlist_node *node, *tmp; +	struct hlist_node *tmp;  	unsigned long flags, orig_ret_address = 0;  	unsigned long trampoline_address =(unsigned long)&kretprobe_trampoline; @@ -531,7 +537,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	 *       real return address, and all the rest will point to  	 *       kretprobe_trampoline  	 */ -	hlist_for_each_entry_safe(ri, node, tmp, head, hlist) { +	hlist_for_each_entry_safe(ri, tmp, head, hlist) {  		if (ri->task != current)  			/* another task is sharing our hash bucket */  			continue; @@ -559,7 +565,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	kretprobe_hash_unlock(current, &flags);  	preempt_enable_no_resched(); -	hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) { +	hlist_for_each_entry_safe(ri, tmp, &empty_rp, hlist) {  		hlist_del(&ri->hlist);  		kfree(ri);  	} @@ -571,7 +577,7 @@ int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)  	return 1;  } -void kretprobe_trampoline_holder(void) +static void __used kretprobe_trampoline_holder(void)  {  	asm volatile(".global kretprobe_trampoline\n"  		     "kretprobe_trampoline:\n"  | 
