#define read_barrier() __asm__ __volatile__("mb": : :"memory")
#define writer_barrier() __asm__ __volatile__("wmb": : :"memory")
+typedef struct {
+ volatile unsigned int lock;
+} spinlock_t;
+
+static inline void spin_lock(spinlock_t *lock)
+{
+ long tmp;
+
+ __asm__ __volatile__("1: ldl_l %0,%1\n"
+ " bne %0,2f\n"
+ " lda %0,1\n"
+ " stl_c %0,%1\n"
+ " beq %0,2f\n"
+ " mb\n"
+ ".subsection 2\n"
+ "2: ldl %0,%1\n"
+ " bne %0,2b\n"
+ " br 1b\n"
+ ".previous"
+ : "=&r" (tmp), "=m" (lock->lock)
+ : "m"(lock->lock) : "memory");
+}
+
+static inline void spin_unlock(spinlock_t *lock)
+{
+ read_barrier();
+ lock->lock = 0;
+}
+
+#define __SPIN_LOCK_UNLOCKED { 0 }
+
#endif