csky: Fixup add zero_fp fixup perf backtrace panic
authorGuo Ren <ren_guo@c-sky.com>
Wed, 25 Sep 2019 11:56:16 +0000 (19:56 +0800)
committerGuo Ren <ren_guo@c-sky.com>
Mon, 30 Sep 2019 02:26:32 +0000 (10:26 +0800)
We need set fp zero to let backtrace know the end. The patch fixup perf
callchain panic problem, because backtrace didn't know what is the end
of fp.

Signed-off-by: Guo Ren <ren_guo@c-sky.com>
Reported-by: Mao Han <han_mao@c-sky.com>
arch/csky/kernel/entry.S
arch/csky/kernel/process.c

index a7e84ccccbd8ee47ff0cdba63b4f5a6f4c647fed..564dab2fabaa400bcbe759d5127178856349095a 100644 (file)
 #define PTE_INDX_SHIFT  10
 #define _PGDIR_SHIFT    22
 
 #define PTE_INDX_SHIFT  10
 #define _PGDIR_SHIFT    22
 
+.macro zero_fp
+#ifdef CONFIG_STACKTRACE
+       movi    r8, 0
+#endif
+.endm
+
 .macro tlbop_begin name, val0, val1, val2
 ENTRY(csky_\name)
        mtcr    a3, ss2
 .macro tlbop_begin name, val0, val1, val2
 ENTRY(csky_\name)
        mtcr    a3, ss2
@@ -96,6 +102,7 @@ ENTRY(csky_\name)
        SAVE_ALL 0
 .endm
 .macro tlbop_end is_write
        SAVE_ALL 0
 .endm
 .macro tlbop_end is_write
+       zero_fp
        RD_MEH  a2
        psrset  ee, ie
        mov     a0, sp
        RD_MEH  a2
        psrset  ee, ie
        mov     a0, sp
@@ -120,6 +127,7 @@ tlbop_end 1
 
 ENTRY(csky_systemcall)
        SAVE_ALL TRAP0_SIZE
 
 ENTRY(csky_systemcall)
        SAVE_ALL TRAP0_SIZE
+       zero_fp
 
        psrset  ee, ie
 
 
        psrset  ee, ie
 
@@ -136,9 +144,9 @@ ENTRY(csky_systemcall)
        mov     r9, sp
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
        mov     r9, sp
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
-       ldw     r8, (r9, TINFO_FLAGS)
-       ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
-       cmpnei  r8, 0
+       ldw     r12, (r9, TINFO_FLAGS)
+       ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
+       cmpnei  r12, 0
        bt      csky_syscall_trace
 #if defined(__CSKYABIV2__)
        subi    sp, 8
        bt      csky_syscall_trace
 #if defined(__CSKYABIV2__)
        subi    sp, 8
@@ -180,7 +188,7 @@ csky_syscall_trace:
 
 ENTRY(ret_from_kernel_thread)
        jbsr    schedule_tail
 
 ENTRY(ret_from_kernel_thread)
        jbsr    schedule_tail
-       mov     a0, r8
+       mov     a0, r10
        jsr     r9
        jbsr    ret_from_exception
 
        jsr     r9
        jbsr    ret_from_exception
 
@@ -189,9 +197,9 @@ ENTRY(ret_from_fork)
        mov     r9, sp
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
        mov     r9, sp
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
-       ldw     r8, (r9, TINFO_FLAGS)
-       ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
-       cmpnei  r8, 0
+       ldw     r12, (r9, TINFO_FLAGS)
+       ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
+       cmpnei  r12, 0
        bf      ret_from_exception
        mov     a0, sp                  /* sp = pt_regs pointer */
        jbsr    syscall_trace_exit
        bf      ret_from_exception
        mov     a0, sp                  /* sp = pt_regs pointer */
        jbsr    syscall_trace_exit
@@ -209,9 +217,9 @@ ret_from_exception:
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
 
        bmaski  r10, THREAD_SHIFT
        andn    r9, r10
 
-       ldw     r8, (r9, TINFO_FLAGS)
-       andi    r8, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
-       cmpnei  r8, 0
+       ldw     r12, (r9, TINFO_FLAGS)
+       andi    r12, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
+       cmpnei  r12, 0
        bt      exit_work
 1:
        RESTORE_ALL
        bt      exit_work
 1:
        RESTORE_ALL
