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>
This commit is contained in:
Matt Fleming 2009-08-18 11:35:09 +09:00 committed by Paul Mundt
parent 63cd91dfd4
commit f3a8308864
2 changed files with 24 additions and 11 deletions

View File

@ -508,6 +508,14 @@ ENTRY(handle_interrupt)
bsr save_regs ! needs original pr value in k3 bsr save_regs ! needs original pr value in k3
mov #-1, k2 ! default vector kept in k2 mov #-1, k2 ! default vector kept in k2
stc sr, r0 ! get status register
shlr2 r0
and #0x3c, r0
cmp/eq #0x3c, r0
bf 9f
TRACE_IRQS_OFF
9:
! Setup return address and jump to do_IRQ ! Setup return address and jump to do_IRQ
mov.l 4f, r9 ! fetch return address mov.l 4f, r9 ! fetch return address
lds r9, pr ! put return address in pr lds r9, pr ! put return address in pr

View File

@ -77,15 +77,6 @@ ENTRY(ret_from_irq)
! !
mov #OFF_SR, r0 mov #OFF_SR, r0
mov.l @(r0,r15), r0 ! get status register mov.l @(r0,r15), r0 ! get status register
shlr2 r0
and #0x3c, r0
cmp/eq #0x3c, r0
bt 9f
TRACE_IRQS_ON
9:
mov #OFF_SR, r0
mov.l @(r0,r15), r0 ! get status register
shll r0 shll r0
shll r0 ! kernel space? shll r0 ! kernel space?
get_current_thread_info r8, r0 get_current_thread_info r8, r0
@ -96,6 +87,7 @@ ENTRY(ret_from_irq)
nop nop
ENTRY(resume_kernel) ENTRY(resume_kernel)
cli cli
TRACE_IRQS_OFF
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
@ -213,12 +205,25 @@ syscall_trace_entry:
mov.l r0, @(OFF_R0,r15) ! Return value mov.l r0, @(OFF_R0,r15) ! Return value
__restore_all: __restore_all:
mov.l 1f, r0 mov #OFF_SR, r0
mov.l @(r0,r15), r0 ! get status register
shlr2 r0
and #0x3c, r0
cmp/eq #0x3c, r0
bt 1f
TRACE_IRQS_ON
bra 2f
nop
1:
TRACE_IRQS_OFF
2:
mov.l 3f, r0
jmp @r0 jmp @r0
nop nop
.align 2 .align 2
1: .long restore_all 3: .long restore_all
.align 2 .align 2
syscall_badsys: ! Bad syscall number syscall_badsys: ! Bad syscall number