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: Guo Ren <ren_guo@c-sky.com> Reported-by: Mao Han <han_mao@c-sky.com>
This commit is contained in:
parent
fdbdcddc2c
commit
48ede51fd9
|
@ -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)
|
||||||
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
|
||||||
|
|
||||||
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)
|
||||||
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:
|
||||||
|
|
||||||
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)
|
||||||
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:
|
||||||
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:
|
||||||
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:
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
* 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,
|
||||||
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 {
|
||||||
|
|
Loading…
Reference in New Issue