12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #ifndef _MIPS_SPINLOCK_H_
- #define _MIPS_SPINLOCK_H_
- #include <cdefs.h>
- typedef unsigned spinlock_data_t;
- #define SPINLOCK_DATA_INITIALIZER 0
- void spinlock_data_set(volatile spinlock_data_t *sd, unsigned val);
- spinlock_data_t spinlock_data_get(volatile spinlock_data_t *sd);
- spinlock_data_t spinlock_data_testandset(volatile spinlock_data_t *sd);
- SPINLOCK_INLINE
- void
- spinlock_data_set(volatile spinlock_data_t *sd, unsigned val)
- {
- *sd = val;
- }
- SPINLOCK_INLINE
- spinlock_data_t
- spinlock_data_get(volatile spinlock_data_t *sd)
- {
- return *sd;
- }
- SPINLOCK_INLINE
- spinlock_data_t
- spinlock_data_testandset(volatile spinlock_data_t *sd)
- {
- spinlock_data_t x;
- spinlock_data_t y;
-
- y = 1;
- __asm volatile(
- ".set push;"
- ".set mips32;"
- ".set volatile;"
- "ll %0, 0(%2);"
- "sc %1, 0(%2);"
- ".set pop"
- : "=r" (x), "+r" (y) : "r" (sd));
- if (y == 0) {
- return 1;
- }
- return x;
- }
- #endif
|