Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | #ifndef __ASM_HARDIRQ_H |
| 2 | #define __ASM_HARDIRQ_H |
| 3 | |
| 4 | #include <linux/config.h> |
| 5 | #include <linux/threads.h> |
| 6 | #include <linux/irq.h> |
| 7 | #include <asm/pda.h> |
| 8 | #include <asm/apic.h> |
| 9 | |
| 10 | #define __ARCH_IRQ_STAT 1 |
| 11 | |
Andi Kleen | 3f74478 | 2005-09-12 18:49:24 +0200 | [diff] [blame] | 12 | #define local_softirq_pending() read_pda(__softirq_pending) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 13 | |
Andi Kleen | 3f74478 | 2005-09-12 18:49:24 +0200 | [diff] [blame] | 14 | #define __ARCH_SET_SOFTIRQ_PENDING 1 |
| 15 | |
| 16 | #define set_softirq_pending(x) write_pda(__softirq_pending, (x)) |
| 17 | #define or_softirq_pending(x) or_pda(__softirq_pending, (x)) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 18 | |
| 19 | /* |
| 20 | * 'what should we do if we get a hw irq event on an illegal vector'. |
| 21 | * each architecture has to answer this themselves. |
| 22 | */ |
| 23 | static inline void ack_bad_irq(unsigned int irq) |
| 24 | { |
| 25 | printk("unexpected IRQ trap at vector %02x\n", irq); |
| 26 | #ifdef CONFIG_X86_LOCAL_APIC |
| 27 | /* |
| 28 | * Currently unexpected vectors happen only on SMP and APIC. |
| 29 | * We _must_ ack these because every local APIC has only N |
| 30 | * irq slots per priority level, and a 'hanging, unacked' IRQ |
| 31 | * holds up an irq slot - in excessive cases (when multiple |
| 32 | * unexpected vectors occur) that might lock up the APIC |
| 33 | * completely. |
| 34 | */ |
| 35 | ack_APIC_irq(); |
| 36 | #endif |
| 37 | } |
| 38 | #endif /* __ASM_HARDIRQ_H */ |