[PATCH 09/10] microblaze: thread support

Steven J. Magnani steve at digidescorp.com
Tue Oct 5 14:23:22 UTC 2010


Header files needed to build linuxthreads.old for microblaze.

Signed-off-by: Steven J. Magnani <steve at digidescorp.com>
---
diff -uprN a/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h
--- a/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h	1969-12-31 18:00:00.000000000 -0600
+++ b/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h	2010-09-21 20:10:23.000000000 -0500
@@ -0,0 +1,111 @@
+/*
+ * sysdeps/microblaze/pt-machine.h -- microblaze-specific pthread definitions
+ *
+ *  Copyright (C) 2003 John Williams <jwilliams at itee.uq.edu.au>
+ *  Copyright (C) 2002  NEC Electronics Corporation
+ *  Copyright (C) 2002  Miles Bader <miles at 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 at 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 at 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)
+{
+	char ret;
+	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));
+		ret=1;
+	}
+	else
+	{
+		*spinlock=1;
+		/* Enable ints */
+		__asm__ __volatile__ ("mts	rmsr, %0;" :: "r" (psw));
+		ret=0;
+	}
+
+  return ret;
+}
+
+#endif
+#endif /* pt-machine.h */
diff -uprN a/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h b/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h
--- a/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h	1969-12-31 18:00:00.000000000 -0600
+++ b/libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h	2010-09-21 20:10:23.000000000 -0500
@@ -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 at 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 at gnu.org>
+ */
+
+#include <signal.h>
+
+#define SIGCONTEXT struct sigcontext *
+#define SIGCONTEXT_EXTRA_ARGS
diff -uprN a/libc/sysdeps/linux/microblaze/sys/procfs.h b/libc/sysdeps/linux/microblaze/sys/procfs.h
--- a/libc/sysdeps/linux/microblaze/sys/procfs.h	1969-12-31 18:00:00.000000000 -0600
+++ b/libc/sysdeps/linux/microblaze/sys/procfs.h	2010-09-21 20:10:24.000000000 -0500
@@ -0,0 +1,145 @@
+/* Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _SYS_PROCFS_H
+#define _SYS_PROCFS_H	1
+
+/* This is somewhat modelled after the file of the same name on SVR4
+   systems.  It provides a definition of the core file format for ELF
+   used on Linux.  It doesn't have anything to do with the /proc file
+   system, even though Linux has one.
+
+   Anyway, the whole purpose of this file is for GDB and GDB only.
+   Don't read too much into it.  Don't use it for anything other than
+   GDB unless you know what you are doing.  */
+
+#include <features.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+
+/* Type for a general-purpose register.  */
+#ifndef ELF_GREG_T
+#define ELF_GREG_T
+typedef unsigned long elf_greg_t;
+#endif
+
+/* This is exactly the same as `struct pt_regs' in the kernel.  */
+struct elf_gregset
+{
+	elf_greg_t gpr[32];	/* General purpose registers.  */
+
+	elf_greg_t pc;		/* program counter */
+	elf_greg_t psw;		/* program status word */
+	elf_greg_t ear;		/* Exception address register */
+	elf_greg_t esr;		/* Excep[tion Status Register */
+	elf_greg_t fsr;		/* FPU Status register */
+
+	elf_greg_t kernel_mode;	/* 1 if in `kernel mode', 0 if user mode */
+	elf_greg_t single_step;	/* 1 if in single step mode */
+};
+
+#ifndef ELF_NGREG
+#define ELF_NGREG (sizeof (struct elf_gregset) / sizeof(elf_greg_t))
+#endif
+
+#ifndef ELF_GREGSET_T
+#define ELF_GREGSET_T
+typedef elf_greg_t elf_gregset_t[ELF_NGREG];
+#endif
+
+/* Register set for the floating-point registers.  */
+#ifndef ELF_FPREGSET_T
+#define ELF_FPREGSET_T
+typedef elf_greg_t elf_fpregset_t;
+#endif
+
+struct elf_siginfo
+{
+	int	si_signo;			/* signal number */
+	int	si_code;			/* extra code */
+	int	si_errno;			/* errno */
+};
+
+
+/*
+ * Definitions to generate Intel SVR4-like core files.
+ * These mostly have the same names as the SVR4 types with "elf_"
+ * tacked on the front to prevent clashes with linux definitions,
+ * and the typedef forms have been avoided.  This is mostly like
+ * the SVR4 structure, but more Linuxy, with things that Linux does
+ * not support and which gdb doesn't really use excluded.
+ * Fields present but not used are marked with "XXX".
+ */
+struct elf_prstatus
+{
+	struct elf_siginfo pr_info;	/* Info associated with signal */
+	short	pr_cursig;		/* Current signal */
+	unsigned long pr_sigpend;	/* Set of pending signals */
+	unsigned long pr_sighold;	/* Set of held signals */
+	__kernel_pid_t	pr_pid;
+	__kernel_pid_t	pr_ppid;
+	__kernel_pid_t	pr_pgrp;
+	__kernel_pid_t	pr_sid;
+	struct timeval pr_utime;	/* User time */
+	struct timeval pr_stime;	/* System time */
+	struct timeval pr_cutime;	/* Cumulative user time */
+	struct timeval pr_cstime;	/* Cumulative system time */
+	elf_gregset_t pr_reg;	/* GP registers */
+	int pr_fpvalid;		/* True if math co-processor being used.  */
+};
+
+#define ELF_PRARGSZ	(80)	/* Number of chars for args */
+
+struct elf_prpsinfo
+{
+	char	pr_state;	/* numeric process state */
+	char	pr_sname;	/* char for pr_state */
+	char	pr_zomb;	/* zombie */
+	char	pr_nice;	/* nice val */
+	unsigned long pr_flag;	/* flags */
+	__kernel_uid_t	pr_uid;
+	__kernel_gid_t	pr_gid;
+	__kernel_pid_t	pr_pid, pr_ppid, pr_pgrp, pr_sid;
+	/* Lots missing */
+	char	pr_fname[16];	/* filename of executable */
+	char	pr_psargs[ELF_PRARGSZ];	/* initial part of arg list */
+};
+
+
+/* The rest of this file provides the types for emulation of the
+   Solaris <proc_service.h> interfaces that should be implemented by
+   users of libthread_db.  */
+
+/* Addresses.  */
+typedef void *psaddr_t;
+
+/* Register sets.  Linux has different names.  */
+typedef elf_gregset_t prgregset_t;
+typedef elf_fpregset_t prfpregset_t;
+
+/* We don't have any differences between processes and threads,
+   therefore have only one PID type.  */
+typedef __kernel_pid_t lwpid_t;
+
+/* Process status and info.  In the end we do provide typedefs for them.  */
+typedef struct elf_prstatus prstatus_t;
+typedef struct elf_prpsinfo prpsinfo_t;
+
+
+#endif	/* sys/procfs.h */




More information about the uClibc mailing list