aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Getz <rgetz@blackfin.uclinux.org>2009-02-04 03:49:45 -0500
committerBryan Wu <cooloney@kernel.org>2009-02-04 03:49:45 -0500
commit2f95d5bd84bfbe8cf62cb1c4306354cfc139370b (patch)
treed78f0e9fe2d83f8d85f91a89b7dcddc74cba5c8e
parent76e8fe4da652b020e08089415c684a365bb5b6a9 (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.c19
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");
1098unlock: 1104unlock:
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