"Naveen N. Rao" <naveen.n....@linux.vnet.ibm.com> writes:

> diff --git a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S 
> b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> index fa0921410fa4..e6837e85ec28 100644
> --- a/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> +++ b/arch/powerpc/kernel/trace/ftrace_64_mprofile.S
> @@ -99,13 +99,37 @@ ftrace_call:
>       bl      ftrace_stub
>       nop
>  
> -     /* Load ctr with the possibly modified NIP */
> -     ld      r3, _NIP(r1)
> -     mtctr   r3
> +     /* Load the possibly modified NIP */
> +     ld      r15, _NIP(r1)
> +
>  #ifdef CONFIG_LIVEPATCH
> -     cmpd    r14,r3          /* has NIP been altered? */
> +     cmpd    r14, r15                /* has NIP been altered? */
> +#endif
> +
> +#if defined(CONFIG_LIVEPATCH) && defined(CONFIG_KPROBES_ON_FTRACE)
> +     beq     1f
> +
> +     /* Check if there is an active kprobe on us */
> +     subi    r3, r14, 4
> +     bl      is_current_kprobe_addr
> +     nop
> +
> +     /*
> +      * If r3 == 1, then this is a kprobe/jprobe.
> +      * else, this is livepatched function.
> +      *
> +      * The subsequent conditional branch for livepatch_handler
> +      * will use the result of this compare. For kprobe/jprobe,
> +      * we just need to branch to the new NIP, so nothing special
> +      * is needed.
> +      */
> +     cmpdi   r3, 1
> +1:
>  #endif

I added some more comments. Hopefully I got them right :D

 #if defined(CONFIG_LIVEPATCH) && defined(CONFIG_KPROBES_ON_FTRACE)
+       /* NIP has not been altered, skip over further checks */
        beq     1f
 
        /* Check if there is an active kprobe on us */
@@ -118,10 +119,11 @@ ftrace_call:
         * If r3 == 1, then this is a kprobe/jprobe.
         * else, this is livepatched function.
         *
-        * The subsequent conditional branch for livepatch_handler
-        * will use the result of this compare. For kprobe/jprobe,
-        * we just need to branch to the new NIP, so nothing special
-        * is needed.
+        * The conditional branch for livepatch_handler below will use the
+        * result of this comparison. For kprobe/jprobe, we just need to branch 
to
+        * the new NIP, not call livepatch_handler. The branch below is bne, so 
we
+        * want CR0[EQ] to be true if this is a kprobe/jprobe. Which means we 
want
+        * CR0[EQ] = (r3 == 1).
         */
        cmpdi   r3, 1
 1:
@@ -147,7 +149,10 @@ ftrace_call:
        addi r1, r1, SWITCH_FRAME_SIZE
 
 #ifdef CONFIG_LIVEPATCH
-        /* Based on the cmpd above, if the NIP was altered handle livepatch */
+        /*
+        * Based on the cmpd or cmpdi above, if the NIP was altered and we're
+        * not on a kprobe/jprobe, then handle livepatch.
+        */
        bne-    livepatch_handler
 #endif


cheers

Reply via email to