[PATCH 5/7] add AVR32 pthread support

Hans-Christian Egtvedt hcegtvedt at atmel.com
Tue Nov 6 07:50:08 UTC 2007


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

Signed-off-by: Hans-Christian Egtvedt <hcegtvedt at atmel.com>
--- 

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 */



More information about the uClibc mailing list