Commit | Line | Data |
---|---|---|
1f194a4c HC |
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 | ||
94c12cc7 MS |
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 | ||
1f194a4c | 75 | /* interrupt control.. */ |
94c12cc7 MS |
76 | static inline unsigned long raw_local_irq_enable(void) |
77 | { | |
78 | return __raw_local_irq_stosm(0x03); | |
79 | } | |
63f4f9e1 | 80 | |
94c12cc7 MS |
81 | static 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) \ | |
87 | do { \ | |
88 | typecheck(unsigned long, x); \ | |
89 | (x) = __raw_local_irq_stosm(0x00); \ | |
63f4f9e1 | 90 | } while (0) |
1f194a4c | 91 | |
94c12cc7 MS |
92 | static inline void raw_local_irq_restore(unsigned long flags) |
93 | { | |
94 | __raw_local_irq_ssm(flags); | |
95 | } | |
1f194a4c HC |
96 | |
97 | static inline int raw_irqs_disabled_flags(unsigned long flags) | |
98 | { | |
94c12cc7 | 99 | return !(flags & (3UL << (BITS_PER_LONG - 8))); |
1f194a4c HC |
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 */ |