X-Git-Url: https://git.kernel.dk/?p=fio.git;a=blobdiff_plain;f=arch%2Farch-ppc.h;h=4839122e9328688a486aaff57b83ddcbcfbbafa5;hp=061153873131db5964ca650a6d255e72b8035866;hb=69ebbd397e80b23ec4281c99e9f7242a089cc771;hpb=bd2626f02a51ff50664616cd7c6c4daa479a84af diff --git a/arch/arch-ppc.h b/arch/arch-ppc.h index 06115387..4839122e 100644 --- a/arch/arch-ppc.h +++ b/arch/arch-ppc.h @@ -44,4 +44,38 @@ static inline int arch_ffz(unsigned long bitmask) } #define ARCH_HAVE_FFZ +typedef struct { + volatile unsigned int lock; +} spinlock_t; + +static inline void spin_trylock(spinlock_t *lock) +{ + unsigned long tmp; + + __asm__ __volatile__( + "1: lwarx %0,0,%2\n\ + cmpwi 0,%0,0\n\ + bne- 2f\n\ + stwcx. 1,0,%2\n\ + bne- 1b\n\ + isync\n\ + 2:" : "=&r" (tmp) + : (&lock->lock) + : "cr0", "memory"); + + return tmp; +} + +static inline void spin_lock(spinlock_t *lock) +{ + while (spin_trylock(lock)) + ; +} + +static inline void spin_unlock(spinlock_t *lock) +{ + read_barrier(); + lock->lock = 0; +} + #endif