Blame view

include/asm-alpha/spinlock.h 3.13 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
  #ifndef _ALPHA_SPINLOCK_H
  #define _ALPHA_SPINLOCK_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
  #include <asm/system.h>
  #include <linux/kernel.h>
  #include <asm/current.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
  /*
   * Simple spin lock operations.  There are two variants, one clears IRQ's
   * on the local processor, one does not.
   *
   * We make no fairness assumptions. They have a cost.
   */
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
12
13
14
15
16
17
  #define __raw_spin_lock_flags(lock, flags) __raw_spin_lock(lock)
  #define __raw_spin_is_locked(x)	((x)->lock != 0)
  #define __raw_spin_unlock_wait(x) \
  		do { cpu_relax(); } while ((x)->lock)
  
  static inline void __raw_spin_unlock(raw_spinlock_t * lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
19
20
21
  {
  	mb();
  	lock->lock = 0;
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
22
  static inline void __raw_spin_lock(raw_spinlock_t * lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  {
  	long tmp;
  
  	__asm__ __volatile__(
  	"1:	ldl_l	%0,%1
  "
  	"	bne	%0,2f
  "
  	"	lda	%0,1
  "
  	"	stl_c	%0,%1
  "
  	"	beq	%0,2f
  "
  	"	mb
  "
  	".subsection 2
  "
  	"2:	ldl	%0,%1
  "
  	"	bne	%0,2b
  "
  	"	br	1b
  "
  	".previous"
  	: "=&r" (tmp), "=m" (lock->lock)
  	: "m"(lock->lock) : "memory");
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
51
  static inline int __raw_spin_trylock(raw_spinlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
  {
  	return !test_and_set_bit(0, &lock->lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
  
  /***********************************************************/
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
57
  static inline int __raw_read_can_lock(raw_rwlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
  {
  	return (lock->lock & 1) == 0;
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
61
  static inline int __raw_write_can_lock(raw_rwlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62
63
64
  {
  	return lock->lock == 0;
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
65
  static inline void __raw_read_lock(raw_rwlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
71
  {
  	long regx;
  
  	__asm__ __volatile__(
  	"1:	ldl_l	%1,%0
  "
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
72
73
74
75
  	"	blbs	%1,6f
  "
  	"	subl	%1,2,%1
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
79
80
81
82
83
84
85
  	"	stl_c	%1,%0
  "
  	"	beq	%1,6f
  "
  	"	mb
  "
  	".subsection 2
  "
  	"6:	ldl	%1,%0
  "
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
86
87
  	"	blbs	%1,6b
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
89
90
91
92
93
  	"	br	1b
  "
  	".previous"
  	: "=m" (*lock), "=&r" (regx)
  	: "m" (*lock) : "memory");
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
94
  static inline void __raw_write_lock(raw_rwlock_t *lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
95
96
97
98
99
100
  {
  	long regx;
  
  	__asm__ __volatile__(
  	"1:	ldl_l	%1,%0
  "
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
101
102
103
104
  	"	bne	%1,6f
  "
  	"	lda	%1,1
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
106
107
108
109
110
111
112
113
114
  	"	stl_c	%1,%0
  "
  	"	beq	%1,6f
  "
  	"	mb
  "
  	".subsection 2
  "
  	"6:	ldl	%1,%0
  "
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
115
116
  	"	bne	%1,6b
  "
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
  	"	br	1b
  "
  	".previous"
  	: "=m" (*lock), "=&r" (regx)
  	: "m" (*lock) : "memory");
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123

fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
124
  static inline int __raw_read_trylock(raw_rwlock_t * lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  {
  	long regx;
  	int success;
  
  	__asm__ __volatile__(
  	"1:	ldl_l	%1,%0
  "
  	"	lda	%2,0
  "
  	"	blbs	%1,2f
  "
  	"	subl	%1,2,%2
  "
  	"	stl_c	%2,%0
  "
  	"	beq	%2,6f
  "
  	"2:	mb
  "
  	".subsection 2
  "
  	"6:	br	1b
  "
  	".previous"
  	: "=m" (*lock), "=&r" (regx), "=&r" (success)
  	: "m" (*lock) : "memory");
  
  	return success;
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
154
  static inline int __raw_write_trylock(raw_rwlock_t * lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
  {
  	long regx;
  	int success;
  
  	__asm__ __volatile__(
  	"1:	ldl_l	%1,%0
  "
  	"	lda	%2,0
  "
  	"	bne	%1,2f
  "
  	"	lda	%2,1
  "
  	"	stl_c	%2,%0
  "
  	"	beq	%2,6f
  "
  	"2:	mb
  "
  	".subsection 2
  "
  	"6:	br	1b
  "
  	".previous"
  	: "=m" (*lock), "=&r" (regx), "=&r" (success)
  	: "m" (*lock) : "memory");
  
  	return success;
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
184
  static inline void __raw_read_unlock(raw_rwlock_t * lock)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
  {
  	long regx;
  	__asm__ __volatile__(
  	"	mb
  "
  	"1:	ldl_l	%1,%0
  "
  	"	addl	%1,2,%1
  "
  	"	stl_c	%1,%0
  "
  	"	beq	%1,6f
  "
  	".subsection 2
  "
  	"6:	br	1b
  "
  	".previous"
  	: "=m" (*lock), "=&r" (regx)
  	: "m" (*lock) : "memory");
  }
fb1c8f93d   Ingo Molnar   [PATCH] spinlock ...
206
207
208
209
210
  static inline void __raw_write_unlock(raw_rwlock_t * lock)
  {
  	mb();
  	lock->lock = 0;
  }
ef6edc974   Martin Schwidefsky   [PATCH] Directed ...
211
212
213
  #define _raw_spin_relax(lock)	cpu_relax()
  #define _raw_read_relax(lock)	cpu_relax()
  #define _raw_write_relax(lock)	cpu_relax()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
214
  #endif /* _ALPHA_SPINLOCK_H */