diff options
author | Robin Getz <rgetz@blackfin.uclinux.org> | 2009-02-04 03:49:45 -0500 |
---|---|---|
committer | Bryan Wu <cooloney@kernel.org> | 2009-02-04 03:49:45 -0500 |
commit | 2f95d5bd84bfbe8cf62cb1c4306354cfc139370b (patch) | |
tree | d78f0e9fe2d83f8d85f91a89b7dcddc74cba5c8e | |
parent | 76e8fe4da652b020e08089415c684a365bb5b6a9 (diff) |
Blackfin arch: don't accidently re-enable interrupts
Make sure we don't accidently re-enable interrupts if we are being
called in atomic context
Signed-off-by: Robin Getz <rgetz@blackfin.uclinux.org>
Signed-off-by: Bryan Wu <cooloney@kernel.org>
-rw-r--r-- | arch/blackfin/kernel/traps.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index 5b0667da8d05..f18c2481e9b7 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -1052,8 +1052,9 @@ void show_regs(struct pt_regs *fp) | |||
1052 | char buf [150]; | 1052 | char buf [150]; |
1053 | struct irqaction *action; | 1053 | struct irqaction *action; |
1054 | unsigned int i; | 1054 | unsigned int i; |
1055 | unsigned long flags; | 1055 | unsigned long flags = 0; |
1056 | unsigned int cpu = smp_processor_id(); | 1056 | unsigned int cpu = smp_processor_id(); |
1057 | unsigned char in_atomic = (bfin_read_IPEND() & 0x10) || in_atomic(); | ||
1057 | 1058 | ||
1058 | verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); | 1059 | verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted()); |
1059 | verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", | 1060 | verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n", |
@@ -1073,17 +1074,22 @@ void show_regs(struct pt_regs *fp) | |||
1073 | } | 1074 | } |
1074 | verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", | 1075 | verbose_printk(KERN_NOTICE " EXCAUSE : 0x%lx\n", |
1075 | fp->seqstat & SEQSTAT_EXCAUSE); | 1076 | fp->seqstat & SEQSTAT_EXCAUSE); |
1076 | for (i = 6; i <= 15 ; i++) { | 1077 | for (i = 2; i <= 15 ; i++) { |
1077 | if (fp->ipend & (1 << i)) { | 1078 | if (fp->ipend & (1 << i)) { |
1078 | decode_address(buf, bfin_read32(EVT0 + 4*i)); | 1079 | if (i != 4) { |
1079 | verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf); | 1080 | decode_address(buf, bfin_read32(EVT0 + 4*i)); |
1081 | verbose_printk(KERN_NOTICE " physical IVG%i asserted : %s\n", i, buf); | ||
1082 | } else | ||
1083 | verbose_printk(KERN_NOTICE " interrupts disabled\n"); | ||
1080 | } | 1084 | } |
1081 | } | 1085 | } |
1082 | 1086 | ||
1083 | /* if no interrupts are going off, don't print this out */ | 1087 | /* if no interrupts are going off, don't print this out */ |
1084 | if (fp->ipend & ~0x3F) { | 1088 | if (fp->ipend & ~0x3F) { |
1085 | for (i = 0; i < (NR_IRQS - 1); i++) { | 1089 | for (i = 0; i < (NR_IRQS - 1); i++) { |
1086 | spin_lock_irqsave(&irq_desc[i].lock, flags); | 1090 | if (!in_atomic) |
1091 | spin_lock_irqsave(&irq_desc[i].lock, flags); | ||
1092 | |||
1087 | action = irq_desc[i].action; | 1093 | action = irq_desc[i].action; |
1088 | if (!action) | 1094 | if (!action) |
1089 | goto unlock; | 1095 | goto unlock; |
@@ -1096,7 +1102,8 @@ void show_regs(struct pt_regs *fp) | |||
1096 | } | 1102 | } |
1097 | verbose_printk("\n"); | 1103 | verbose_printk("\n"); |
1098 | unlock: | 1104 | unlock: |
1099 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | 1105 | if (!in_atomic) |
1106 | spin_unlock_irqrestore(&irq_desc[i].lock, flags); | ||
1100 | } | 1107 | } |
1101 | } | 1108 | } |
1102 | 1109 | ||