This patch adds AVR32 pthread, old Linux threads, support.

Signed-off-by: Hans-Christian Egtvedt <[EMAIL PROTECTED]>
--- 

diff --git a/libpthread/linuxthreads.old/sysdeps/avr32/pt-machine.h 
b/libpthread/linuxthreads.old/sysdeps/avr32/pt-machine.h
new file mode 100644
index 0000000..eccf329
--- /dev/null
+++ b/libpthread/linuxthreads.old/sysdeps/avr32/pt-machine.h
@@ -0,0 +1,73 @@
+/* Machine-dependent pthreads configuration and inline functions.
+ *
+ * Copyright (C) 2005-2007 Atmel Corporation
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser General
+ * Public License.  See the file "COPYING.LIB" in the main directory of this
+ * archive for more details.
+ */
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H   1
+
+#include <features.h>
+
+static inline int
+_test_and_set (int *p, int v)
+{
+       int result;
+
+       __asm__ __volatile__(
+               "/* Inline test and set */\n"
+               "       xchg    %[old], %[mem], %[new]"
+               : [old] "=&r"(result)
+               : [mem] "r"(p), [new] "r"(v)
+               : "memory");
+
+       return result;
+}
+
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Spinlock implementation; required.  */
+PT_EI long int
+testandset (int *spinlock)
+{
+       return _test_and_set(spinlock, 1);
+}
+
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  stack_pointer
+register char * stack_pointer __asm__ ("sp");
+
+/* Compare-and-swap for semaphores. */
+
+#define HAS_COMPARE_AND_SWAP
+PT_EI int
+__compare_and_swap(long int *p, long int oldval, long int newval)
+{
+       long int result;
+
+       __asm__ __volatile__(
+               "/* Inline compare and swap */\n"
+               "1:     ssrf    5\n"
+               "       ld.w    %[result], %[mem]\n"
+               "       eor     %[result], %[old]\n"
+               "       brne    2f\n"
+               "       stcond  %[mem], %[new]\n"
+               "       brne    1b\n"
+               "2:"
+               : [result] "=&r"(result), [mem] "=m"(*p)
+               : "m"(*p), [new] "r"(newval), [old] "r"(oldval)
+               : "cc", "memory");
+
+       return result == 0;
+}
+
+#endif /* pt-machine.h */
diff --git a/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h 
b/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h
new file mode 100644
index 0000000..fe12bf8
--- /dev/null
+++ b/libpthread/linuxthreads/sysdeps/avr32/pt-machine.h
@@ -0,0 +1,73 @@
+/* Machine-dependent pthreads configuration and inline functions.
+ *
+ * Copyright (C) 2005-2007 Atmel Corporation
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser General
+ * Public License.  See the file "COPYING.LIB" in the main directory of this
+ * archive for more details.
+ */
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H   1
+
+#include <features.h>
+
+static inline int
+_test_and_set (int *p, int v) __THROW
+{
+       int result;
+
+       __asm__ __volatile__(
+               "/* Inline test and set */\n"
+               "       xchg    %[old], %[mem], %[new]"
+               : [old] "=&r"(result)
+               : [mem] "r"(p), [new] "r"(v)
+               : "memory");
+
+       return result;
+}
+
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long int *p, long int oldval, long int newval);
+
+/* Spinlock implementation; required.  */
+PT_EI long int
+testandset (int *spinlock)
+{
+       return _test_and_set(spinlock, 1);
+}
+
+
+/* Get some notion of the current stack.  Need not be exactly the top
+   of the stack, just something somewhere in the current frame.  */
+#define CURRENT_STACK_FRAME  stack_pointer
+register char * stack_pointer __asm__ ("sp");
+
+/* Compare-and-swap for semaphores. */
+
+#define HAS_COMPARE_AND_SWAP
+PT_EI int
+__compare_and_swap(long int *p, long int oldval, long int newval)
+{
+       int result;
+
+       __asm__ __volatile__(
+               "/* Inline compare and swap */\n"
+               "1:     ssrf    5\n"
+               "       ld.w    %[result], %[mem]\n"
+               "       eor     %[result], %[old]\n"
+               "       brne    2f\n"
+               "       stcond  %[mem], %[new]\n"
+               "       brne    1b\n"
+               "2:"
+               : [result] "=&r"(result), [mem] "=m"(*p)
+               : "m"(*p), [new] "r"(newval), [old] "r"(oldval)
+               : "cc", "memory");
+
+       return result == 0;
+}
+
+#endif /* pt-machine.h */
_______________________________________________
uClibc mailing list
uClibc@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to