xref: /linux/arch/s390/include/asm/irqflags.h (revision 0482e3c6f704d25b6a4e3c940caeeacece4e6d74)
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 */
104