summaryrefslogtreecommitdiffstats
path: root/recipes/db/files/db5-arm-thumb-mutex.patch
blob: 51b88823cf8ec1d959e1c73adb83abc4be4ae395 (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
37
38
Index: db-5.0.21/../dbinc/mutex_int.h
===================================================================
--- db-5.0.21.orig/../dbinc/mutex_int.h	2010-03-30 10:36:09.000000000 -0700
+++ db-5.0.21/../dbinc/mutex_int.h	2010-05-22 12:07:38.281286337 -0700
@@ -474,6 +474,25 @@ typedef unsigned char tsl_t;
 
 #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 @@ typedef unsigned char tsl_t;
 	    );								\
 	__r & 1;							\
 })
+#endif
 
 #define	MUTEX_UNSET(tsl)	(*(volatile tsl_t *)(tsl) = 0)
 #define	MUTEX_INIT(tsl)         (MUTEX_UNSET(tsl), 0)