]> err.no Git - linux-2.6/blobdiff - arch/powerpc/kernel/kprobes.c
[PATCH] kprobes: arch_remove_kprobe
[linux-2.6] / arch / powerpc / kernel / kprobes.c
index 511af54e6230ca13eeba65dd7765dcb9f7c8947c..93444e32fccd3ad93b049cc04163ac2cc58926d4 100644 (file)
@@ -35,7 +35,6 @@
 #include <asm/kdebug.h>
 #include <asm/sstep.h>
 
-static DECLARE_MUTEX(kprobe_mutex);
 DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
 DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
 
@@ -54,19 +53,17 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
 
        /* insn must be on a special executable page on ppc64 */
        if (!ret) {
-               down(&kprobe_mutex);
                p->ainsn.insn = get_insn_slot();
-               up(&kprobe_mutex);
                if (!p->ainsn.insn)
                        ret = -ENOMEM;
        }
-       return ret;
-}
 
-void __kprobes arch_copy_kprobe(struct kprobe *p)
-{
-       memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
-       p->opcode = *p->addr;
+       if (!ret) {
+               memcpy(p->ainsn.insn, p->addr, MAX_INSN_SIZE * sizeof(kprobe_opcode_t));
+               p->opcode = *p->addr;
+       }
+
+       return ret;
 }
 
 void __kprobes arch_arm_kprobe(struct kprobe *p)
@@ -83,11 +80,11 @@ void __kprobes arch_disarm_kprobe(struct kprobe *p)
                           (unsigned long) p->addr + sizeof(kprobe_opcode_t));
 }
 
-void __kprobes arch_remove_kprobe(struct kprobe *p)
+void __kprobes arch_remove_kprobe(struct kprobe *p, struct semaphore *s)
 {
-       down(&kprobe_mutex);
+       down(s);
        free_insn_slot(p->ainsn.insn);
-       up(&kprobe_mutex);
+       up(s);
 }
 
 static inline void prepare_singlestep(struct kprobe *p, struct pt_regs *regs)
@@ -177,7 +174,7 @@ static inline int kprobe_handler(struct pt_regs *regs)
                        save_previous_kprobe(kcb);
                        set_current_kprobe(p, regs, kcb);
                        kcb->kprobe_saved_msr = regs->msr;
-                       p->nmissed++;
+                       kprobes_inc_nmissed_count(p);
                        prepare_singlestep(p, regs);
                        kcb->kprobe_status = KPROBE_REENTER;
                        return 1;