aboutsummaryrefslogtreecommitdiffstats
path: root/recipes/db/db-5.1.19/arm-thumb-mutex_db5.patch
blob: 51d485499e6bbca9ab9f09964294c01e382b6c03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
--- db-5.1.19/src/dbinc/mutex_int.h.orig	2011-01-05 19:21:42.181805366 -0600
+++ db-5.1.19/src/dbinc/mutex_int.h	2011-01-05 19:24:53.141853117 -0600
@@ -474,6 +474,25 @@
 
 #ifdef LOAD_ACTUAL_MUTEX_CODE
 /* gcc/arm: 0 is clear, 1 is set. */
+#if defined __thumb__
+#define	MUTEX_SET(tsl) ({						\
+	int __r, __p;							\
+	__asm__ volatile(						\
+		".align 2\n\t"                                          \
+		"bx     pc\n\t"                                         \
+		"nop\n\t"                                               \
+		".arm\n\t"                                              \
+		"swpb   %0, %2, [%3]\n\t"                               \
+		"eor    %0, %0, #1\n\t"                                 \
+		"orr    %1, pc, #1\n\t"                                 \
+		"bx     %1\n\t"                                         \
+		".force_thumb"                                          \
+	    : "=&r" (__r), "=r" (__p)                                   \
+	    : "r" (1), "r" (tsl)                                        \
+	    );                                                          \
+	__r & 1;							\
+})
+#else
 #define	MUTEX_SET(tsl) ({						\
 	int __r;							\
 	__asm__ volatile(						\
@@ -484,6 +503,7 @@
 	    );								\
 	__r & 1;							\
 })
+#endif
 
 #define	MUTEX_UNSET(tsl)	(*(volatile tsl_t *)(tsl) = 0)
 #define	MUTEX_INIT(tsl)         (MUTEX_UNSET(tsl), 0)