#define read_barrier() membar_safe("#LoadLoad")
#define write_barrier() membar_safe("#StoreStore")
+typedef struct {
+ volatile unsigned char lock;
+} spinlock_t;
+
+static inline void spin_lock(spinlock_t *lock)
+{
+ unsigned long tmp;
+
+ __asm__ __volatile__(
+ "1: ldstub [%1], %0\n"
+ " membar #StoreLoad | #StoreStore\n"
+ " brnz,pn %0, 2f\n"
+ " nop\n"
+ " .subsection 2\n"
+ "2: ldub [%1], %0\n"
+ " membar #LoadLoad\n"
+ " brnz,pt %0, 2b\n"
+ " nop\n"
+ " ba,a,pt %%xcc, 1b\n"
+ " .previous"
+ : "=&r" (tmp)
+ : "r" (lock)
+ : "memory");
+}
+
+static inline void spin_unlock(spinlock_t *lock)
+{
+ __asm__ __volatile__(
+ " membar #StoreStore | #LoadStore\n"
+ " stb %%g0, [%0]"
+ : /* No outputs */
+ : "r" (lock)
+ : "memory");
+}
+
#endif