Skip to content

Commit 48ede51

Browse files
committed
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 <[email protected]> Reported-by: Mao Han <[email protected]>
1 parent fdbdcdd commit 48ede51

File tree

2 files changed

+31
-21
lines changed

2 files changed

+31
-21
lines changed

arch/csky/kernel/entry.S

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@
1717
#define PTE_INDX_SHIFT 10
1818
#define _PGDIR_SHIFT 22
1919

20+
.macro zero_fp
21+
#ifdef CONFIG_STACKTRACE
22+
movi r8, 0
23+
#endif
24+
.endm
25+
2026
.macro tlbop_begin name, val0, val1, val2
2127
ENTRY(csky_\name)
2228
mtcr a3, ss2
@@ -96,6 +102,7 @@ ENTRY(csky_\name)
96102
SAVE_ALL 0
97103
.endm
98104
.macro tlbop_end is_write
105+
zero_fp
99106
RD_MEH a2
100107
psrset ee, ie
101108
mov a0, sp
@@ -120,6 +127,7 @@ tlbop_end 1
120127

121128
ENTRY(csky_systemcall)
122129
SAVE_ALL TRAP0_SIZE
130+
zero_fp
123131

124132
psrset ee, ie
125133

@@ -136,9 +144,9 @@ ENTRY(csky_systemcall)
136144
mov r9, sp
137145
bmaski r10, THREAD_SHIFT
138146
andn r9, r10
139-
ldw r8, (r9, TINFO_FLAGS)
140-
ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
141-
cmpnei r8, 0
147+
ldw r12, (r9, TINFO_FLAGS)
148+
ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
149+
cmpnei r12, 0
142150
bt csky_syscall_trace
143151
#if defined(__CSKYABIV2__)
144152
subi sp, 8
@@ -180,7 +188,7 @@ csky_syscall_trace:
180188

181189
ENTRY(ret_from_kernel_thread)
182190
jbsr schedule_tail
183-
mov a0, r8
191+
mov a0, r10
184192
jsr r9
185193
jbsr ret_from_exception
186194

@@ -189,9 +197,9 @@ ENTRY(ret_from_fork)
189197
mov r9, sp
190198
bmaski r10, THREAD_SHIFT
191199
andn r9, r10
192-
ldw r8, (r9, TINFO_FLAGS)
193-
ANDI_R3 r8, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
194-
cmpnei r8, 0
200+
ldw r12, (r9, TINFO_FLAGS)
201+
ANDI_R3 r12, (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
202+
cmpnei r12, 0
195203
bf ret_from_exception
196204
mov a0, sp /* sp = pt_regs pointer */
197205
jbsr syscall_trace_exit
@@ -209,9 +217,9 @@ ret_from_exception:
209217
bmaski r10, THREAD_SHIFT
210218
andn r9, r10
211219

212-
ldw r8, (r9, TINFO_FLAGS)
213-
andi r8, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
214-
cmpnei r8, 0
220+
ldw r12, (r9, TINFO_FLAGS)
221+
andi r12, (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED)
222+
cmpnei r12, 0
215223
bt exit_work
216224
1:
217225
RESTORE_ALL
@@ -220,18 +228,19 @@ exit_work:
220228
lrw syscallid, ret_from_exception
221229
mov lr, syscallid
222230

223-
btsti r8, TIF_NEED_RESCHED
231+
btsti r12, TIF_NEED_RESCHED
224232
bt work_resched
225233

226234
mov a0, sp
227-
mov a1, r8
235+
mov a1, r12
228236
jmpi do_notify_resume
229237

230238
work_resched:
231239
jmpi schedule
232240

233241
ENTRY(csky_trap)
234242
SAVE_ALL 0
243+
zero_fp
235244
psrset ee
236245
mov a0, sp /* Push Stack pointer arg */
237246
jbsr trap_c /* Call C-level trap handler */
@@ -265,6 +274,7 @@ ENTRY(csky_get_tls)
265274

266275
ENTRY(csky_irq)
267276
SAVE_ALL 0
277+
zero_fp
268278
psrset ee
269279

270280
#ifdef CONFIG_PREEMPT
@@ -276,21 +286,21 @@ ENTRY(csky_irq)
276286
* Get task_struct->stack.preempt_count for current,
277287
* and increase 1.
278288
*/
279-
ldw r8, (r9, TINFO_PREEMPT)
280-
addi r8, 1
281-
stw r8, (r9, TINFO_PREEMPT)
289+
ldw r12, (r9, TINFO_PREEMPT)
290+
addi r12, 1
291+
stw r12, (r9, TINFO_PREEMPT)
282292
#endif
283293

284294
mov a0, sp
285295
jbsr csky_do_IRQ
286296

287297
#ifdef CONFIG_PREEMPT
288-
subi r8, 1
289-
stw r8, (r9, TINFO_PREEMPT)
290-
cmpnei r8, 0
298+
subi r12, 1
299+
stw r12, (r9, TINFO_PREEMPT)
300+
cmpnei r12, 0
291301
bt 2f
292-
ldw r8, (r9, TINFO_FLAGS)
293-
btsti r8, TIF_NEED_RESCHED
302+
ldw r12, (r9, TINFO_FLAGS)
303+
btsti r12, TIF_NEED_RESCHED
294304
bf 2f
295305
1:
296306
jbsr preempt_schedule_irq /* irq en/disable is done inside */

arch/csky/kernel/process.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ int copy_thread(unsigned long clone_flags,
5555
if (unlikely(p->flags & PF_KTHREAD)) {
5656
memset(childregs, 0, sizeof(struct pt_regs));
5757
childstack->r15 = (unsigned long) ret_from_kernel_thread;
58-
childstack->r8 = kthread_arg;
58+
childstack->r10 = kthread_arg;
5959
childstack->r9 = usp;
6060
childregs->sr = mfcr("psr");
6161
} else {

0 commit comments

Comments
 (0)