diff options
-rw-r--r-- | arch/sh/kernel/cpu/sh3/entry.S | 8 | ||||
-rw-r--r-- | arch/sh/kernel/entry-common.S | 27 |
2 files changed, 24 insertions, 11 deletions
diff --git a/arch/sh/kernel/cpu/sh3/entry.S b/arch/sh/kernel/cpu/sh3/entry.S index 67ad6467c694..272636ec5c98 100644 --- a/arch/sh/kernel/cpu/sh3/entry.S +++ b/arch/sh/kernel/cpu/sh3/entry.S | |||
@@ -508,6 +508,14 @@ ENTRY(handle_interrupt) | |||
508 | bsr save_regs ! needs original pr value in k3 | 508 | bsr save_regs ! needs original pr value in k3 |
509 | mov #-1, k2 ! default vector kept in k2 | 509 | mov #-1, k2 ! default vector kept in k2 |
510 | 510 | ||
511 | stc sr, r0 ! get status register | ||
512 | shlr2 r0 | ||
513 | and #0x3c, r0 | ||
514 | cmp/eq #0x3c, r0 | ||
515 | bf 9f | ||
516 | TRACE_IRQS_OFF | ||
517 | 9: | ||
518 | |||
511 | ! Setup return address and jump to do_IRQ | 519 | ! Setup return address and jump to do_IRQ |
512 | mov.l 4f, r9 ! fetch return address | 520 | mov.l 4f, r9 ! fetch return address |
513 | lds r9, pr ! put return address in pr | 521 | lds r9, pr ! put return address in pr |
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 | ||
86 | 9: | ||
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 |
97 | ENTRY(resume_kernel) | 88 | ENTRY(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 | ||
218 | 1: | ||
219 | TRACE_IRQS_OFF | ||
220 | 2: | ||
221 | mov.l 3f, r0 | ||
217 | jmp @r0 | 222 | jmp @r0 |
218 | nop | 223 | nop |
219 | 224 | ||
220 | .align 2 | 225 | .align 2 |
221 | 1: .long restore_all | 226 | 3: .long restore_all |
222 | 227 | ||
223 | .align 2 | 228 | .align 2 |
224 | syscall_badsys: ! Bad syscall number | 229 | syscall_badsys: ! Bad syscall number |