We can't emulate stwu since that may corrupt current exception stack.
So we will have to do real store operation in the exception return code.

Firstly we'll allocate a trampoline exception frame below the kprobed
function stack and copy the current exception frame to the trampoline.
Then we can do this real store operation to implement 'stwu', and reroute
the trampoline frame to r1 to complete this exception migration.

Signed-off-by: Tiejun Chen <tiejun.c...@windriver.com>
---
 arch/powerpc/kernel/entry_32.S |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S
index 56212bc..d56e311 100644
--- a/arch/powerpc/kernel/entry_32.S
+++ b/arch/powerpc/kernel/entry_32.S
@@ -1185,6 +1185,8 @@ recheck:
        bne-    do_resched
        andi.   r0,r9,_TIF_USER_WORK_MASK
        beq     restore_user
+       andis.  r0,r9,_TIF_DELAYED_KPROBE@h
+       bne-    restore_kprobe
 do_user_signal:                        /* r10 contains MSR_KERNEL here */
        ori     r10,r10,MSR_EE
        SYNC
@@ -1202,6 +1204,30 @@ do_user_signal:                  /* r10 contains 
MSR_KERNEL here */
        REST_NVGPRS(r1)
        b       recheck
 
+restore_kprobe:
+       lwz     r3,GPR1(r1)
+       subi    r3,r3,INT_FRAME_SIZE; /* Allocate a trampoline exception frame 
*/
+       mr      r4,r1
+       bl      copy_exc_stack  /* Copy from the original to the trampoline */
+
+       /* Do real stw operation to complete stwu */
+       mr      r4,r1
+       addi    r4,r4,INT_FRAME_SIZE    /* Get kprobed entry */
+       lwz     r5,GPR1(r1)             /* Backup r1 */
+       stw     r4,GPR1(r1)             /* Now store that safely */
+
+       /* Reroute the trampoline frame to r1 */
+       subi    r5,r5,INT_FRAME_SIZE
+       mr      r1,r5
+
+       /* Clear _TIF_DELAYED_KPROBE flag */
+       rlwinm  r9,r1,0,0,(31-THREAD_SHIFT)
+       lwz     r0,TI_FLAGS(r9)
+       rlwinm  r0,r0,0,_TIF_DELAYED_KPROBE
+       stw     r0,TI_FLAGS(r9)
+
+       b       restore
+
 /*
  * We come here when we are at the end of handling an exception
  * that occurred at a place where taking an exception will lose
-- 
1.5.6

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to