Commit 48ede51f authored by Guo Ren's avatar Guo Ren

csky: Fixup add zero_fp fixup perf backtrace panic

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: default avatarGuo Ren <ren_guo@c-sky.com>
Reported-by: default avatarMao Han <han_mao@c-sky.com>
parent fdbdcddc
...@@ -17,6 +17,12 @@ ...@@ -17,6 +17,12 @@
#define PTE_INDX_SHIFT 10 #define PTE_INDX_SHIFT 10
#define _PGDIR_SHIFT 22 #define _PGDIR_SHIFT 22
.macro zero_fp
#ifdef CONFIG_STACKTRACE
movi r8, 0
#endif
.endm
.macro tlbop_begin name, val0, val1, val2 .macro tlbop_begin name, val0, val1, val2
ENTRY(csky_\name) ENTRY(csky_\name)
mtcr a3, ss2 mtcr a3, ss2
...@@ -96,6 +102,7 @@ ENTRY(csky_\name) ...@@ -96,6 +102,7 @@ ENTRY(csky_\name)
SAVE_ALL 0 SAVE_ALL 0
.endm .endm
.macro tlbop_end is_write .macro tlbop_end is_write
zero_fp
RD_MEH a2 RD_MEH a2
psrset ee, ie psrset ee, ie
mov a0, sp mov a0, sp
...@@ -120,6 +127,7 @@ tlbop_end 1 ...@@ -120,6 +127,7 @@ tlbop_end 1
ENTRY(csky_systemcall) ENTRY(csky_systemcall)
SAVE_ALL TRAP0_SIZE SAVE_ALL TRAP0_SIZE
zero_fp
psrset ee, ie psrset ee, ie
...@@ -136,9 +144,9 @@ ENTRY(csky_systemcall) ...@@ -136,9 +144,9 @@ ENTRY(csky_systemcall)
mov r9, sp mov r9, sp
bmaski r10, THREAD_SHIFT bmaski r10, THREAD_SHIFT
andn r9, r10 andn r9, r10
ldw r8, (r9, TINFO_FLAGS) ldw r12, (r9, TINFO_FLAGS)
ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT) ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
cmpnei r8, 0 cmpnei r12, 0
bt csky_syscall_trace bt csky_syscall_trace
#if defined(__CSKYABIV2__) #if defined(__CSKYABIV2__)
subi sp, 8 subi sp, 8
...@@ -180,7 +188,7 @@ csky_syscall_trace: ...@@ -180,7 +188,7 @@ csky_syscall_trace:
ENTRY(ret_from_kernel_thread) ENTRY(ret_from_kernel_thread)
jbsr schedule_tail jbsr schedule_tail
mov a0, r8 mov a0, r10
jsr r9 jsr r9
jbsr ret_from_exception jbsr ret_from_exception
...@@ -189,9 +197,9 @@ ENTRY(ret_from_fork) ...@@ -189,9 +197,9 @@ ENTRY(ret_from_fork)
mov r9, sp mov r9, sp
bmaski r10, THREAD_SHIFT bmaski r10, THREAD_SHIFT
andn r9, r10 andn r9, r10
ldw r8, (r9, TINFO_FLAGS) ldw r12, (r9, TINFO_FLAGS)
ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT) ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
cmpnei r8, 0 cmpnei r12, 0
bf ret_from_exception bf ret_from_exception
mov a0, sp /* sp = pt_regs pointer */ mov a0, sp /* sp = pt_regs pointer */
jbsr syscall_trace_exit jbsr syscall_trace_exit
...@@ -209,9 +217,9 @@ ret_from_exception: ...@@ -209,9 +217,9 @@ ret_from_exception:
bmaski r10, THREAD_SHIFT bmaski r10, THREAD_SHIFT
andn r9, r10 andn r9, r10
ldw r8, (r9, TINFO_FLAGS) ldw r12, (r9, TINFO_FLAGS)
andi r8, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED) andi r12, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
cmpnei r8, 0 cmpnei r12, 0
bt exit_work bt exit_work
1: 1:
RESTORE_ALL RESTORE_ALL
...@@ -220,11 +228,11 @@ exit_work: ...@@ -220,11 +228,11 @@ exit_work:
lrw syscallid, ret_from_exception lrw syscallid, ret_from_exception
mov lr, syscallid mov lr, syscallid
btsti r8, TIF_NEED_RESCHED btsti r12, TIF_NEED_RESCHED
bt work_resched bt work_resched
mov a0, sp mov a0, sp
mov a1, r8 mov a1, r12
jmpi do_notify_resume jmpi do_notify_resume
work_resched: work_resched:
...@@ -232,6 +240,7 @@ work_resched: ...@@ -232,6 +240,7 @@ work_resched:
ENTRY(csky_trap) ENTRY(csky_trap)
SAVE_ALL 0 SAVE_ALL 0
zero_fp
psrset ee psrset ee
mov a0, sp /* Push Stack pointer arg */ mov a0, sp /* Push Stack pointer arg */
jbsr trap_c /* Call C-level trap handler */ jbsr trap_c /* Call C-level trap handler */
...@@ -265,6 +274,7 @@ ENTRY(csky_get_tls) ...@@ -265,6 +274,7 @@ ENTRY(csky_get_tls)
ENTRY(csky_irq) ENTRY(csky_irq)
SAVE_ALL 0 SAVE_ALL 0
zero_fp
psrset ee psrset ee
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
...@@ -276,21 +286,21 @@ ENTRY(csky_irq) ...@@ -276,21 +286,21 @@ ENTRY(csky_irq)
* Get task_struct->stack.preempt_count for current, * Get task_struct->stack.preempt_count for current,
* and increase 1. * and increase 1.
*/ */
ldw r8, (r9, TINFO_PREEMPT) ldw r12, (r9, TINFO_PREEMPT)
addi r8, 1 addi r12, 1
stw r8, (r9, TINFO_PREEMPT) stw r12, (r9, TINFO_PREEMPT)
#endif #endif
mov a0, sp mov a0, sp
jbsr csky_do_IRQ jbsr csky_do_IRQ
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
subi r8, 1 subi r12, 1
stw r8, (r9, TINFO_PREEMPT) stw r12, (r9, TINFO_PREEMPT)
cmpnei r8, 0 cmpnei r12, 0
bt 2f bt 2f
ldw r8, (r9, TINFO_FLAGS) ldw r12, (r9, TINFO_FLAGS)
btsti r8, TIF_NEED_RESCHED btsti r12, TIF_NEED_RESCHED
bf 2f bf 2f
1: 1:
jbsr preempt_schedule_irq /* irq en/disable is done inside */ jbsr preempt_schedule_irq /* irq en/disable is done inside */
......
...@@ -55,7 +55,7 @@ int copy_thread(unsigned long clone_flags, ...@@ -55,7 +55,7 @@ int copy_thread(unsigned long clone_flags,
if (unlikely(p->flags & PF_KTHREAD)) { if (unlikely(p->flags & PF_KTHREAD)) {
memset(childregs, 0, sizeof(struct pt_regs)); memset(childregs, 0, sizeof(struct pt_regs));
childstack->r15 = (unsigned long) ret_from_kernel_thread; childstack->r15 = (unsigned long) ret_from_kernel_thread;
childstack->r8 = kthread_arg; childstack->r10 = kthread_arg;
childstack->r9 = usp; childstack->r9 = usp;
childregs->sr = mfcr("psr"); childregs->sr = mfcr("psr");
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment