summaryrefslogtreecommitdiff
path: root/toolchain/uclibc/patches/0.9.34-git/0001-fix-linuxthreads-for-coldfire-nommu.patch
blob: 4f8320c34e3223b494a88f39a8b85f4b3ff11328 (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
From 45064565100b67ff2f960e93d580449b720a66c9 Mon Sep 17 00:00:00 2001
From: Waldemar Brodkorb <wbx@openadk.org>
Date: Sat, 6 Sep 2014 01:52:10 +0200
Subject: [PATCH] fix linuxthreads for coldfire nommu

Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
---
 libpthread/linuxthreads/sysdeps/m68k/pspinlock.c     | 20 +++++++++++++++-----
 libpthread/linuxthreads/sysdeps/m68k/pt-machine.h    | 11 +++++++++--
 libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c |  2 ++
 3 files changed, 26 insertions(+), 7 deletions(-)

diff --git a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c
index c26a278..af77c2a 100644
--- a/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c
+++ b/libpthread/linuxthreads/sysdeps/m68k/pspinlock.c
@@ -27,10 +27,15 @@ __pthread_spin_lock (pthread_spinlock_t *lock)
   unsigned int val;
 
   do
-    __asm__ __volatile__ ("tas %1; sne %0"
-		  : "=dm" (val), "=m" (*lock)
-		  : "m" (*lock)
-		  : "cc");
+    __asm__ __volatile__ (
+#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000)
+		"tas %1; sne %0"
+#else
+		"bset #7,%1; sne %0"
+#endif
+		: "=dm" (val), "=m" (*lock)
+		: "m" (*lock)
+		: "cc");
   while (val);
 
   return 0;
@@ -43,7 +48,12 @@ __pthread_spin_trylock (pthread_spinlock_t *lock)
 {
   unsigned int val;
 
-  __asm__ __volatile__ ("tas %1; sne %0"
+  __asm__ __volatile__ (
+#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000)
+		"tas %1; sne %0"
+#else
+		"bset #7,%1; sne %0"
+#endif
 		: "=dm" (val), "=m" (*lock)
 		: "m" (*lock)
 		: "cc");
diff --git a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h
index e2d7bdc..1eb9fd5 100644
--- a/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h
+++ b/libpthread/linuxthreads/sysdeps/m68k/pt-machine.h
@@ -28,12 +28,18 @@
 #endif
 
 /* Spinlock implementation; required.  */
+PT_EI long int testandset (int *spinlock);
 PT_EI long int
 testandset (int *spinlock)
 {
   char ret;
 
-  __asm__ __volatile__("tas %1; sne %0"
+  __asm__ __volatile__(
+#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__m68000)
+	"tas %1; sne %0"
+#else
+	"bset #7,%1; sne %0"
+#endif
        : "=dm"(ret), "=m"(*spinlock)
        : "m"(*spinlock)
        : "cc");
@@ -50,6 +56,7 @@ register char * stack_pointer __asm__ ("%sp");
 
 /* Compare-and-swap for semaphores. */
 
+#if !defined(__mcoldfire__) && !defined(__mcf5200__) && !defined(__mc68000)
 #define HAS_COMPARE_AND_SWAP
 PT_EI int
 __compare_and_swap (long int *p, long int oldval, long int newval)
@@ -63,5 +70,5 @@ __compare_and_swap (long int *p, long int oldval, long int newval)
 
   return ret;
 }
-
+#endif
 #endif /* pt-machine.h */
diff --git a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c
index 706faef..634c752 100644
--- a/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c
+++ b/libpthread/linuxthreads/sysdeps/pthread/herrno-loc.c
@@ -16,7 +16,9 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <netdb.h>
+#ifdef __UCLIBC_HAS_TLS__
 #include <tls.h>
+#endif
 #include <linuxthreads/internals.h>
 #include <sysdep-cancel.h>
 
-- 
2.0.1