1 #ifndef _SPARC64_SEMAPHORE_H
2 #define _SPARC64_SEMAPHORE_H
4 /* These are actually reasonable on the V9. */
7 #include <asm/atomic.h>
8 #include <asm/system.h>
13 wait_queue_head_t wait
;
20 # define __SEM_DEBUG_INIT(name) \
21 , (long)&(name).__magic
23 # define __SEM_DEBUG_INIT(name)
26 #define __SEMAPHORE_INITIALIZER(name,count) \
27 { ATOMIC_INIT(count), ATOMIC_INIT(0), __WAIT_QUEUE_HEAD_INITIALIZER((name).wait) \
28 __SEM_DEBUG_INIT(name) }
30 #define __MUTEX_INITIALIZER(name) \
31 __SEMAPHORE_INITIALIZER(name,1)
33 #define __DECLARE_SEMAPHORE_GENERIC(name,count) \
34 struct semaphore name = __SEMAPHORE_INITIALIZER(name,count)
36 #define DECLARE_MUTEX(name) __DECLARE_SEMAPHORE_GENERIC(name,1)
37 #define DECLARE_MUTEX_LOCKED(name) __DECLARE_SEMAPHORE_GENERIC(name,0)
39 extern inline void sema_init (struct semaphore
*sem
, int val
)
41 atomic_set(&sem
->count
, val
);
42 atomic_set(&sem
->waking
, 0);
43 init_waitqueue_head(&sem
->wait
);
45 sem
->__magic
= (long)&sem
->__magic
;
49 static inline void init_MUTEX (struct semaphore
*sem
)
54 static inline void init_MUTEX_LOCKED (struct semaphore
*sem
)
59 extern void __down(struct semaphore
* sem
);
60 extern int __down_interruptible(struct semaphore
* sem
);
61 extern int __down_trylock(struct semaphore
* sem
);
62 extern void __up(struct semaphore
* sem
);
64 extern __inline__
void down(struct semaphore
* sem
)
67 CHECK_MAGIC(sem
->__magic
);
69 __asm__
__volatile__("
90 restore %%l3, %%g0, %%g3
92 : : "r" (__atomic_fool_gcc(sem
)), "i" (__down
)
93 : "g5", "g7", "memory", "cc");
96 extern __inline__
int down_interruptible(struct semaphore
*sem
)
101 CHECK_MAGIC(sem
->__magic
);
103 __asm__
__volatile__("
115 save %%sp, -160, %%sp
125 restore %%o0, %%g0, %0
128 : "0" (ret
), "r" (__atomic_fool_gcc(sem
)), "i" (__down_interruptible
)
129 : "g5", "g7", "memory", "cc");
133 extern inline int down_trylock(struct semaphore
*sem
)
137 CHECK_MAGIC(sem
->__magic
);
139 __asm__
__volatile__("
151 save %%sp, -160, %%sp
161 restore %%o0, %%g0, %0
164 : "0" (ret
), "r" (__atomic_fool_gcc(sem
)), "i" (__down_trylock
)
165 : "g5", "g7", "memory", "cc");
169 extern __inline__
void up(struct semaphore
* sem
)
172 CHECK_MAGIC(sem
->__magic
);
174 __asm__
__volatile__("
175 membar #StoreLoad | #LoadLoad
187 save %%sp, -160, %%sp
196 restore %%l3, %%g0, %%g3
198 : : "r" (__atomic_fool_gcc(sem
)), "i" (__up
)
199 : "g5", "g7", "memory", "cc");
202 #endif /* __KERNEL__ */
204 #endif /* !(_SPARC64_SEMAPHORE_H) */