summaryrefslogtreecommitdiff
path: root/packages/qte/qte-4.0.0-snapshot/add-qatomic.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/qte/qte-4.0.0-snapshot/add-qatomic.patch')
-rw-r--r--packages/qte/qte-4.0.0-snapshot/add-qatomic.patch72
1 files changed, 72 insertions, 0 deletions
diff --git a/packages/qte/qte-4.0.0-snapshot/add-qatomic.patch b/packages/qte/qte-4.0.0-snapshot/add-qatomic.patch
index e69de29bb2..8fea162691 100644
--- a/packages/qte/qte-4.0.0-snapshot/add-qatomic.patch
+++ b/packages/qte/qte-4.0.0-snapshot/add-qatomic.patch
@@ -0,0 +1,72 @@
+
+#
+# Patch managed by http://www.holgerschurig.de/patcher.html
+#
+
+--- /dev/null
++++ qt-embedded-opensource-4.0.0-b1/src/core/arch/arm/qatomic.cpp
+@@ -0,0 +1,64 @@
++#include <qhash.h>
++
++#define UNLOCKED {-1,-1,-1,-1}
++#define UNLOCKED2 UNLOCKED,UNLOCKED
++#define UNLOCKED4 UNLOCKED2,UNLOCKED2
++#define UNLOCKED8 UNLOCKED4,UNLOCKED4
++#define UNLOCKED16 UNLOCKED8,UNLOCKED8
++#define UNLOCKED32 UNLOCKED16,UNLOCKED16
++#define UNLOCKED64 UNLOCKED32,UNLOCKED32
++#define UNLOCKED128 UNLOCKED64,UNLOCKED64
++#define UNLOCKED256 UNLOCKED128,UNLOCKED128
++
++// use a 4k page for locks
++static int locks[256][4] = { UNLOCKED256 };
++
++int *getLock(volatile void *addr)
++{ return locks[qHash(const_cast<void *>(addr)) % 256]; }
++
++static int *align16(int *lock)
++{
++ ulong off = (((ulong) lock) % 16);
++ return off ? (int *)(ulong(lock) + 16 - off) : lock;
++}
++
++extern "C" {
++
++ int q_ldcw(volatile int *addr);
++
++ void q_atomic_lock(int *lock)
++ {
++ // ldcw requires a 16-byte aligned address
++ volatile int *x = align16(lock);
++ // FIXME WHERE IS q_ldcw ??? while (q_ldcw(x) == 0)
++ ;
++ }
++
++ void q_atomic_unlock(int *lock)
++ { lock[0] = lock[1] = lock[2] = lock[3] = -1; }
++
++ int q_atomic_test_and_set_ptr(volatile void *ptr, void *expected, void *newval)
++ {
++ int *lock = getLock(ptr);
++ q_atomic_lock(lock);
++ if (*reinterpret_cast<void * volatile *>(ptr) == expected) {
++ *reinterpret_cast<void * volatile *>(ptr) = newval;
++ q_atomic_unlock(lock);
++ return 1;
++ }
++ q_atomic_unlock(lock);
++ return 0;
++ }
++
++ void *q_atomic_set_ptr(volatile void *ptr, void *newval)
++ {
++ int *lock = getLock(ptr);
++ q_atomic_lock(lock);
++ void *oldval = *reinterpret_cast<void * volatile *>(ptr);
++ *reinterpret_cast<void * volatile *>(ptr) = newval;
++ q_atomic_unlock(lock);
++ return oldval;
++ }
++
++}
++