Merge branch 'tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic...
[linux-2.6-block.git] / arch / s390 / include / asm / irqflags.h
1 /*
2  *    Copyright IBM Corp. 2006,2010
3  *    Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
4  */
5
6 #ifndef __ASM_IRQFLAGS_H
7 #define __ASM_IRQFLAGS_H
8
9 #include <linux/types.h>
10
11 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2)
12
13 /* store then or system mask. */
14 #define __raw_local_irq_stosm(__or)                                     \
15 ({                                                                      \
16         unsigned long __mask;                                           \
17         asm volatile(                                                   \
18                 "       stosm   %0,%1"                                  \
19                 : "=Q" (__mask) : "i" (__or) : "memory");               \
20         __mask;                                                         \
21 })
22
23 /* store then and system mask. */
24 #define __raw_local_irq_stnsm(__and)                                    \
25 ({                                                                      \
26         unsigned long __mask;                                           \
27         asm volatile(                                                   \
28                 "       stnsm   %0,%1"                                  \
29                 : "=Q" (__mask) : "i" (__and) : "memory");              \
30         __mask;                                                         \
31 })
32
33 /* set system mask. */
34 #define __raw_local_irq_ssm(__mask)                                     \
35 ({                                                                      \
36         asm volatile("ssm   %0" : : "Q" (__mask) : "memory");           \
37 })
38
39 #else /* __GNUC__ */
40
41 /* store then or system mask. */
42 #define __raw_local_irq_stosm(__or)                                     \
43 ({                                                                      \
44         unsigned long __mask;                                           \
45         asm volatile(                                                   \
46                 "       stosm   0(%1),%2"                               \
47                 : "=m" (__mask)                                         \
48                 : "a" (&__mask), "i" (__or) : "memory");                \
49         __mask;                                                         \
50 })
51
52 /* store then and system mask. */
53 #define __raw_local_irq_stnsm(__and)                                    \
54 ({                                                                      \
55         unsigned long __mask;                                           \
56         asm volatile(                                                   \
57                 "       stnsm   0(%1),%2"                               \
58                 : "=m" (__mask)                                         \
59                 : "a" (&__mask), "i" (__and) : "memory");               \
60         __mask;                                                         \
61 })
62
63 /* set system mask. */
64 #define __raw_local_irq_ssm(__mask)                                     \
65 ({                                                                      \
66         asm volatile(                                                   \
67                 "       ssm     0(%0)"                                  \
68                 : : "a" (&__mask), "m" (__mask) : "memory");            \
69 })
70
71 #endif /* __GNUC__ */
72
73 /* interrupt control.. */
74 static inline unsigned long raw_local_irq_enable(void)
75 {
76         return __raw_local_irq_stosm(0x03);
77 }
78
79 static inline unsigned long raw_local_irq_disable(void)
80 {
81         return __raw_local_irq_stnsm(0xfc);
82 }
83
84 #define raw_local_save_flags(x)                                         \
85 do {                                                                    \
86         typecheck(unsigned long, x);                                    \
87         (x) = __raw_local_irq_stosm(0x00);                              \
88 } while (0)
89
90 static inline void raw_local_irq_restore(unsigned long flags)
91 {
92         __raw_local_irq_ssm(flags);
93 }
94
95 static inline int raw_irqs_disabled_flags(unsigned long flags)
96 {
97         return !(flags & (3UL << (BITS_PER_LONG - 8)));
98 }
99
100 /* For spinlocks etc */
101 #define raw_local_irq_save(x)   ((x) = raw_local_irq_disable())
102
103 #endif /* __ASM_IRQFLAGS_H */