|  | #ifndef __ASM_GENERIC_IRQFLAGS_H | 
|  | #define __ASM_GENERIC_IRQFLAGS_H | 
|  |  | 
|  | /* | 
|  | * All architectures should implement at least the first two functions, | 
|  | * usually inline assembly will be the best way. | 
|  | */ | 
|  | #ifndef ARCH_IRQ_DISABLED | 
|  | #define ARCH_IRQ_DISABLED 0 | 
|  | #define ARCH_IRQ_ENABLED 1 | 
|  | #endif | 
|  |  | 
|  | /* read interrupt enabled status */ | 
|  | #ifndef arch_local_save_flags | 
|  | unsigned long arch_local_save_flags(void); | 
|  | #endif | 
|  |  | 
|  | /* set interrupt enabled status */ | 
|  | #ifndef arch_local_irq_restore | 
|  | void arch_local_irq_restore(unsigned long flags); | 
|  | #endif | 
|  |  | 
|  | /* get status and disable interrupts */ | 
|  | #ifndef arch_local_irq_save | 
|  | static inline unsigned long arch_local_irq_save(void) | 
|  | { | 
|  | unsigned long flags; | 
|  | flags = arch_local_save_flags(); | 
|  | arch_local_irq_restore(ARCH_IRQ_DISABLED); | 
|  | return flags; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* test flags */ | 
|  | #ifndef arch_irqs_disabled_flags | 
|  | static inline int arch_irqs_disabled_flags(unsigned long flags) | 
|  | { | 
|  | return flags == ARCH_IRQ_DISABLED; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* unconditionally enable interrupts */ | 
|  | #ifndef arch_local_irq_enable | 
|  | static inline void arch_local_irq_enable(void) | 
|  | { | 
|  | arch_local_irq_restore(ARCH_IRQ_ENABLED); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* unconditionally disable interrupts */ | 
|  | #ifndef arch_local_irq_disable | 
|  | static inline void arch_local_irq_disable(void) | 
|  | { | 
|  | arch_local_irq_restore(ARCH_IRQ_DISABLED); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /* test hardware interrupt enable bit */ | 
|  | #ifndef arch_irqs_disabled | 
|  | static inline int arch_irqs_disabled(void) | 
|  | { | 
|  | return arch_irqs_disabled_flags(arch_local_save_flags()); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif /* __ASM_GENERIC_IRQFLAGS_H */ |