powerpc/kprobes: Factor out code to emulate instruction into a helper
authorNaveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Wed, 19 Apr 2017 12:51:04 +0000 (18:21 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 20 Apr 2017 13:18:56 +0000 (23:18 +1000)
Factor out code to emulate instruction into a try_to_emulate()
helper function. This makes no functional changes.

Acked-by: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/kprobes.c

index 97b5eed1f76df1ec9447766a8ada1f9df62a748b..ed5a917c2edd6d535414842a193a733990c57dc4 100644 (file)
@@ -207,6 +207,35 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
        regs->link = (unsigned long)kretprobe_trampoline;
 }
 
+int __kprobes try_to_emulate(struct kprobe *p, struct pt_regs *regs)
+{
+       int ret;
+       unsigned int insn = *p->ainsn.insn;
+
+       /* regs->nip is also adjusted if emulate_step returns 1 */
+       ret = emulate_step(regs, insn);
+       if (ret > 0) {
+               /*
+                * Once this instruction has been boosted
+                * successfully, set the boostable flag
+                */
+               if (unlikely(p->ainsn.boostable == 0))
+                       p->ainsn.boostable = 1;
+       } else if (ret < 0) {
+               /*
+                * We don't allow kprobes on mtmsr(d)/rfi(d), etc.
+                * So, we should never get here... but, its still
+                * good to catch them, just in case...
+                */
+               printk("Can't step on instruction %x\n", insn);
+               BUG();
+       } else if (ret == 0)
+               /* This instruction can't be boosted */
+               p->ainsn.boostable = -1;
+
+       return ret;
+}
+
 int __kprobes kprobe_handler(struct pt_regs *regs)
 {
        struct kprobe *p;
@@ -302,18 +331,9 @@ int __kprobes kprobe_handler(struct pt_regs *regs)
 
 ss_probe:
        if (p->ainsn.boostable >= 0) {
-               unsigned int insn = *p->ainsn.insn;
+               ret = try_to_emulate(p, regs);
 
-               /* regs->nip is also adjusted if emulate_step returns 1 */
-               ret = emulate_step(regs, insn);
                if (ret > 0) {
-                       /*
-                        * Once this instruction has been boosted
-                        * successfully, set the boostable flag
-                        */
-                       if (unlikely(p->ainsn.boostable == 0))
-                               p->ainsn.boostable = 1;
-
                        if (p->post_handler)
                                p->post_handler(p, regs, 0);
 
@@ -321,17 +341,7 @@ ss_probe:
                        reset_current_kprobe();
                        preempt_enable_no_resched();
                        return 1;
-               } else if (ret < 0) {
-                       /*
-                        * We don't allow kprobes on mtmsr(d)/rfi(d), etc.
-                        * So, we should never get here... but, its still
-                        * good to catch them, just in case...
-                        */
-                       printk("Can't step on instruction %x\n", insn);
-                       BUG();
-               } else if (ret == 0)
-                       /* This instruction can't be boosted */
-                       p->ainsn.boostable = -1;
+               }
        }
        prepare_singlestep(p, regs);
        kcb->kprobe_status = KPROBE_HIT_SS;