Initial import of OsmocomBB into git repository
[osmocom-bb.git] / src / target / firmware / include / asm / system.h
1 #ifndef __ASM_ARM_SYSTEM_H
2 #define __ASM_ARM_SYSTEM_H
3
4 /* Generic ARM7TDMI (ARMv4T) synchronisation primitives, mostly
5  * taken from Linux kernel source, licensed under GPL */
6
7 #define local_irq_save(x)                                       \
8         ({                                                      \
9                 unsigned long temp;                             \
10                 (void) (&temp == &x);                           \
11         __asm__ __volatile__(                                   \
12         "mrs    %0, cpsr                @ local_irq_save\n"     \
13 "       orr     %1, %0, #128\n"                                 \
14 "       msr     cpsr_c, %1"                                     \
15         : "=r" (x), "=r" (temp)                                 \
16         :                                                       \
17         : "memory", "cc");                                      \
18         })
19         
20 /*
21  * Enable IRQs
22  */
23 #define local_irq_enable()                                      \
24         ({                                                      \
25                 unsigned long temp;                             \
26         __asm__ __volatile__(                                   \
27         "mrs    %0, cpsr                @ local_irq_enable\n"   \
28 "       bic     %0, %0, #128\n"                                 \
29 "       msr     cpsr_c, %0"                                     \
30         : "=r" (temp)                                           \
31         :                                                       \
32         : "memory", "cc");                                      \
33         })
34
35 /*
36  * Disable IRQs
37  */
38 #define local_irq_disable()                                     \
39         ({                                                      \
40                 unsigned long temp;                             \
41         __asm__ __volatile__(                                   \
42         "mrs    %0, cpsr                @ local_irq_disable\n"  \
43 "       orr     %0, %0, #128\n"                                 \
44 "       msr     cpsr_c, %0"                                     \
45         : "=r" (temp)                                           \
46         :                                                       \
47         : "memory", "cc");                                      \
48         })
49
50 /*
51  * Enable FIQs
52  */
53 #define local_fiq_enable()                                      \
54         ({                                                      \
55                 unsigned long temp;                             \
56         __asm__ __volatile__(                                   \
57         "mrs    %0, cpsr                @ stf\n"                \
58 "       bic     %0, %0, #64\n"                                  \
59 "       msr     cpsr_c, %0"                                     \
60         : "=r" (temp)                                           \
61         :                                                       \
62         : "memory", "cc");                                      \
63         })
64
65 /*
66  * Disable FIQs
67  */
68 #define local_fiq_disable()                                     \
69         ({                                                      \
70                 unsigned long temp;                             \
71         __asm__ __volatile__(                                   \
72         "mrs    %0, cpsr                @ clf\n"                \
73 "       orr     %0, %0, #64\n"                                  \
74 "       msr     cpsr_c, %0"                                     \
75         : "=r" (temp)                                           \
76         :                                                       \
77         : "memory", "cc");                                      \
78         })
79
80 /*
81  * Save the current interrupt enable state.
82  */
83 #define local_save_flags(x)                                     \
84         ({                                                      \
85         __asm__ __volatile__(                                   \
86         "mrs    %0, cpsr                @ local_save_flags"     \
87         : "=r" (x) : : "memory", "cc");                         \
88         })
89
90 /*
91  * restore saved IRQ & FIQ state
92  */
93 #define local_irq_restore(x)                                    \
94         __asm__ __volatile__(                                   \
95         "msr    cpsr_c, %0              @ local_irq_restore\n"  \
96         :                                                       \
97         : "r" (x)                                               \
98         : "memory", "cc")
99
100 #define irqs_disabled()                 \
101 ({                                      \
102         unsigned long flags;            \
103         local_save_flags(flags);        \
104         (int)(flags & PSR_I_BIT);       \
105 })
106
107 #define __asmeq(x, y)  ".ifnc " x "," y " ; .err ; .endif\n\t"
108
109 #endif