From 87fd5816c9a14c4457cb69afaece1d28e66256fa Mon Sep 17 00:00:00 2001
From: "Steven J. Magnani" <steve@digidescorp.com>
Date: Wed, 10 Nov 2010 19:37:26 +0100
Subject: microblaze: thread support

Header files needed to build linuxthreads.old for microblaze.

Signed-off-by: Steven J. Magnani <steve@digidescorp.com>
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
---
 .../sysdeps/microblaze/pt-machine.h                | 106 +++++++++++++++++++++
 .../sysdeps/microblaze/sigcontextinfo.h            |  17 ++++
 2 files changed, 123 insertions(+)
 create mode 100644 libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h
 create mode 100644 libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h

(limited to 'libpthread')

diff --git a/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h
new file mode 100644
index 000000000..e8c03f9e5
--- /dev/null
+++ b/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h
@@ -0,0 +1,106 @@
+/*
+ * sysdeps/microblaze/pt-machine.h -- microblaze-specific pthread definitions
+ *
+ *  Copyright (C) 2003 John Williams <jwilliams@itee.uq.edu.au>
+ *  Copyright (C) 2002  NEC Electronics Corporation
+ *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
+ *
+ * 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.
+ *
+ * Written by Miles Bader <miles@gnu.org>
+ */
+
+#ifndef _PT_MACHINE_H
+#define _PT_MACHINE_H   1
+
+#include <features.h>
+
+#ifndef PT_EI
+# define PT_EI extern inline
+#endif
+
+extern long int testandset (int *spinlock);
+extern int __compare_and_swap (long *ptr, long old, long new);
+
+/* 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__ ("r1");
+
+#define HAS_COMPARE_AND_SWAP
+#define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS
+#define IMPLEMENT_TAS_WITH_CAS
+
+/* Atomically:  If *PTR == OLD, set *PTR to NEW and return true,
+   otherwise do nothing and return false.  */
+PT_EI int __compare_and_swap (long *ptr, long old, long new)
+{
+  unsigned long psw;
+
+  /* disable interrupts  */
+  /* This is ugly ugly ugly! */
+  __asm__ __volatile__ ("mfs	%0, rmsr;"
+			"andi	r3, %0, ~2;"
+			"mts	rmsr, r3;"
+			: "=&r" (psw)
+			:
+			: "r3");
+
+  if (likely (*ptr == old))
+    {
+      *ptr = new;
+      __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw)); /* re-enable */
+      return 1;
+    }
+  else
+    {
+      __asm__ __volatile__ ("mts rmsr, %0;" :: "r" (psw)); /* re-enable */
+      return 0;
+    }
+}
+
+/* like above's __compare_and_swap() but it first syncs the memory
+   (This is also the difference between both functions in e.g.
+    ../powerpc/pt-machine.h)
+   Doing this additional sync fixes a hang of __pthread_alt_unlock()
+   (Falk Brettschneider <fbrettschneider@baumeroptronic.de>) */
+PT_EI int
+__compare_and_swap_with_release_semantics (long *p,
+					   long oldval, long newval)
+{
+  __asm__ __volatile__ ("" : : : "memory"); /*MEMORY_BARRIER ();*/
+  return __compare_and_swap (p, oldval, newval);
+}
+
+
+#ifndef IMPLEMENT_TAS_WITH_CAS
+/* Spinlock implementation; required.  */
+PT_EI long int testandset (int *spinlock)
+{
+	unsigned psw;
+
+	/* disable interrupts */
+	__asm__ __volatile__ ("mfs	%0, rmsr;"
+			      "andi	r3, %0, ~2;"
+			       "mts	rmsr, r3;"
+			: "=&r" (psw)
+			:
+			: "r3");
+
+	if (*spinlock)
+	{
+		/* Enable ints */
+		__asm__ __volatile__ ("mts	rmsr, %0;" :: "r" (psw));
+		return 1;
+	} else {
+		*spinlock=1;
+		/* Enable ints */
+		__asm__ __volatile__ ("mts	rmsr, %0;" :: "r" (psw));
+		return 0;
+	}
+}
+
+#endif
+#endif /* pt-machine.h */
diff --git a/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h b/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h
new file mode 100644
index 000000000..de450ff8a
--- /dev/null
+++ b/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h
@@ -0,0 +1,17 @@
+/*
+ * sysdeps/v850/sigcontextinfo.h -- v850-specific pthread signal definitions
+ *
+ *  Copyright (C) 2002  NEC Electronics Corporation
+ *  Copyright (C) 2002  Miles Bader <miles@gnu.org>
+ *
+ * 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.
+ *
+ * Written by Miles Bader <miles@gnu.org>
+ */
+
+#include <signal.h>
+
+#define SIGCONTEXT struct sigcontext *
+#define SIGCONTEXT_EXTRA_ARGS
-- 
cgit v1.2.3