Merge branches 'bugzilla-11884' and 'bugzilla-8544' into release
[linux-2.6] / arch / arm / include / asm / irqflags.h
1 #ifndef __ASM_ARM_IRQFLAGS_H
2 #define __ASM_ARM_IRQFLAGS_H
3
4 #ifdef __KERNEL__
5
6 #include <asm/ptrace.h>
7
8 /*
9  * CPU interrupt mask handling.
10  */
11 #if __LINUX_ARM_ARCH__ >= 6
12
13 #define raw_local_irq_save(x)                                   \
14         ({                                                      \
15         __asm__ __volatile__(                                   \
16         "mrs    %0, cpsr                @ local_irq_save\n"     \
17         "cpsid  i"                                              \
18         : "=r" (x) : : "memory", "cc");                         \
19         })
20
21 #define raw_local_irq_enable()  __asm__("cpsie i        @ __sti" : : : "memory", "cc")
22 #define raw_local_irq_disable() __asm__("cpsid i        @ __cli" : : : "memory", "cc")
23 #define local_fiq_enable()  __asm__("cpsie f    @ __stf" : : : "memory", "cc")
24 #define local_fiq_disable() __asm__("cpsid f    @ __clf" : : : "memory", "cc")
25
26 #else
27
28 /*
29  * Save the current interrupt enable state & disable IRQs
30  */
31 #define raw_local_irq_save(x)                                   \
32         ({                                                      \
33                 unsigned long temp;                             \
34                 (void) (&temp == &x);                           \
35         __asm__ __volatile__(                                   \
36         "mrs    %0, cpsr                @ local_irq_save\n"     \
37 "       orr     %1, %0, #128\n"                                 \
38 "       msr     cpsr_c, %1"                                     \
39         : "=r" (x), "=r" (temp)                                 \
40         :                                                       \
41         : "memory", "cc");                                      \
42         })
43         
44 /*
45  * Enable IRQs
46  */
47 #define raw_local_irq_enable()                                  \
48         ({                                                      \
49                 unsigned long temp;                             \
50         __asm__ __volatile__(                                   \
51         "mrs    %0, cpsr                @ local_irq_enable\n"   \
52 "       bic     %0, %0, #128\n"                                 \
53 "       msr     cpsr_c, %0"                                     \
54         : "=r" (temp)                                           \
55         :                                                       \
56         : "memory", "cc");                                      \
57         })
58
59 /*
60  * Disable IRQs
61  */
62 #define raw_local_irq_disable()                                 \
63         ({                                                      \
64                 unsigned long temp;                             \
65         __asm__ __volatile__(                                   \
66         "mrs    %0, cpsr                @ local_irq_disable\n"  \
67 "       orr     %0, %0, #128\n"                                 \
68 "       msr     cpsr_c, %0"                                     \
69         : "=r" (temp)                                           \
70         :                                                       \
71         : "memory", "cc");                                      \
72         })
73
74 /*
75  * Enable FIQs
76  */
77 #define local_fiq_enable()                                      \
78         ({                                                      \
79                 unsigned long temp;                             \
80         __asm__ __volatile__(                                   \
81         "mrs    %0, cpsr                @ stf\n"                \
82 "       bic     %0, %0, #64\n"                                  \
83 "       msr     cpsr_c, %0"                                     \
84         : "=r" (temp)                                           \
85         :                                                       \
86         : "memory", "cc");                                      \
87         })
88
89 /*
90  * Disable FIQs
91  */
92 #define local_fiq_disable()                                     \
93         ({                                                      \
94                 unsigned long temp;                             \
95         __asm__ __volatile__(                                   \
96         "mrs    %0, cpsr                @ clf\n"                \
97 "       orr     %0, %0, #64\n"                                  \
98 "       msr     cpsr_c, %0"                                     \
99         : "=r" (temp)                                           \
100         :                                                       \
101         : "memory", "cc");                                      \
102         })
103
104 #endif
105
106 /*
107  * Save the current interrupt enable state.
108  */
109 #define raw_local_save_flags(x)                                 \
110         ({                                                      \
111         __asm__ __volatile__(                                   \
112         "mrs    %0, cpsr                @ local_save_flags"     \
113         : "=r" (x) : : "memory", "cc");                         \
114         })
115
116 /*
117  * restore saved IRQ & FIQ state
118  */
119 #define raw_local_irq_restore(x)                                \
120         __asm__ __volatile__(                                   \
121         "msr    cpsr_c, %0              @ local_irq_restore\n"  \
122         :                                                       \
123         : "r" (x)                                               \
124         : "memory", "cc")
125
126 #define raw_irqs_disabled_flags(flags)  \
127 ({                                      \
128         (int)((flags) & PSR_I_BIT);     \
129 })
130
131 #endif
132 #endif