[FIX] unexpected undefined instruction after disarm kprobe 08/54708/2
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 16 Dec 2015 15:03:39 +0000 (18:03 +0300)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Fri, 18 Dec 2015 12:43:12 +0000 (04:43 -0800)
After disarm kprobe there is race condition in kernel within undefined
instruction handler (between undefined instruction firing and seaching for
hooks).

Now kprobe register undef hook on all instruction and skip 'false exeption'.

Change-Id: I972082ca5b94506e59306b9fe5834fccf883f83b
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
kprobe/arch/arm/swap-asm/swap_kprobes.c

index b76aba5..32f3d69 100644 (file)
@@ -460,7 +460,16 @@ int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
 
        local_irq_save(flags);
        preempt_disable();
-       ret = kprobe_handler(regs);
+
+       if (likely(instr == BREAKPOINT_INSTRUCTION)) {
+               ret = kprobe_handler(regs);
+       } else {
+               struct kprobe *p = swap_get_kprobe((void *)regs->ARM_pc);
+
+               /* skip false exeption */
+               ret = p && (p->opcode == instr) ? 0 : 1;
+       }
+
        swap_preempt_enable_no_resched();
        local_irq_restore(flags);
 
@@ -852,8 +861,8 @@ EXPORT_SYMBOL_GPL(swap_unregister_undef_hook);
 
 /* kernel probes hook */
 static struct undef_hook undef_ho_k = {
-       .instr_mask     = 0xffffffff,
-       .instr_val      = BREAKPOINT_INSTRUCTION,
+       .instr_mask     = 0,
+       .instr_val      = 0,
        .cpsr_mask      = MODE_MASK,
        .cpsr_val       = SVC_MODE,
        .fn             = kprobe_trap_handler