openpcd/firmware/include/asm/system.h @ master
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
|
- « Previous
- 1
- …
- 7
- 8
- 9
- Next »