aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/kernel/entry-common.S
diff options
context:
space:
mode:
authorMatt Fleming <matt@console-pimps.org>2009-08-17 22:35:09 -0400
committerPaul Mundt <lethal@linux-sh.org>2009-08-17 22:35:09 -0400
commitf3a8308864f920d2babe76921733d76ec4a11fb8 (patch)
tree3dd604503b020d0aee42f18d4e3d8d9f0667d06e /arch/sh/kernel/entry-common.S
parent63cd91dfd4976cb9687b07e9a9864912631d2e08 (diff)
sh: Add a few missing irqflags tracing markers.
save_regs contains an SR modification without an irqflags annotation, which resulted in a missing TRACE_IRQS_OFF in the interrupt exception path on SH-3/SH4. I've also moved the TRACE_IRQS_OFF/ON annotation when returning from the interrupt to just before we call __restore_all. This seems like the most logical place to put this because the annotation is for when we restore the SR register so we should delay the annotation until as last as possible. We were also missing a TRACE_IRQS_OFF in resume_kernel when CONFIG_PREEMPT is enabled. The end result is that this fixes up the lockdep engine debugging support with CONFIG_PREEMPT enabled on all SH-3/4 parts. Signed-off-by: Matt Fleming <matt@console-pimps.org> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/kernel/entry-common.S')
-rw-r--r--arch/sh/kernel/entry-common.S27
1 files changed, 16 insertions, 11 deletions
diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S
index e63178fefb9b..700477601c6f 100644
--- a/arch/sh/kernel/entry-common.S
+++ b/arch/sh/kernel/entry-common.S
@@ -77,15 +77,6 @@ ENTRY(ret_from_irq)
77 ! 77 !
78 mov #OFF_SR, r0 78 mov #OFF_SR, r0
79 mov.l @(r0,r15), r0 ! get status register 79 mov.l @(r0,r15), r0 ! get status register
80
81 shlr2 r0
82 and #0x3c, r0
83 cmp/eq #0x3c, r0
84 bt 9f
85 TRACE_IRQS_ON
869:
87 mov #OFF_SR, r0
88 mov.l @(r0,r15), r0 ! get status register
89 shll r0 80 shll r0
90 shll r0 ! kernel space? 81 shll r0 ! kernel space?
91 get_current_thread_info r8, r0 82 get_current_thread_info r8, r0
@@ -96,6 +87,7 @@ ENTRY(ret_from_irq)
96 nop 87 nop
97ENTRY(resume_kernel) 88ENTRY(resume_kernel)
98 cli 89 cli
90 TRACE_IRQS_OFF
99 mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count 91 mov.l @(TI_PRE_COUNT,r8), r0 ! current_thread_info->preempt_count
100 tst r0, r0 92 tst r0, r0
101 bf noresched 93 bf noresched
@@ -213,12 +205,25 @@ syscall_trace_entry:
213 mov.l r0, @(OFF_R0,r15) ! Return value 205 mov.l r0, @(OFF_R0,r15) ! Return value
214 206
215__restore_all: 207__restore_all:
216 mov.l 1f, r0 208 mov #OFF_SR, r0
209 mov.l @(r0,r15), r0 ! get status register
210
211 shlr2 r0
212 and #0x3c, r0
213 cmp/eq #0x3c, r0
214 bt 1f
215 TRACE_IRQS_ON
216 bra 2f
217 nop
2181:
219 TRACE_IRQS_OFF
2202:
221 mov.l 3f, r0
217 jmp @r0 222 jmp @r0
218 nop 223 nop
219 224
220 .align 2 225 .align 2
2211: .long restore_all 2263: .long restore_all
222 227
223 .align 2 228 .align 2
224syscall_badsys: ! Bad syscall number 229syscall_badsys: ! Bad syscall number