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