summaryrefslogtreecommitdiff
path: root/meta/packages/db/files/arm-thumb-mutex.patch
blob: acd446fcd849670b6a99ae39543cb93cff932939 (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-4.3.29-dist/../dbinc/mutex.h	2005-11-15 07:33:27.761042518 -0800
+++ db-4.3.29-dist/../dbinc/mutex.h	2005-11-15 07:55:24.823920060 -0800
@@ -470,6 +470,25 @@
 #ifdef LOAD_ACTUAL_MUTEX_CODE
 #define	MUTEX_SET_TEST	1		/* 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(							\
@@ -480,6 +499,7 @@
 	    );								\
 	__r & 1;							\
 })
+#endif
 
 #define	MUTEX_UNSET(tsl)	(*(volatile tsl_t *)(tsl) = 0)
 #define	MUTEX_INIT(tsl)		MUTEX_UNSET(tsl)