sh: resume_kernel fix for kernel oops built with CONFIG_BKL_PREEMPT=y.
This patch fixes a problem within the SH implementation of resume_kernel code, that implements in assembly the bulk of preempt_schedule_irq function without taking care of the extra code needed to handle the BKL preemptible. The patch basically consists of removing this asm code and calling the common C implementation (see kernel/sched.c) as other archs do. Another change is the missing 'cli' macro invocation at the beginning of the resume_kernel. Signed-off-by: Giuseppe Cavallaro <peppe.cavallaro@st.com> Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
parent
3c31bf7313
commit
323b8c410a
@ -92,6 +92,7 @@ ENTRY(ret_from_irq)
|
|||||||
bra resume_userspace
|
bra resume_userspace
|
||||||
nop
|
nop
|
||||||
ENTRY(resume_kernel)
|
ENTRY(resume_kernel)
|
||||||
|
cli
|
||||||
mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
|
mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
|
||||||
tst r0, r0
|
tst r0, r0
|
||||||
bf noresched
|
bf noresched
|
||||||
@ -105,28 +106,9 @@ need_resched:
|
|||||||
and #0xf0, r0 ! interrupts off (exception path)?
|
and #0xf0, r0 ! interrupts off (exception path)?
|
||||||
cmp/eq #0xf0, r0
|
cmp/eq #0xf0, r0
|
||||||
bt noresched
|
bt noresched
|
||||||
|
|
||||||
mov.l 1f, r0
|
|
||||||
mov.l r0, @(TI_PRE_COUNT,r8)
|
|
||||||
|
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
||||||
mov.l 3f, r0
|
mov.l 3f, r0
|
||||||
jsr @r0
|
jsr @r0 ! call preempt_schedule_irq
|
||||||
nop
|
nop
|
||||||
#endif
|
|
||||||
sti
|
|
||||||
mov.l 2f, r0
|
|
||||||
jsr @r0
|
|
||||||
nop
|
|
||||||
mov #0, r0
|
|
||||||
mov.l r0, @(TI_PRE_COUNT,r8)
|
|
||||||
cli
|
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
|
||||||
mov.l 4f, r0
|
|
||||||
jsr @r0
|
|
||||||
nop
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bra need_resched
|
bra need_resched
|
||||||
nop
|
nop
|
||||||
|
|
||||||
@ -137,10 +119,7 @@ noresched:
|
|||||||
.align 2
|
.align 2
|
||||||
1: .long PREEMPT_ACTIVE
|
1: .long PREEMPT_ACTIVE
|
||||||
2: .long schedule
|
2: .long schedule
|
||||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
3: .long preempt_schedule_irq
|
||||||
3: .long trace_hardirqs_on
|
|
||||||
4: .long trace_hardirqs_off
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ENTRY(resume_userspace)
|
ENTRY(resume_userspace)
|
||||||
|
Loading…
Reference in New Issue
Block a user