Project

General

Profile

Download (2.11 KB) Statistics
| Branch: | Tag: | Revision:
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
(9-9/9)
Add picture from clipboard (Maximum size: 48.8 MB)