OSDN Git Service

microblaze: thread support
authorSteven J. Magnani <steve@digidescorp.com>
Wed, 10 Nov 2010 18:37:26 +0000 (19:37 +0100)
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Wed, 10 Nov 2010 18:44:37 +0000 (19:44 +0100)
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>
libc/sysdeps/linux/microblaze/sys/procfs.h [new file with mode: 0644]
libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h [new file with mode: 0644]
libpthread/linuxthreads.old/sysdeps/microblaze/sigcontextinfo.h [new file with mode: 0644]

diff --git a/libc/sysdeps/linux/microblaze/sys/procfs.h b/libc/sysdeps/linux/microblaze/sys/procfs.h
new file mode 100644 (file)
index 0000000..8fb87ef
--- /dev/null
@@ -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 */
diff --git a/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h b/libpthread/linuxthreads.old/sysdeps/microblaze/pt-machine.h
new file mode 100644 (file)
index 0000000..e8c03f9
--- /dev/null
@@ -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 (file)
index 0000000..de450ff
--- /dev/null
@@ -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