@@ -220,11 +228,11 @@ exit_work:
        lrw     syscallid, ret_from_exception
        mov     lr, syscallid
 
        lrw     syscallid, ret_from_exception
        mov     lr, syscallid
 
-       btsti   r8, TIF_NEED_RESCHED
+       btsti   r12, TIF_NEED_RESCHED
        bt      work_resched
 
        mov     a0, sp
        bt      work_resched
 
        mov     a0, sp
-       mov     a1, r8
+       mov     a1, r12
        jmpi    do_notify_resume
 
 work_resched:
        jmpi    do_notify_resume
 
 work_resched:
@@ -232,6 +240,7 @@ work_resched:
 
 ENTRY(csky_trap)
        SAVE_ALL 0
 
 ENTRY(csky_trap)
        SAVE_ALL 0
+       zero_fp
        psrset  ee
        mov     a0, sp                 /* Push Stack pointer arg */
        jbsr    trap_c                 /* Call C-level trap handler */
        psrset  ee
        mov     a0, sp                 /* Push Stack pointer arg */
        jbsr    trap_c                 /* Call C-level trap handler */
@@ -265,6 +274,7 @@ ENTRY(csky_get_tls)
 
 ENTRY(csky_irq)
        SAVE_ALL 0
 
 ENTRY(csky_irq)
        SAVE_ALL 0
+       zero_fp
        psrset  ee
 
 #ifdef CONFIG_PREEMPT
        psrset  ee
 
 #ifdef CONFIG_PREEMPT
@@ -276,21 +286,21 @@ ENTRY(csky_irq)
         * Get task_struct->stack.preempt_count for current,
         * and increase 1.
         */
         * Get task_struct->stack.preempt_count for current,
         * and increase 1.
         */
-       ldw     r8, (r9, TINFO_PREEMPT)
-       addi    r8, 1
-       stw     r8, (r9, TINFO_PREEMPT)
+       ldw     r12, (r9, TINFO_PREEMPT)
+       addi    r12, 1
+       stw     r12, (r9, TINFO_PREEMPT)
 #endif
 
        mov     a0, sp
        jbsr    csky_do_IRQ
 
 #ifdef CONFIG_PREEMPT
 #endif
 
        mov     a0, sp
        jbsr    csky_do_IRQ
 
 #ifdef CONFIG_PREEMPT
-       subi    r8, 1
-       stw     r8, (r9, TINFO_PREEMPT)
-       cmpnei  r8, 0
+       subi    r12, 1
+       stw     r12, (r9, TINFO_PREEMPT)
+       cmpnei  r12, 0
        bt      2f
        bt      2f
-       ldw     r8, (r9, TINFO_FLAGS)
-       btsti   r8, TIF_NEED_RESCHED
+       ldw     r12, (r9, TINFO_FLAGS)
+       btsti   r12, TIF_NEED_RESCHED
        bf      2f
 1:
        jbsr    preempt_schedule_irq    /* irq en/disable is done inside */
        bf      2f
 1:
        jbsr    preempt_schedule_irq    /* irq en/disable is done inside */
index e555740c0be5768d001c81fe8ff91e98e71e0e4b..f320d9248a225fe31941129ccd2b4225c47f36d1 100644 (file)
@@ -55,7 +55,7 @@ int copy_thread(unsigned long clone_flags,
        if (unlikely(p->flags & PF_KTHREAD)) {
                memset(childregs, 0, sizeof(struct pt_regs));
                childstack->r15 = (unsigned long) ret_from_kernel_thread;
        if (unlikely(p->flags & PF_KTHREAD)) {
                memset(childregs, 0, sizeof(struct pt_regs));
                childstack->r15 = (unsigned long) ret_from_kernel_thread;
-               childstack->r8 = kthread_arg;
+               childstack->r10 = kthread_arg;
                childstack->r9 = usp;
                childregs->sr = mfcr("psr");
        } else {
                childstack->r9 = usp;
                childregs->sr = mfcr("psr");
        } else {