openpcd/firmware/include/asm/system.h @ master
1 | caf50003 | (no author) | #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 | 2a2d6309 | (no author) | #define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
|
108 | caf50003 | (no author) | |
109 | #endif
|