2 * Copyright IBM Corp. 2006,2010
3 * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
6 #ifndef __ASM_IRQFLAGS_H
7 #define __ASM_IRQFLAGS_H
9 #include <linux/types.h>
11 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
13 /* store then or system mask. */
14 #define __raw_local_irq_stosm(__or) \
16 unsigned long __mask; \
19 : "=Q" (__mask) : "i" (__or) : "memory"); \
23 /* store then and system mask. */
24 #define __raw_local_irq_stnsm(__and) \
26 unsigned long __mask; \
29 : "=Q" (__mask) : "i" (__and) : "memory"); \
33 /* set system mask. */
34 #define __raw_local_irq_ssm(__mask) \
36 asm volatile("ssm %0" : : "Q" (__mask) : "memory"); \
41 /* store then or system mask. */
42 #define __raw_local_irq_stosm(__or) \
44 unsigned long __mask; \
48 : "a" (&__mask), "i" (__or) : "memory"); \
52 /* store then and system mask. */
53 #define __raw_local_irq_stnsm(__and) \
55 unsigned long __mask; \
59 : "a" (&__mask), "i" (__and) : "memory"); \
63 /* set system mask. */
64 #define __raw_local_irq_ssm(__mask) \
68 : : "a" (&__mask), "m" (__mask) : "memory"); \
73 /* interrupt control.. */
74 static inline unsigned long raw_local_irq_enable(void)
76 return __raw_local_irq_stosm(0x03);
79 static inline unsigned long raw_local_irq_disable(void)
81 return __raw_local_irq_stnsm(0xfc);
84 #define raw_local_save_flags(x) \
86 typecheck(unsigned long, x); \
87 (x) = __raw_local_irq_stosm(0x00); \
90 static inline void raw_local_irq_restore(unsigned long flags)
92 __raw_local_irq_ssm(flags);
95 static inline int raw_irqs_disabled_flags(unsigned long flags)
97 return !(flags & (3UL << (BITS_PER_LONG - 8)));
100 /* For spinlocks etc */
101 #define raw_local_irq_save(x) ((x) = raw_local_irq_disable())
103 #endif /* __ASM_IRQFLAGS_H */