+#define atomic_long_t atomic_t
+#define atomic_long_set atomic_set
+#define atomic_long_read atomic_read
+
+#include "asm.h"
+
+//#define __xg(x) ((volatile long *)(x))
+
+#define cmpxchg(ptr, o, n) \
+ ((__typeof__(*(ptr)))__cmpxchg((ptr), (unsigned long)(o), \
+ (unsigned long)(n), sizeof(*(ptr))))
+
+//#define local_cmpxchg cmpxchg
+#define local_cmpxchg(l, o, n) (cmpxchg(&((l)->a.counter), (o), (n)))
+
+#define atomic_long_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), (old), (new)))
+
+
+/* LOCAL OPS */
+
+//typedef int local_t;
+typedef struct
+{
+ atomic_long_t a;
+} local_t;
+
+
+static inline void local_inc(local_t *l)
+{
+ (l->a.counter)++;
+}
+
+static inline void local_set(local_t *l, int v)
+{
+ l->a.counter = v;
+}
+
+static inline void local_add(int v, local_t *l)
+{
+ l->a.counter += v;
+}
+
+static int local_add_return(int v, local_t *l)
+{
+ return l->a.counter += v;
+}
+
+static inline int local_read(local_t *l)
+{
+ return l->a.counter;
+}
+
+
+/* ATTRIBUTES */