diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-05-07 02:55:41 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-05-07 02:55:41 +0000 |
commit | dcec8a13bf565e47942a1751a9cec21bec5648fe (patch) | |
tree | 548b69625b18cc2e88c3e68d0923be546c9ebb03 /include/asm-alpha/hardirq.h | |
parent | 2e0f55e79c49509b7ff70ff1a10e1e9e90a3dfd4 (diff) |
o Merge with Linux 2.1.99.
o Fix ancient bug in the ELF loader making ldd crash.
o Fix ancient bug in the keyboard code for SGI, SNI and Jazz.
Diffstat (limited to 'include/asm-alpha/hardirq.h')
-rw-r--r-- | include/asm-alpha/hardirq.h | 60 |
1 files changed, 59 insertions, 1 deletions
diff --git a/include/asm-alpha/hardirq.h b/include/asm-alpha/hardirq.h index 733216be9..556e744d2 100644 --- a/include/asm-alpha/hardirq.h +++ b/include/asm-alpha/hardirq.h @@ -17,7 +17,65 @@ extern unsigned int local_irq_count[NR_CPUS]; #else -#error No habla alpha SMP +/* initially just a straight copy if the i386 code */ + +#include <asm/atomic.h> +#include <asm/spinlock.h> +#include <asm/system.h> +#include <asm/smp.h> + +extern unsigned char global_irq_holder; +extern spinlock_t global_irq_lock; +extern atomic_t global_irq_count; + +static inline void release_irqlock(int cpu) +{ + /* if we didn't own the irq lock, just ignore.. */ + if (global_irq_holder == (unsigned char) cpu) { + global_irq_holder = NO_PROC_ID; + spin_unlock(&global_irq_lock); + } +} + +/* Ordering of the counter bumps is _deadly_ important. */ +static inline void hardirq_enter(int cpu) +{ + ++local_irq_count[cpu]; + atomic_inc(&global_irq_count); +} + +static inline void hardirq_exit(int cpu) +{ + atomic_dec(&global_irq_count); + --local_irq_count[cpu]; +} + +static inline int hardirq_trylock(int cpu) +{ + unsigned long flags; + int ret = 1; + + __save_and_cli(flags); + if ((atomic_add_return(1, &global_irq_count) != 1) || + (global_irq_lock.lock != 0)) { + atomic_dec(&global_irq_count); + __restore_flags(flags); + ret = 0; + } else { + ++local_irq_count[cpu]; + __sti(); + } + return ret; +} + +#define hardirq_endlock(cpu) \ + do { \ + __cli(); \ + hardirq_exit(cpu); \ + __sti(); \ + } while (0) + +extern void synchronize_irq(void); #endif /* __SMP__ */ #endif /* _ALPHA_HARDIRQ_H */ |