]> git.ipfire.org Git - ipfire-3.x.git/blobdiff - directfb/patches/DirectFB-1.5.3-gcc-atomics-on-arm.patch
directfb: Update to 1.5.3.
[ipfire-3.x.git] / directfb / patches / DirectFB-1.5.3-gcc-atomics-on-arm.patch
diff --git a/directfb/patches/DirectFB-1.5.3-gcc-atomics-on-arm.patch b/directfb/patches/DirectFB-1.5.3-gcc-atomics-on-arm.patch
new file mode 100644 (file)
index 0000000..1f488e9
--- /dev/null
@@ -0,0 +1,64 @@
+--- DirectFB-1.5.3_orig/lib/direct/atomic.h    2011-07-31 14:51:06.000000000 -0400
++++ DirectFB-1.5.3/lib/direct/atomic.h 2012-05-09 01:24:02.692169840 -0400
+@@ -185,20 +185,13 @@
+ #if defined(ARCH_ARM) && !defined(ARCH_IWMMXT)
+-static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int new)
++static inline int _D__atomic_cmpxchg(volatile int *ptr, int old, int _new)
+ {
+-      unsigned long oldval, res;
+-      do {
+-              __asm__ __volatile__("@ atomic_cmpxchg\n"
+-              "ldrex  %1, [%2]\n"
+-              "mov    %0, #0\n"
+-              "teq    %1, %3\n"
+-              "strexeq %0, %4, [%2]\n"
+-                  : "=&r" (res), "=&r" (oldval)
+-                  : "r" (ptr), "Ir" (old), "r" (new)
+-                  : "cc");
+-      } while (res);
++      unsigned long oldval = old;
++
++      __atomic_compare_exchange_n(ptr, &oldval, _new,
++                                  false, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);
+       return oldval;
+ }
+@@ -220,24 +213,14 @@ static inline int _D__atomic_cmpxchg(vol
+ static inline int _D__atomic_add_return(int i, volatile int *v)
+ {
+-      unsigned long tmp;
+-      int result;
+-      __asm__ __volatile__("@ atomic_add_return\n"
+-"1:   ldrex   %0, [%2]\n"
+-"     add     %0, %0, %3\n"
+-"     strex   %1, %0, [%2]\n"
+-"     teq     %1, #0\n"
+-"     bne     1b"
+-      : "=&r" (result), "=&r" (tmp)
+-      : "r" (v), "Ir" (i)
+-      : "cc");
++      int result = __atomic_add_fetch(v, i, __ATOMIC_SEQ_CST);
+       return result;
+ }
+ #define D_SYNC_ADD_AND_FETCH( ptr, value )                                           \
+-     (_D__atomic_add_return( (int) (value), (void*) (ptr) ))
++     (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) ))
+ #endif
+@@ -308,7 +291,7 @@ static inline int _D__atomic_add_return(
+ }
+ #define D_SYNC_ADD_AND_FETCH( ptr, value )                                           \
+-     (_D__atomic_add_return( (int) (value), (void*) (ptr) ))
++     (_D__atomic_add_return( (int) (value), (volatile int*) (ptr) ))
+ #endif