More stuff
authorDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sun, 5 Oct 2008 19:27:14 +0000 (15:27 -0400)
committerDavid Bartley <dtbartle@maltodextrin.csclub.uwaterloo.ca>
Sun, 5 Oct 2008 19:27:14 +0000 (15:27 -0400)
50 files changed:
dirent/dirent.h
include/features.h
io/ftw.h
nptl/allocatestack.c
nptl/init.c
nptl/pthread_create.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/abstime-to-reltime.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/aio_misc.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/cond_reltimedwait.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mutex_reltimedlock.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreadP.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_barrier_destroy.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_barrier_wait.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthread_once.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/pthreaddef.h
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thr_getspecific.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thr_keycreate_once.c
nptl/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thr_setspecific.c
nptl_db/sysdeps/unix/sysv/linux/proc_service.h [deleted file]
nptl_db/sysdeps/unix/sysv/linux/thread_db.h [deleted file]
nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile [deleted file]
nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h [deleted file]
nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h [deleted file]
sysdeps/unix/make-syscalls.sh
sysdeps/unix/sysv/linux/proc_service.h [new file with mode: 0644]
sysdeps/unix/sysv/linux/thread_db.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Versions
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/aio_sigqueue.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/siginfo.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/sigstack.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/types.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/bits/uio.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/gai_sigqueue.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/grantpt.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/i386/__door_return.S
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/i386/door-offsets.sym
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/init-first.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.h [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_sun.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/net/if.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mnttab.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/ucontext.h
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/syscalls.list
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/unlockpt.c
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/zone.c

index 4ef894b..d15b27b 100644 (file)
@@ -93,7 +93,7 @@ typedef __ino64_t ino64_t;
 #endif
 
 
-#if defined(__USE_BSD) && defined(_DIRENT_HAVE_D_TYPE)
+#if defined(__USE_GNU) || (defined(__USE_BSD) && defined(_DIRENT_HAVE_D_TYPE))
 /* File types for `d_type'.  */
 enum
   {
index 7e14ab1..167a534 100644 (file)
@@ -40,7 +40,7 @@
    _SVID_SOURCE                ISO C, POSIX, and SVID things.
    _ATFILE_SOURCE      Additional *at interfaces.
    _GNU_SOURCE         All of the above, plus GNU extensions.
-   _SUN_SOURCE         Turns on Sun compatibility mode.
+   _SUN_SOURCE         Defines things that Sun expects.
    _REENTRANT          Select additionally reentrant object.
    _THREAD_SAFE                Same as _REENTRANT, often used by other systems.
    _FORTIFY_SOURCE     If set to numeric value > 0 additional security
 #undef __USE_MISC
 #undef __USE_ATFILE
 #undef __USE_GNU
+#undef __USE_SUN
 #undef __USE_REENTRANT
 #undef __USE_FORTIFY_LEVEL
 #undef __FAVOR_BSD
 
 /* If _SUN_SOURCE was defined by the user we enable Sun compatibility mode.  */
 #if defined (_SUN_SOURCE) && !defined (_POSIX_PTHREAD_SEMANTICS)
-# undef __SUN_COMPAT_MODE
-# define __SUN_COMPAT_MODE     1
+# undef __USE_SUN
+# define __USE_SUN     1
+# undef  _BSD_SOURCE
+# define _BSD_SOURCE   1
+# undef  _SVID_SOURCE
+# define _SVID_SOURCE  1
+# undef  _ATFILE_SOURCE
+# define _ATFILE_SOURCE        1
 #endif
 
 /* If nothing (other than _GNU_SOURCE) is defined,
index 4bdff88..56fe128 100644 (file)
--- a/io/ftw.h
+++ b/io/ftw.h
@@ -61,7 +61,7 @@ enum
 };
 
 
-#ifdef __USE_XOPEN_EXTENDED
+#if defined(__USE_XOPEN_EXTENDED) || defined(__USE_SUN)
 /* Flags for fourth argument of `nftw'.  */
 enum
 {
index 5c67aa9..2db8cbd 100644 (file)
@@ -33,7 +33,7 @@
 #include <kernel-features.h>
 
 
-#ifndef NEED_SEPARATE_REGISTER_STACK
+#if defined(NEED_SEPARATE_REGISTER_STACK) && !defined(NEED_STACK_SIZE)
 
 /* Most architectures have exactly one stack pointer.  Some have more.  */
 # define STACK_VARIABLES void *stackaddr = NULL
index cfec00e..20c1fb3 100644 (file)
@@ -131,10 +131,6 @@ static const struct pthread_functions pthread_functions =
 #endif
 
 
-#ifdef PLATFORM_STATIC_DECLS
-PLATFORM_STATIC_DECLS
-#endif
-
 
 /* For asynchronous cancellation we use a signal.  This is the handler.  */
 static void
index a713bdb..7368df8 100644 (file)
@@ -272,6 +272,10 @@ start_thread (void *arg)
 #endif
 #endif
 
+#ifdef PLATFORM_THREAD_START
+PLATFORM_THREAD_START
+#endif
+
   /* If the parent was running cancellation handlers while creating
      the thread the new thread inherited the signal mask.  Reset the
      cancellation signal mask.  */
index 1111b71..77373d1 100644 (file)
@@ -23,7 +23,7 @@
 static inline struct timespec * abstime_to_reltime (
     const struct timespec *abstime, struct timespec *reltime)
 {
-  if(!abstime)
+  if (!abstime)
     return NULL;
 
   struct timespec now;
index 8ad086c..0568129 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <pthreadP.h>
 #include <thread.h>
+#include <sys/syscall.h>
 
 /* This has to be relative or we'll end up including nptl's version.  */
 #include "../../../../../../sysdeps/pthread/aio_misc.h"
@@ -25,8 +26,6 @@
 /* We can use cond_timedwait, since it returns EINTR, but it can also return
   ETIME. We get around this by defining a small inline wrapper.  */
 
-#undef DONT_NEED_AIO_MISC_COND
-
 static inline int
 __aio_pthread_cond_wait (pthread_cond_t *cond, pthread_mutex_t *mutex)
 {
index 99e98fa..61af00a 100644 (file)
@@ -82,7 +82,9 @@ __cond_reltimedwait_internal (cond, mutex, reltime, cancel)
   };
 
   /* Reject invalid timeouts.  */
-  if (INVALID_TIMESPEC (reltime))
+  if (PAST_TIMESPEC (reltime))
+    return ETIME;
+  else if (INVALID_TIMESPEC (reltime))
     return EINVAL;
 
   if ((mutex->mutex_type & LOCK_ERRORCHECK) && MUTEX_NOT_OWNER (mutex))
index 09e6687..870b0ac 100644 (file)
@@ -61,7 +61,9 @@ int __mutex_reltimedlock (mutex, reltime)
     }
 
   /* Reject invalid timeouts.  */
-  if (INVALID_TIMESPEC (reltime))
+  if (PAST_TIMESPEC (reltime))
+    return ETIME;
+  else if (INVALID_TIMESPEC (reltime))
     return EINVAL;
 
   int errval;
@@ -77,9 +79,9 @@ int __mutex_reltimedlock (mutex, reltime)
       INTERNAL_SYSCALL_DECL (err);
       if (reltime)
         {
-          int result = INTERNAL_SYSCALL (nanosleep, err, 2, reltime, reltime);
+          int res = INTERNAL_SYSCALL (nanosleep, err, 2, reltime, reltime);
           do
-            errval = INTERNAL_SYSCALL_ERRNO (result, err) ? EINTR : ETIMEDOUT;
+            errval = INTERNAL_SYSCALL_ERRNO (res, err) ? EINTR : ETIMEDOUT;
           while (errval == EINTR);
         }
       else
index 515db97..0da124e 100644 (file)
@@ -62,8 +62,9 @@
 
 #define MUTEX_NOT_OWNER(mutex)  (! MUTEX_IS_OWNER (mutex))
 
-#define INVALID_TIMESPEC(tv)    ((tv) && ((tv)->tv_sec < 0 || \
-    (tv)->tv_nsec < 0 || (tv)->tv_nsec >= 1000000000))
+#define PAST_TIMESPEC(tv)      ((tv) && (tv)->tv_sec < 0)
+#define INVALID_TIMESPEC(tv)    ((tv) && ((tv)->tv_nsec < 0 || \
+       (tv)->tv_nsec >= 1000000000))
 
 #include <sys/types.h>
 #include <sys/syscall.h>
index 670b270..6ef6bde 100644 (file)
@@ -30,7 +30,7 @@ pthread_barrier_destroy (barrier)
 {
   struct pthread_barrier *ibarrier = (struct pthread_barrier *) barrier;
 
-  int errval = pthread_mutex_lock (&ibarrier->mutex);
+  int errval = __pthread_mutex_lock (&ibarrier->mutex);
   if (errval != 0)
     return EINVAL;
 
@@ -46,6 +46,6 @@ pthread_barrier_destroy (barrier)
   if (__builtin_expect (ibarrier->left != ibarrier->init_count, 0))
     errval = EBUSY;
 
-  (void)pthread_mutex_unlock (&ibarrier->mutex);
+  (void)__pthread_mutex_unlock (&ibarrier->mutex);
   return errval;
 }
index 8ee2672..58a4565 100644 (file)
@@ -32,7 +32,7 @@ pthread_barrier_wait (barrier)
 {
   struct pthread_barrier *ibarrier = (struct pthread_barrier *) barrier;
 
-  int errval = pthread_mutex_lock (&ibarrier->mutex);
+  int errval = __pthread_mutex_lock (&ibarrier->mutex);
   if (errval != 0)
     return errval;
 
@@ -43,7 +43,7 @@ pthread_barrier_wait (barrier)
         (mutex_t *)&ibarrier->mutex, NULL, 0);
       if (errval != EINTR && errval != 0)
         {
-          (void)pthread_mutex_unlock (&ibarrier->mutex);
+          (void)__pthread_mutex_unlock (&ibarrier->mutex);
           return errval;
         }
     }
@@ -73,7 +73,7 @@ pthread_barrier_wait (barrier)
               (mutex_t *)&ibarrier->mutex, NULL, 0);
           if (errval != EINTR && errval != 0)
             {
-              (void)pthread_mutex_unlock (&ibarrier->mutex);
+              (void)__pthread_mutex_unlock (&ibarrier->mutex);
               return errval;
             }
         }
@@ -87,6 +87,6 @@ pthread_barrier_wait (barrier)
       (void)pthread_cond_broadcast (&ibarrier->cond);
     }
 
-  (void)pthread_mutex_unlock (&ibarrier->mutex);
+  (void)__pthread_mutex_unlock (&ibarrier->mutex);
   return errval;
 }
index fb579f5..0f46245 100644 (file)
@@ -33,7 +33,7 @@ clear_once_control (void *arg)
   pthread_once_t *once_control = (pthread_once_t *) arg;
 
   *once_control = 0;
-  (void)pthread_mutex_unlock (&once_lock);
+  (void)__pthread_mutex_unlock (&once_lock);
 }
 
 /* XXX: This code breaks with fork - but so does sun's libc.  */
@@ -45,7 +45,7 @@ __pthread_once (once_control, init_routine)
 {
   if (*once_control == PTHREAD_ONCE_INIT)
     {
-      (void)pthread_mutex_lock (&once_lock);
+      (void)__pthread_mutex_lock (&once_lock);
 
       if (*once_control == PTHREAD_ONCE_INIT)
        {
@@ -61,7 +61,7 @@ __pthread_once (once_control, init_routine)
          *once_control = !PTHREAD_ONCE_INIT;
        }
 
-      pthread_mutex_unlock (&once_lock);
+      __pthread_mutex_unlock (&once_lock);
     }
 
   return 0;
index 383e5fd..62c126b 100644 (file)
    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
    02111-1307 USA.  */
 
-#include <ucontext.h>
-#include <signal.h>
-
 /* Get the arch-specific version.  */
 #include_next <pthreaddef.h>
 
 /* Register atfork handlers to protect signal_lock.  */
 extern void sigaction_atfork (void);
 
-/* TODO: Need to deal with stacks that grow up.  */
-#define PLATFORM_PTHREAD_INIT                                       \
-    sigaction_atfork ();                                            \
-    THREAD_SETMEM (pd, main_thread, 1);                             \
-    ucontext_t _ctx;                                                \
-    if (getcontext (&_ctx) == 0)                                    \
-      {                                                             \
-        THREAD_SETMEM (pd, stackblock, _ctx.uc_stack.ss_sp -        \
-            _ctx.uc_stack.ss_size);                                 \
-        THREAD_SETMEM (pd, stackblock_size, _ctx.uc_stack.ss_size); \
-      }
-
 /* We need to tell the kernel about the allocated stack.  */
-#define PLATFORM_THREAD_START                                       \
-    {                                                               \
-        stack_t stack;                                              \
-        stack.ss_sp = pd->stackblock;                               \
-        stack.ss_sp = pd->stackblock_size;                          \
-        stack.ss_flags = 0;                                         \
-        setustack (&stack);                                         \
+#define PLATFORM_THREAD_START                   \
+    {                                           \
+      pd->stack.ss_sp = pd->stackblock;         \
+      pd->stack.ss_sp = pd->stackblock_size;    \
+      pd->stack.ss_flags = 0;                   \
+      setustack (&pd->stack);                   \
     }
 
+#ifndef __stack_t_defined
+# define __need_stack_t
+# include <bits/sigstack.h>
+#endif
+
+#define PLATFORM_PTHREAD_INIT                       \
+    sigaction_atfork ();                            \
+    THREAD_SETMEM (pd, main_thread, 1);             \
+    stack_t *_stack;                                \
+       if (getustack (&_stack) == 0 && _stack)         \
+      {                                             \
+        pd->stackblock = _stack->ss_sp;             \
+        pd->stackblock_size = _stack->ss_size;      \
+      }                                             \
+    PLATFORM_THREAD_START
+
 /* Additional descr fields.  */
-# define PLATFORM_DESCR_FIELDS              \
-    int sigpipe_disabled;                   \
-    int main_thread;
+# define PLATFORM_DESCR_FIELDS  \
+    int sigpipe_disabled;       \
+    int main_thread;            \
+    stack_t stack;
 
-/* If we call this then the getcontext call above failed.  */
-#define GET_MAIN_STACK_INFO(stackaddr, stacksize)   ENOSYS
+/* stackblock/stackblock_size should always be filled.  */
+#define GET_MAIN_STACK_INFO(stackaddr, stacksize)      ENOSYS
 
 /* Use tid as pthread_t (instead of descr).  */
 #define PTHREAD_T_IS_TID
index 242e2af..7229c4a 100644 (file)
@@ -32,6 +32,6 @@ int thr_getspecific (key, valuep)
   if (KEY_UNUSED (seq) || KEY_USABLE (seq))
     return EINVAL;
 
-  *valuep = pthread_getspecific (key);
+  *valuep = __pthread_getspecific (key);
   return 0;
 }
index 2be3fc3..0d3e79a 100644 (file)
@@ -30,13 +30,13 @@ int thr_keycreate_once (keyp, destructor)
 
   if (*keyp)
     {
-      errval = pthread_mutex_lock (&mutex);
+      errval = __pthread_mutex_lock (&mutex);
       if (errval == 0)
         {
           if (*keyp)
             errval = pthread_key_create (keyp, destructor);
 
-          pthread_mutex_unlock (&mutex);
+          __pthread_mutex_unlock (&mutex);
         }
     }
 
index 3e56e8f..910f787 100644 (file)
@@ -32,6 +32,6 @@ int thr_setspecific (key, value)
   if (KEY_UNUSED (seq) || KEY_USABLE (seq))
     return EINVAL;
 
-  pthread_setspecific (key, value);
+  __pthread_setspecific (key, value);
   return 0;
 }
diff --git a/nptl_db/sysdeps/unix/sysv/linux/proc_service.h b/nptl_db/sysdeps/unix/sysv/linux/proc_service.h
deleted file mode 100644 (file)
index d49e87a..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Callback interface for libthread_db, functions users must define.
-   Copyright (C) 1999,2002,2003 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.  */
-
-/* The definitions in this file must correspond to those in the debugger.  */
-#include <sys/procfs.h>
-
-/* Functions in this interface return one of these status codes.  */
-typedef enum
-{
-  PS_OK,               /* Generic "call succeeded".  */
-  PS_ERR,              /* Generic error. */
-  PS_BADPID,           /* Bad process handle.  */
-  PS_BADLID,           /* Bad LWP identifier.  */
-  PS_BADADDR,          /* Bad address.  */
-  PS_NOSYM,            /* Could not find given symbol.  */
-  PS_NOFREGS           /* FPU register set not available for given LWP.  */
-} ps_err_e;
-
-
-/* This type is opaque in this interface.
-   It's defined by the user of libthread_db.  */
-struct ps_prochandle;
-
-
-/* Read or write process memory at the given address.  */
-extern ps_err_e ps_pdread (struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
-extern ps_err_e ps_pdwrite (struct ps_prochandle *,
-                           psaddr_t, const void *, size_t);
-extern ps_err_e ps_ptread (struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
-extern ps_err_e ps_ptwrite (struct ps_prochandle *,
-                           psaddr_t, const void *, size_t);
-
-
-/* Get and set the given LWP's general or FPU register set.  */
-extern ps_err_e ps_lgetregs (struct ps_prochandle *,
-                            lwpid_t, prgregset_t);
-extern ps_err_e ps_lsetregs (struct ps_prochandle *,
-                            lwpid_t, const prgregset_t);
-extern ps_err_e ps_lgetfpregs (struct ps_prochandle *,
-                              lwpid_t, prfpregset_t *);
-extern ps_err_e ps_lsetfpregs (struct ps_prochandle *,
-                              lwpid_t, const prfpregset_t *);
-
-/* Return the PID of the process.  */
-extern pid_t ps_getpid (struct ps_prochandle *);
-
-/* Fetch the special per-thread address associated with the given LWP.
-   This call is only used on a few platforms (most use a normal register).
-   The meaning of the `int' parameter is machine-dependent.  */
-extern ps_err_e ps_get_thread_area (const struct ps_prochandle *,
-                                   lwpid_t, int, psaddr_t *);
-
-
-/* Look up the named symbol in the named DSO in the symbol tables
-   associated with the process being debugged, filling in *SYM_ADDR
-   with the corresponding run-time address.  */
-extern ps_err_e ps_pglobal_lookup (struct ps_prochandle *,
-                                  const char *object_name,
-                                  const char *sym_name,
-                                  psaddr_t *sym_addr);
-
-
-/* Stop or continue the entire process.  */
-extern ps_err_e ps_pstop (const struct ps_prochandle *);
-extern ps_err_e ps_pcontinue (const struct ps_prochandle *);
-
-/* Stop or continue the given LWP alone.  */
-extern ps_err_e ps_lstop (const struct ps_prochandle *, lwpid_t);
-extern ps_err_e ps_lcontinue (const struct ps_prochandle *, lwpid_t);
diff --git a/nptl_db/sysdeps/unix/sysv/linux/thread_db.h b/nptl_db/sysdeps/unix/sysv/linux/thread_db.h
deleted file mode 100644 (file)
index 433b54f..0000000
+++ /dev/null
@@ -1,459 +0,0 @@
-/* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
-   Copyright (C) 1999,2001,2002,2003 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 _THREAD_DB_H
-#define _THREAD_DB_H   1
-
-/* This is the debugger interface for the NPTL library.  It is
-   modelled closely after the interface with same names in Solaris
-   with the goal to share the same code in the debugger.  */
-#include <pthread.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/procfs.h>
-
-
-/* Error codes of the library.  */
-typedef enum
-{
-  TD_OK,         /* No error.  */
-  TD_ERR,        /* No further specified error.  */
-  TD_NOTHR,      /* No matching thread found.  */
-  TD_NOSV,       /* No matching synchronization handle found.  */
-  TD_NOLWP,      /* No matching light-weighted process found.  */
-  TD_BADPH,      /* Invalid process handle.  */
-  TD_BADTH,      /* Invalid thread handle.  */
-  TD_BADSH,      /* Invalid synchronization handle.  */
-  TD_BADTA,      /* Invalid thread agent.  */
-  TD_BADKEY,     /* Invalid key.  */
-  TD_NOMSG,      /* No event available.  */
-  TD_NOFPREGS,   /* No floating-point register content available.  */
-  TD_NOLIBTHREAD, /* Application not linked with thread library.  */
-  TD_NOEVENT,    /* Requested event is not supported.  */
-  TD_NOCAPAB,    /* Capability not available.  */
-  TD_DBERR,      /* Internal debug library error.  */
-  TD_NOAPLIC,    /* Operation is not applicable.  */
-  TD_NOTSD,      /* No thread-specific data available.  */
-  TD_MALLOC,     /* Out of memory.  */
-  TD_PARTIALREG,  /* Not entire register set was read or written.  */
-  TD_NOXREGS,    /* X register set not available for given thread.  */
-  TD_TLSDEFER,   /* Thread has not yet allocated TLS for given module.  */
-  TD_NOTALLOC = TD_TLSDEFER,
-  TD_VERSION,    /* Version if libpthread and libthread_db do not match.  */
-  TD_NOTLS       /* There is no TLS segment in the given module.  */
-} td_err_e;
-
-
-/* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
-   select threads regardless of state in td_ta_thr_iter().  */
-typedef enum
-{
-  TD_THR_ANY_STATE,
-  TD_THR_UNKNOWN,
-  TD_THR_STOPPED,
-  TD_THR_RUN,
-  TD_THR_ACTIVE,
-  TD_THR_ZOMBIE,
-  TD_THR_SLEEP,
-  TD_THR_STOPPED_ASLEEP
-} td_thr_state_e;
-
-/* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
-   to select threads regardless of type in td_ta_thr_iter().  */
-typedef enum
-{
-  TD_THR_ANY_TYPE,
-  TD_THR_USER,
-  TD_THR_SYSTEM
-} td_thr_type_e;
-
-
-/* Types of the debugging library.  */
-
-/* Handle for a process.  This type is opaque.  */
-typedef struct td_thragent td_thragent_t;
-
-/* The actual thread handle type.  This is also opaque.  */
-typedef struct td_thrhandle
-{
-  td_thragent_t *th_ta_p;
-  psaddr_t th_unique;
-} td_thrhandle_t;
-
-
-/* Forward declaration of a type defined by and for the dynamic linker.  */
-struct link_map;
-
-
-/* Flags for `td_ta_thr_iter'.  */
-#define TD_THR_ANY_USER_FLAGS  0xffffffff
-#define TD_THR_LOWEST_PRIORITY -20
-#define TD_SIGNO_MASK          NULL
-
-
-#define TD_EVENTSIZE   2
-#define BT_UISHIFT     5 /* log base 2 of BT_NBIPUI, to extract word index */
-#define BT_NBIPUI      (1 << BT_UISHIFT)       /* n bits per uint */
-#define BT_UIMASK      (BT_NBIPUI - 1)         /* to extract bit index */
-
-/* Bitmask of enabled events. */
-typedef struct td_thr_events
-{
-  uint32_t event_bits[TD_EVENTSIZE];
-} td_thr_events_t;
-
-/* Event set manipulation macros. */
-#define __td_eventmask(n) \
-  (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
-#define __td_eventword(n) \
-  ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
-
-#define td_event_emptyset(setp) \
-  do {                                                                       \
-    int __i;                                                                 \
-    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
-      (setp)->event_bits[__i - 1] = 0;                                       \
-  } while (0)
-
-#define td_event_fillset(setp) \
-  do {                                                                       \
-    int __i;                                                                 \
-    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
-      (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);                   \
-  } while (0)
-
-#define td_event_addset(setp, n) \
-  (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
-#define td_event_delset(setp, n) \
-  (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
-#define td_eventismember(setp, n) \
-  (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
-#if TD_EVENTSIZE == 2
-# define td_eventisempty(setp) \
-  (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
-#else
-# error "td_eventisempty must be changed to match TD_EVENTSIZE"
-#endif
-
-/* Events reportable by the thread implementation.  */
-typedef enum
-{
-  TD_ALL_EVENTS,                /* Pseudo-event number.  */
-  TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
-  TD_READY,                     /* Is executable now. */
-  TD_SLEEP,                     /* Blocked in a synchronization obj.  */
-  TD_SWITCHTO,                  /* Now assigned to a process.  */
-  TD_SWITCHFROM,                /* Not anymore assigned to a process.  */
-  TD_LOCK_TRY,                  /* Trying to get an unavailable lock.  */
-  TD_CATCHSIG,                  /* Signal posted to the thread.  */
-  TD_IDLE,                      /* Process getting idle.  */
-  TD_CREATE,                    /* New thread created.  */
-  TD_DEATH,                     /* Thread terminated.  */
-  TD_PREEMPT,                   /* Preempted.  */
-  TD_PRI_INHERIT,               /* Inherited elevated priority.  */
-  TD_REAP,                      /* Reaped.  */
-  TD_CONCURRENCY,               /* Number of processes changing.  */
-  TD_TIMEOUT,                   /* Conditional variable wait timed out.  */
-  TD_MIN_EVENT_NUM = TD_READY,
-  TD_MAX_EVENT_NUM = TD_TIMEOUT,
-  TD_EVENTS_ENABLE = 31                /* Event reporting enabled.  */
-} td_event_e;
-
-/* Values representing the different ways events are reported.  */
-typedef enum
-{
-  NOTIFY_BPT,                  /* User must insert breakpoint at u.bptaddr. */
-  NOTIFY_AUTOBPT,              /* Breakpoint at u.bptaddr is automatically
-                                  inserted.  */
-  NOTIFY_SYSCALL               /* System call u.syscallno will be invoked.  */
-} td_notify_e;
-
-/* Description how event type is reported.  */
-typedef struct td_notify
-{
-  td_notify_e type;            /* Way the event is reported.  */
-  union
-  {
-    psaddr_t bptaddr;          /* Address of breakpoint.  */
-    int syscallno;             /* Number of system call used.  */
-  } u;
-} td_notify_t;
-
-/* Structure used to report event.  */
-typedef struct td_event_msg
-{
-  td_event_e event;            /* Event type being reported.  */
-  const td_thrhandle_t *th_p;  /* Thread reporting the event.  */
-  union
-  {
-# if 0
-    td_synchandle_t *sh;       /* Handle of synchronization object.  */
-#endif
-    uintptr_t data;            /* Event specific data.  */
-  } msg;
-} td_event_msg_t;
-
-/* Structure containing event data available in each thread structure.  */
-typedef struct
-{
-  td_thr_events_t eventmask;   /* Mask of enabled events.  */
-  td_event_e eventnum;         /* Number of last event.  */
-  void *eventdata;             /* Data associated with event.  */
-} td_eventbuf_t;
-
-
-/* Gathered statistics about the process.  */
-typedef struct td_ta_stats
-{
-  int nthreads;                /* Total number of threads in use.  */
-  int r_concurrency;           /* Concurrency level requested by user.  */
-  int nrunnable_num;           /* Average runnable threads, numerator.  */
-  int nrunnable_den;           /* Average runnable threads, denominator.  */
-  int a_concurrency_num;       /* Achieved concurrency level, numerator.  */
-  int a_concurrency_den;       /* Achieved concurrency level, denominator.  */
-  int nlwps_num;               /* Average number of processes in use,
-                                  numerator.  */
-  int nlwps_den;               /* Average number of processes in use,
-                                  denominator.  */
-  int nidle_num;               /* Average number of idling processes,
-                                  numerator.  */
-  int nidle_den;               /* Average number of idling processes,
-                                  denominator.  */
-} td_ta_stats_t;
-
-
-/* Since Sun's library is based on Solaris threads we have to define a few
-   types to map them to POSIX threads.  */
-typedef pthread_t thread_t;
-typedef pthread_key_t thread_key_t;
-
-
-/* Callback for iteration over threads.  */
-typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
-
-/* Callback for iteration over thread local data.  */
-typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
-
-
-
-/* Forward declaration.  This has to be defined by the user.  */
-struct ps_prochandle;
-
-
-/* Information about the thread.  */
-typedef struct td_thrinfo
-{
-  td_thragent_t *ti_ta_p;              /* Process handle.  */
-  unsigned int ti_user_flags;          /* Unused.  */
-  thread_t ti_tid;                     /* Thread ID returned by
-                                          pthread_create().  */
-  char *ti_tls;                                /* Pointer to thread-local data.  */
-  psaddr_t ti_startfunc;               /* Start function passed to
-                                          pthread_create().  */
-  psaddr_t ti_stkbase;                 /* Base of thread's stack.  */
-  long int ti_stksize;                 /* Size of thread's stack.  */
-  psaddr_t ti_ro_area;                 /* Unused.  */
-  int ti_ro_size;                      /* Unused.  */
-  td_thr_state_e ti_state;             /* Thread state.  */
-  unsigned char ti_db_suspended;       /* Nonzero if suspended by debugger. */
-  td_thr_type_e ti_type;               /* Type of the thread (system vs
-                                          user thread).  */
-  intptr_t ti_pc;                      /* Unused.  */
-  intptr_t ti_sp;                      /* Unused.  */
-  short int ti_flags;                  /* Unused.  */
-  int ti_pri;                          /* Thread priority.  */
-  lwpid_t ti_lid;                      /* Kernel PID for this thread.  */
-  sigset_t ti_sigmask;                 /* Signal mask.  */
-  unsigned char ti_traceme;            /* Nonzero if event reporting
-                                          enabled.  */
-  unsigned char ti_preemptflag;                /* Unused.  */
-  unsigned char ti_pirecflag;          /* Unused.  */
-  sigset_t ti_pending;                 /* Set of pending signals.  */
-  td_thr_events_t ti_events;           /* Set of enabled events.  */
-} td_thrinfo_t;
-
-
-
-/* Prototypes for exported library functions.  */
-
-/* Initialize the thread debug support library.  */
-extern td_err_e td_init (void);
-
-/* Historical relict.  Should not be used anymore.  */
-extern td_err_e td_log (void);
-
-/* Return list of symbols the library can request.  */
-extern const char **td_symbol_list (void);
-
-/* Generate new thread debug library handle for process PS.  */
-extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
-
-/* Free resources allocated for TA.  */
-extern td_err_e td_ta_delete (td_thragent_t *__ta);
-
-/* Get number of currently running threads in process associated with TA.  */
-extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
-
-/* Return process handle passed in `td_ta_new' for process associated with
-   TA.  */
-extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
-                             struct ps_prochandle **__ph);
-
-/* Map thread library handle PT to thread debug library handle for process
-   associated with TA and store result in *TH.  */
-extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
-                                 td_thrhandle_t *__th);
-
-/* Map process ID LWPID to thread debug library handle for process
-   associated with TA and store result in *TH.  */
-extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
-                                  td_thrhandle_t *__th);
-
-
-/* Call for each thread in a process associated with TA the callback function
-   CALLBACK.  */
-extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
-                               td_thr_iter_f *__callback, void *__cbdata_p,
-                               td_thr_state_e __state, int __ti_pri,
-                               sigset_t *__ti_sigmask_p,
-                               unsigned int __ti_user_flags);
-
-/* Call for each defined thread local data entry the callback function KI.  */
-extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
-                               void *__p);
-
-
-/* Get event address for EVENT.  */
-extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
-                                 td_event_e __event, td_notify_t *__ptr);
-
-/* Enable EVENT in global mask.  */
-extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
-                                td_thr_events_t *__event);
-
-/* Disable EVENT in global mask.  */
-extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
-                                  td_thr_events_t *__event);
-
-/* Return information about last event.  */
-extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
-                                   td_event_msg_t *__msg);
-
-
-/* Set suggested concurrency level for process associated with TA.  */
-extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
-
-
-/* Enable collecting statistics for process associated with TA.  */
-extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
-
-/* Reset statistics.  */
-extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
-
-/* Retrieve statistics from process associated with TA.  */
-extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
-                                td_ta_stats_t *__statsp);
-
-
-/* Validate that TH is a thread handle.  */
-extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
-
-/* Return information about thread TH.  */
-extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
-                                td_thrinfo_t *__infop);
-
-/* Retrieve floating-point register contents of process running thread TH.  */
-extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
-                                 prfpregset_t *__regset);
-
-/* Retrieve general register contents of process running thread TH.  */
-extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
-                                prgregset_t __gregs);
-
-/* Retrieve extended register contents of process running thread TH.  */
-extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
-
-/* Get size of extended register set of process running thread TH.  */
-extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
-
-/* Set floating-point register contents of process running thread TH.  */
-extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
-                                 const prfpregset_t *__fpregs);
-
-/* Set general register contents of process running thread TH.  */
-extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
-                                prgregset_t __gregs);
-
-/* Set extended register contents of process running thread TH.  */
-extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
-                                const void *__addr);
-
-
-/* Get address of the given module's TLS storage area for the given thread.  */
-extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
-                               unsigned long int __modid,
-                               psaddr_t *__base);
-
-/* Get address of thread local variable.  */
-extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
-                                    psaddr_t __map_address, size_t __offset,
-                                    psaddr_t *__address);
-
-
-/* Enable reporting for EVENT for thread TH.  */
-extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
-
-/* Enable EVENT for thread TH.  */
-extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
-                                 td_thr_events_t *__event);
-
-/* Disable EVENT for thread TH.  */
-extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
-                                   td_thr_events_t *__event);
-
-/* Get event message for thread TH.  */
-extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
-                                    td_event_msg_t *__msg);
-
-
-/* Set priority of thread TH.  */
-extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
-
-
-/* Set pending signals for thread TH.  */
-extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
-                                     unsigned char __n, const sigset_t *__ss);
-
-/* Set signal mask for thread TH.  */
-extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
-                                  const sigset_t *__ss);
-
-
-/* Return thread local data associated with key TK in thread TH.  */
-extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
-                           const thread_key_t __tk, void **__data);
-
-
-/* Suspend execution of thread TH.  */
-extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
-
-/* Resume execution of thread TH.  */
-extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
-
-#endif /* thread_db.h */
diff --git a/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile b/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
deleted file mode 100644 (file)
index 8aff4c7..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-ifeq ($(subdir),nptl_db)
-headers += proc_service.h
-endif
diff --git a/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h b/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h
deleted file mode 100644 (file)
index 38d92ad..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-/* Callback interface for libthread_db, functions users must define.
-   Copyright (C) 1999,2002,2003 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 _PROC_SERVICE_H
-#define _PROC_SERVICE_H
-
-/* The definitions in this file must correspond to those in the debugger.  */
-#include <sys/procfs_isa.h>
-#include <elf.h>
-#include <features.h>
-
-#ifdef _LP64
-typedef Elf64_Sym      ps_sym_t;
-#else
-typedef Elf32_Sym      ps_sym_t;
-#endif
-
-/* Functions in this interface return one of these status codes.  */
-typedef enum
-{
-  PS_OK,               /* Generic "call succeeded".  */
-  PS_ERR,              /* Generic error. */
-  PS_BADPID,           /* Bad process handle.  */
-  PS_BADLID,           /* Bad LWP identifier.  */
-  PS_BADADDR,          /* Bad address.  */
-  PS_NOSYM,            /* Could not find given symbol.  */
-  PS_NOFREGS           /* FPU register set not available for given LWP.  */
-} ps_err_e;
-
-#define PS_OBJ_EXEC    ((const char *)0x0)
-#define PS_OBJ_LDSO    ((const char *)0x1)
-
-/* This type is opaque in this interface.
-   It's defined by the user of libthread_db.  */
-struct ps_prochandle;
-
-__BEGIN_DECLS
-
-/* Read or write process memory at the given address.  */
-extern ps_err_e ps_pread(struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
-extern ps_err_e ps_pwrite(struct ps_prochandle *,
-                          psaddr_t, const void *, size_t);
-extern ps_err_e ps_pdread (struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
-extern ps_err_e ps_pdwrite (struct ps_prochandle *,
-                           psaddr_t, const void *, size_t);
-extern ps_err_e ps_ptread (struct ps_prochandle *,
-                          psaddr_t, void *, size_t);
-extern ps_err_e ps_ptwrite (struct ps_prochandle *,
-                           psaddr_t, const void *, size_t);
-
-
-/* Get and set the given LWP's general or FPU register set.  */
-extern ps_err_e ps_lgetregs (struct ps_prochandle *,
-                            lwpid_t, prgregset_t);
-extern ps_err_e ps_lsetregs (struct ps_prochandle *,
-                            lwpid_t, const prgregset_t);
-extern ps_err_e ps_lgetfpregs (struct ps_prochandle *,
-                              lwpid_t, prfpregset_t *);
-extern ps_err_e ps_lsetfpregs (struct ps_prochandle *,
-                              lwpid_t, const prfpregset_t *);
-
-/* Fetch the special per-thread address associated with the given LWP.
-   This call is only used on a few platforms (most use a normal register).
-   The meaning of the `int' parameter is machine-dependent.  */
-extern ps_err_e ps_get_thread_area (const struct ps_prochandle *,
-                                   lwpid_t, int, psaddr_t *);
-
-
-/* Look up the named symbol in the named DSO in the symbol tables
-   associated with the process being debugged, filling in *SYM_ADDR
-   with the corresponding run-time address.  */
-extern ps_err_e ps_pglobal_lookup (struct ps_prochandle *,
-                                  const char *object_name,
-                                  const char *sym_name,
-                                  psaddr_t *sym_addr);
-
-
-/* Stop or continue the entire process.  */
-extern ps_err_e ps_pstop (struct ps_prochandle *);
-extern ps_err_e ps_pcontinue (struct ps_prochandle *);
-
-/* Stop or continue the given LWP alone.  */
-extern ps_err_e ps_lstop (struct ps_prochandle *, lwpid_t);
-extern ps_err_e ps_lcontinue (struct ps_prochandle *, lwpid_t);
-
-__END_DECLS
-
-#endif /* _PROC_SERVICE_H */
diff --git a/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h b/nptl_db/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h
deleted file mode 100644 (file)
index e9e0c5a..0000000
+++ /dev/null
@@ -1,454 +0,0 @@
-/* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
-   Copyright (C) 1999,2001,2002,2003 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 _THREAD_DB_H
-#define _THREAD_DB_H   1
-
-/* This is the debugger interface for the NPTL library.  It is
-   modelled closely after the interface with same names in Solaris
-   with the goal to share the same code in the debugger.  */
-#include <pthread.h>
-#include <stdint.h>
-#include <sys/types.h>
-#include <sys/procfs_isa.h>
-#include <thread.h>
-
-
-/* Error codes of the library.  */
-typedef enum
-{
-  TD_OK,         /* No error.  */
-  TD_ERR,        /* No further specified error.  */
-  TD_NOTHR,      /* No matching thread found.  */
-  TD_NOSV,       /* No matching synchronization handle found.  */
-  TD_NOLWP,      /* No matching light-weighted process found.  */
-  TD_BADPH,      /* Invalid process handle.  */
-  TD_BADTH,      /* Invalid thread handle.  */
-  TD_BADSH,      /* Invalid synchronization handle.  */
-  TD_BADTA,      /* Invalid thread agent.  */
-  TD_BADKEY,     /* Invalid key.  */
-  TD_NOMSG,      /* No event available.  */
-  TD_NOFPREGS,   /* No floating-point register content available.  */
-  TD_NOLIBTHREAD, /* Application not linked with thread library.  */
-  TD_NOEVENT,    /* Requested event is not supported.  */
-  TD_NOCAPAB,    /* Capability not available.  */
-  TD_DBERR,      /* Internal debug library error.  */
-  TD_NOAPLIC,    /* Operation is not applicable.  */
-  TD_NOTSD,      /* No thread-specific data available.  */
-  TD_MALLOC,     /* Out of memory.  */
-  TD_PARTIALREG,  /* Not entire register set was read or written.  */
-  TD_NOXREGS,    /* X register set not available for given thread.  */
-  TD_TLSDEFER,   /* Thread has not yet allocated TLS for given module.  */
-  TD_NOTALLOC = TD_TLSDEFER,
-  TD_VERSION,    /* Version if libpthread and libthread_db do not match.  */
-  TD_NOTLS       /* There is no TLS segment in the given module.  */
-} td_err_e;
-
-
-/* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
-   select threads regardless of state in td_ta_thr_iter().  */
-typedef enum
-{
-  TD_THR_ANY_STATE,
-  TD_THR_UNKNOWN,
-  TD_THR_STOPPED,
-  TD_THR_RUN,
-  TD_THR_ACTIVE,
-  TD_THR_ZOMBIE,
-  TD_THR_SLEEP,
-  TD_THR_STOPPED_ASLEEP
-} td_thr_state_e;
-
-/* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
-   to select threads regardless of type in td_ta_thr_iter().  */
-typedef enum
-{
-  TD_THR_ANY_TYPE,
-  TD_THR_USER,
-  TD_THR_SYSTEM
-} td_thr_type_e;
-
-
-/* Types of the debugging library.  */
-
-/* Handle for a process.  This type is opaque.  */
-typedef struct td_thragent td_thragent_t;
-
-/* The actual thread handle type.  This is also opaque.  */
-typedef struct td_thrhandle
-{
-  td_thragent_t *th_ta_p;
-  psaddr_t th_unique;
-} td_thrhandle_t;
-
-
-/* Forward declaration of a type defined by and for the dynamic linker.  */
-struct link_map;
-
-
-/* Flags for `td_ta_thr_iter'.  */
-#define TD_THR_ANY_USER_FLAGS  0xffffffff
-#define TD_THR_LOWEST_PRIORITY -20
-#define TD_SIGNO_MASK          NULL
-
-
-#define TD_EVENTSIZE   2
-#define BT_UISHIFT     5 /* log base 2 of BT_NBIPUI, to extract word index */
-#define BT_NBIPUI      (1 << BT_UISHIFT)       /* n bits per uint */
-#define BT_UIMASK      (BT_NBIPUI - 1)         /* to extract bit index */
-
-/* Bitmask of enabled events. */
-typedef struct td_thr_events
-{
-  uint32_t event_bits[TD_EVENTSIZE];
-} td_thr_events_t;
-
-/* Event set manipulation macros. */
-#define __td_eventmask(n) \
-  (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
-#define __td_eventword(n) \
-  ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
-
-#define td_event_emptyset(setp) \
-  do {                                                                       \
-    int __i;                                                                 \
-    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
-      (setp)->event_bits[__i - 1] = 0;                                       \
-  } while (0)
-
-#define td_event_fillset(setp) \
-  do {                                                                       \
-    int __i;                                                                 \
-    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
-      (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);                   \
-  } while (0)
-
-#define td_event_addset(setp, n) \
-  (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
-#define td_event_delset(setp, n) \
-  (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
-#define td_eventismember(setp, n) \
-  (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
-#if TD_EVENTSIZE == 2
-# define td_eventisempty(setp) \
-  (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
-#else
-# error "td_eventisempty must be changed to match TD_EVENTSIZE"
-#endif
-
-/* Events reportable by the thread implementation.  */
-typedef enum
-{
-  TD_ALL_EVENTS,                /* Pseudo-event number.  */
-  TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
-  TD_READY,                     /* Is executable now. */
-  TD_SLEEP,                     /* Blocked in a synchronization obj.  */
-  TD_SWITCHTO,                  /* Now assigned to a process.  */
-  TD_SWITCHFROM,                /* Not anymore assigned to a process.  */
-  TD_LOCK_TRY,                  /* Trying to get an unavailable lock.  */
-  TD_CATCHSIG,                  /* Signal posted to the thread.  */
-  TD_IDLE,                      /* Process getting idle.  */
-  TD_CREATE,                    /* New thread created.  */
-  TD_DEATH,                     /* Thread terminated.  */
-  TD_PREEMPT,                   /* Preempted.  */
-  TD_PRI_INHERIT,               /* Inherited elevated priority.  */
-  TD_REAP,                      /* Reaped.  */
-  TD_CONCURRENCY,               /* Number of processes changing.  */
-  TD_TIMEOUT,                   /* Conditional variable wait timed out.  */
-  TD_MIN_EVENT_NUM = TD_READY,
-  TD_MAX_EVENT_NUM = TD_TIMEOUT,
-  TD_EVENTS_ENABLE = 31                /* Event reporting enabled.  */
-} td_event_e;
-
-/* Values representing the different ways events are reported.  */
-typedef enum
-{
-  NOTIFY_BPT,                  /* User must insert breakpoint at u.bptaddr. */
-  NOTIFY_AUTOBPT,              /* Breakpoint at u.bptaddr is automatically
-                                  inserted.  */
-  NOTIFY_SYSCALL               /* System call u.syscallno will be invoked.  */
-} td_notify_e;
-
-/* Description how event type is reported.  */
-typedef struct td_notify
-{
-  td_notify_e type;            /* Way the event is reported.  */
-  union
-  {
-    psaddr_t bptaddr;          /* Address of breakpoint.  */
-    int syscallno;             /* Number of system call used.  */
-  } u;
-} td_notify_t;
-
-/* Structure used to report event.  */
-typedef struct td_event_msg
-{
-  td_event_e event;            /* Event type being reported.  */
-  const td_thrhandle_t *th_p;  /* Thread reporting the event.  */
-  union
-  {
-# if 0
-    td_synchandle_t *sh;       /* Handle of synchronization object.  */
-#endif
-    uintptr_t data;            /* Event specific data.  */
-  } msg;
-} td_event_msg_t;
-
-/* Structure containing event data available in each thread structure.  */
-typedef struct
-{
-  td_thr_events_t eventmask;   /* Mask of enabled events.  */
-  td_event_e eventnum;         /* Number of last event.  */
-  void *eventdata;             /* Data associated with event.  */
-} td_eventbuf_t;
-
-
-/* Gathered statistics about the process.  */
-typedef struct td_ta_stats
-{
-  int nthreads;                /* Total number of threads in use.  */
-  int r_concurrency;           /* Concurrency level requested by user.  */
-  int nrunnable_num;           /* Average runnable threads, numerator.  */
-  int nrunnable_den;           /* Average runnable threads, denominator.  */
-  int a_concurrency_num;       /* Achieved concurrency level, numerator.  */
-  int a_concurrency_den;       /* Achieved concurrency level, denominator.  */
-  int nlwps_num;               /* Average number of processes in use,
-                                  numerator.  */
-  int nlwps_den;               /* Average number of processes in use,
-                                  denominator.  */
-  int nidle_num;               /* Average number of idling processes,
-                                  numerator.  */
-  int nidle_den;               /* Average number of idling processes,
-                                  denominator.  */
-} td_ta_stats_t;
-
-
-/* Callback for iteration over threads.  */
-typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
-
-/* Callback for iteration over thread local data.  */
-typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
-
-
-
-/* Forward declaration.  This has to be defined by the user.  */
-struct ps_prochandle;
-
-
-/* Information about the thread.  */
-typedef struct td_thrinfo
-{
-  td_thragent_t *ti_ta_p;              /* Process handle.  */
-  unsigned int ti_user_flags;          /* Unused.  */
-  thread_t ti_tid;                     /* Thread ID returned by
-                                          pthread_create().  */
-  char *ti_tls;                                /* Pointer to thread-local data.  */
-  psaddr_t ti_startfunc;               /* Start function passed to
-                                          pthread_create().  */
-  psaddr_t ti_stkbase;                 /* Base of thread's stack.  */
-  long int ti_stksize;                 /* Size of thread's stack.  */
-  psaddr_t ti_ro_area;                 /* Unused.  */
-  int ti_ro_size;                      /* Unused.  */
-  td_thr_state_e ti_state;             /* Thread state.  */
-  unsigned char ti_db_suspended;       /* Nonzero if suspended by debugger. */
-  td_thr_type_e ti_type;               /* Type of the thread (system vs
-                                          user thread).  */
-  intptr_t ti_pc;                      /* Unused.  */
-  intptr_t ti_sp;                      /* Unused.  */
-  short int ti_flags;                  /* Unused.  */
-  int ti_pri;                          /* Thread priority.  */
-  lwpid_t ti_lid;                      /* Kernel PID for this thread.  */
-  sigset_t ti_sigmask;                 /* Signal mask.  */
-  unsigned char ti_traceme;            /* Nonzero if event reporting
-                                          enabled.  */
-  unsigned char ti_preemptflag;                /* Unused.  */
-  unsigned char ti_pirecflag;          /* Unused.  */
-  sigset_t ti_pending;                 /* Set of pending signals.  */
-  td_thr_events_t ti_events;           /* Set of enabled events.  */
-} td_thrinfo_t;
-
-
-
-/* Prototypes for exported library functions.  */
-
-/* Initialize the thread debug support library.  */
-extern td_err_e td_init (void);
-
-/* Historical relict.  Should not be used anymore.  */
-extern td_err_e td_log (void);
-
-/* Return list of symbols the library can request.  */
-extern const char **td_symbol_list (void);
-
-/* Generate new thread debug library handle for process PS.  */
-extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
-
-/* Free resources allocated for TA.  */
-extern td_err_e td_ta_delete (td_thragent_t *__ta);
-
-/* Get number of currently running threads in process associated with TA.  */
-extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
-
-/* Return process handle passed in `td_ta_new' for process associated with
-   TA.  */
-extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
-                             struct ps_prochandle **__ph);
-
-/* Map thread library handle PT to thread debug library handle for process
-   associated with TA and store result in *TH.  */
-extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
-                                 td_thrhandle_t *__th);
-
-/* Map process ID LWPID to thread debug library handle for process
-   associated with TA and store result in *TH.  */
-extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
-                                  td_thrhandle_t *__th);
-
-
-/* Call for each thread in a process associated with TA the callback function
-   CALLBACK.  */
-extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
-                               td_thr_iter_f *__callback, void *__cbdata_p,
-                               td_thr_state_e __state, int __ti_pri,
-                               sigset_t *__ti_sigmask_p,
-                               unsigned int __ti_user_flags);
-
-/* Call for each defined thread local data entry the callback function KI.  */
-extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
-                               void *__p);
-
-
-/* Get event address for EVENT.  */
-extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
-                                 td_event_e __event, td_notify_t *__ptr);
-
-/* Enable EVENT in global mask.  */
-extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
-                                td_thr_events_t *__event);
-
-/* Disable EVENT in global mask.  */
-extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
-                                  td_thr_events_t *__event);
-
-/* Return information about last event.  */
-extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
-                                   td_event_msg_t *__msg);
-
-
-/* Set suggested concurrency level for process associated with TA.  */
-extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
-
-
-/* Enable collecting statistics for process associated with TA.  */
-extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
-
-/* Reset statistics.  */
-extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
-
-/* Retrieve statistics from process associated with TA.  */
-extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
-                                td_ta_stats_t *__statsp);
-
-
-/* Validate that TH is a thread handle.  */
-extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
-
-/* Return information about thread TH.  */
-extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
-                                td_thrinfo_t *__infop);
-
-/* Retrieve floating-point register contents of process running thread TH.  */
-extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
-                                 prfpregset_t *__regset);
-
-/* Retrieve general register contents of process running thread TH.  */
-extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
-                                prgregset_t __gregs);
-
-/* Retrieve extended register contents of process running thread TH.  */
-extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
-
-/* Get size of extended register set of process running thread TH.  */
-extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
-
-/* Set floating-point register contents of process running thread TH.  */
-extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
-                                 const prfpregset_t *__fpregs);
-
-/* Set general register contents of process running thread TH.  */
-extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
-                                prgregset_t __gregs);
-
-/* Set extended register contents of process running thread TH.  */
-extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
-                                const void *__addr);
-
-
-/* Get address of the given module's TLS storage area for the given thread.  */
-extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
-                               unsigned long int __modid,
-                               psaddr_t *__base);
-
-/* Get address of thread local variable.  */
-extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
-                                    psaddr_t __map_address, size_t __offset,
-                                    psaddr_t *__address);
-
-
-/* Enable reporting for EVENT for thread TH.  */
-extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
-
-/* Enable EVENT for thread TH.  */
-extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
-                                 td_thr_events_t *__event);
-
-/* Disable EVENT for thread TH.  */
-extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
-                                   td_thr_events_t *__event);
-
-/* Get event message for thread TH.  */
-extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
-                                    td_event_msg_t *__msg);
-
-
-/* Set priority of thread TH.  */
-extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
-
-
-/* Set pending signals for thread TH.  */
-extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
-                                     unsigned char __n, const sigset_t *__ss);
-
-/* Set signal mask for thread TH.  */
-extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
-                                  const sigset_t *__ss);
-
-
-/* Return thread local data associated with key TK in thread TH.  */
-extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
-                           const thread_key_t __tk, void **__data);
-
-
-/* Suspend execution of thread TH.  */
-extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
-
-/* Resume execution of thread TH.  */
-extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
-
-#endif /* thread_db.h */
index 5f670d2..8068e9e 100644 (file)
@@ -94,6 +94,11 @@ while read file srcfile caller syscall args strong weak; do
   ;;
   esac
 
+  restart_line=
+  case $args in
+  R*) restart_line='#define SYSCALL_RESTARTABLE 1'; args=`echo $args | sed 's/R//'`;;
+  esac
+
   cancellable=
   noerrno=
   case $args in
@@ -177,7 +182,8 @@ shared-only-routines += $file
 
   echo "\
        \$(make-target-directory)
-       (echo '#include <sysdep$cancellable.h>'; \\
+       (echo '$restart_line'; \\
+        echo '#include <sysdep$cancellable.h>'; \\
         echo '$pseudo_line'; \\
         echo ' ret$noerrno'; \\
         echo 'PSEUDO_END$noerrno($strong)'; \\
diff --git a/sysdeps/unix/sysv/linux/proc_service.h b/sysdeps/unix/sysv/linux/proc_service.h
new file mode 100644 (file)
index 0000000..d49e87a
--- /dev/null
@@ -0,0 +1,87 @@
+/* Callback interface for libthread_db, functions users must define.
+   Copyright (C) 1999,2002,2003 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.  */
+
+/* The definitions in this file must correspond to those in the debugger.  */
+#include <sys/procfs.h>
+
+/* Functions in this interface return one of these status codes.  */
+typedef enum
+{
+  PS_OK,               /* Generic "call succeeded".  */
+  PS_ERR,              /* Generic error. */
+  PS_BADPID,           /* Bad process handle.  */
+  PS_BADLID,           /* Bad LWP identifier.  */
+  PS_BADADDR,          /* Bad address.  */
+  PS_NOSYM,            /* Could not find given symbol.  */
+  PS_NOFREGS           /* FPU register set not available for given LWP.  */
+} ps_err_e;
+
+
+/* This type is opaque in this interface.
+   It's defined by the user of libthread_db.  */
+struct ps_prochandle;
+
+
+/* Read or write process memory at the given address.  */
+extern ps_err_e ps_pdread (struct ps_prochandle *,
+                          psaddr_t, void *, size_t);
+extern ps_err_e ps_pdwrite (struct ps_prochandle *,
+                           psaddr_t, const void *, size_t);
+extern ps_err_e ps_ptread (struct ps_prochandle *,
+                          psaddr_t, void *, size_t);
+extern ps_err_e ps_ptwrite (struct ps_prochandle *,
+                           psaddr_t, const void *, size_t);
+
+
+/* Get and set the given LWP's general or FPU register set.  */
+extern ps_err_e ps_lgetregs (struct ps_prochandle *,
+                            lwpid_t, prgregset_t);
+extern ps_err_e ps_lsetregs (struct ps_prochandle *,
+                            lwpid_t, const prgregset_t);
+extern ps_err_e ps_lgetfpregs (struct ps_prochandle *,
+                              lwpid_t, prfpregset_t *);
+extern ps_err_e ps_lsetfpregs (struct ps_prochandle *,
+                              lwpid_t, const prfpregset_t *);
+
+/* Return the PID of the process.  */
+extern pid_t ps_getpid (struct ps_prochandle *);
+
+/* Fetch the special per-thread address associated with the given LWP.
+   This call is only used on a few platforms (most use a normal register).
+   The meaning of the `int' parameter is machine-dependent.  */
+extern ps_err_e ps_get_thread_area (const struct ps_prochandle *,
+                                   lwpid_t, int, psaddr_t *);
+
+
+/* Look up the named symbol in the named DSO in the symbol tables
+   associated with the process being debugged, filling in *SYM_ADDR
+   with the corresponding run-time address.  */
+extern ps_err_e ps_pglobal_lookup (struct ps_prochandle *,
+                                  const char *object_name,
+                                  const char *sym_name,
+                                  psaddr_t *sym_addr);
+
+
+/* Stop or continue the entire process.  */
+extern ps_err_e ps_pstop (const struct ps_prochandle *);
+extern ps_err_e ps_pcontinue (const struct ps_prochandle *);
+
+/* Stop or continue the given LWP alone.  */
+extern ps_err_e ps_lstop (const struct ps_prochandle *, lwpid_t);
+extern ps_err_e ps_lcontinue (const struct ps_prochandle *, lwpid_t);
diff --git a/sysdeps/unix/sysv/linux/thread_db.h b/sysdeps/unix/sysv/linux/thread_db.h
new file mode 100644 (file)
index 0000000..433b54f
--- /dev/null
@@ -0,0 +1,459 @@
+/* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
+   Copyright (C) 1999,2001,2002,2003 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 _THREAD_DB_H
+#define _THREAD_DB_H   1
+
+/* This is the debugger interface for the NPTL library.  It is
+   modelled closely after the interface with same names in Solaris
+   with the goal to share the same code in the debugger.  */
+#include <pthread.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/procfs.h>
+
+
+/* Error codes of the library.  */
+typedef enum
+{
+  TD_OK,         /* No error.  */
+  TD_ERR,        /* No further specified error.  */
+  TD_NOTHR,      /* No matching thread found.  */
+  TD_NOSV,       /* No matching synchronization handle found.  */
+  TD_NOLWP,      /* No matching light-weighted process found.  */
+  TD_BADPH,      /* Invalid process handle.  */
+  TD_BADTH,      /* Invalid thread handle.  */
+  TD_BADSH,      /* Invalid synchronization handle.  */
+  TD_BADTA,      /* Invalid thread agent.  */
+  TD_BADKEY,     /* Invalid key.  */
+  TD_NOMSG,      /* No event available.  */
+  TD_NOFPREGS,   /* No floating-point register content available.  */
+  TD_NOLIBTHREAD, /* Application not linked with thread library.  */
+  TD_NOEVENT,    /* Requested event is not supported.  */
+  TD_NOCAPAB,    /* Capability not available.  */
+  TD_DBERR,      /* Internal debug library error.  */
+  TD_NOAPLIC,    /* Operation is not applicable.  */
+  TD_NOTSD,      /* No thread-specific data available.  */
+  TD_MALLOC,     /* Out of memory.  */
+  TD_PARTIALREG,  /* Not entire register set was read or written.  */
+  TD_NOXREGS,    /* X register set not available for given thread.  */
+  TD_TLSDEFER,   /* Thread has not yet allocated TLS for given module.  */
+  TD_NOTALLOC = TD_TLSDEFER,
+  TD_VERSION,    /* Version if libpthread and libthread_db do not match.  */
+  TD_NOTLS       /* There is no TLS segment in the given module.  */
+} td_err_e;
+
+
+/* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
+   select threads regardless of state in td_ta_thr_iter().  */
+typedef enum
+{
+  TD_THR_ANY_STATE,
+  TD_THR_UNKNOWN,
+  TD_THR_STOPPED,
+  TD_THR_RUN,
+  TD_THR_ACTIVE,
+  TD_THR_ZOMBIE,
+  TD_THR_SLEEP,
+  TD_THR_STOPPED_ASLEEP
+} td_thr_state_e;
+
+/* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
+   to select threads regardless of type in td_ta_thr_iter().  */
+typedef enum
+{
+  TD_THR_ANY_TYPE,
+  TD_THR_USER,
+  TD_THR_SYSTEM
+} td_thr_type_e;
+
+
+/* Types of the debugging library.  */
+
+/* Handle for a process.  This type is opaque.  */
+typedef struct td_thragent td_thragent_t;
+
+/* The actual thread handle type.  This is also opaque.  */
+typedef struct td_thrhandle
+{
+  td_thragent_t *th_ta_p;
+  psaddr_t th_unique;
+} td_thrhandle_t;
+
+
+/* Forward declaration of a type defined by and for the dynamic linker.  */
+struct link_map;
+
+
+/* Flags for `td_ta_thr_iter'.  */
+#define TD_THR_ANY_USER_FLAGS  0xffffffff
+#define TD_THR_LOWEST_PRIORITY -20
+#define TD_SIGNO_MASK          NULL
+
+
+#define TD_EVENTSIZE   2
+#define BT_UISHIFT     5 /* log base 2 of BT_NBIPUI, to extract word index */
+#define BT_NBIPUI      (1 << BT_UISHIFT)       /* n bits per uint */
+#define BT_UIMASK      (BT_NBIPUI - 1)         /* to extract bit index */
+
+/* Bitmask of enabled events. */
+typedef struct td_thr_events
+{
+  uint32_t event_bits[TD_EVENTSIZE];
+} td_thr_events_t;
+
+/* Event set manipulation macros. */
+#define __td_eventmask(n) \
+  (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
+#define __td_eventword(n) \
+  ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
+
+#define td_event_emptyset(setp) \
+  do {                                                                       \
+    int __i;                                                                 \
+    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
+      (setp)->event_bits[__i - 1] = 0;                                       \
+  } while (0)
+
+#define td_event_fillset(setp) \
+  do {                                                                       \
+    int __i;                                                                 \
+    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
+      (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);                   \
+  } while (0)
+
+#define td_event_addset(setp, n) \
+  (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
+#define td_event_delset(setp, n) \
+  (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
+#define td_eventismember(setp, n) \
+  (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
+#if TD_EVENTSIZE == 2
+# define td_eventisempty(setp) \
+  (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
+#else
+# error "td_eventisempty must be changed to match TD_EVENTSIZE"
+#endif
+
+/* Events reportable by the thread implementation.  */
+typedef enum
+{
+  TD_ALL_EVENTS,                /* Pseudo-event number.  */
+  TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
+  TD_READY,                     /* Is executable now. */
+  TD_SLEEP,                     /* Blocked in a synchronization obj.  */
+  TD_SWITCHTO,                  /* Now assigned to a process.  */
+  TD_SWITCHFROM,                /* Not anymore assigned to a process.  */
+  TD_LOCK_TRY,                  /* Trying to get an unavailable lock.  */
+  TD_CATCHSIG,                  /* Signal posted to the thread.  */
+  TD_IDLE,                      /* Process getting idle.  */
+  TD_CREATE,                    /* New thread created.  */
+  TD_DEATH,                     /* Thread terminated.  */
+  TD_PREEMPT,                   /* Preempted.  */
+  TD_PRI_INHERIT,               /* Inherited elevated priority.  */
+  TD_REAP,                      /* Reaped.  */
+  TD_CONCURRENCY,               /* Number of processes changing.  */
+  TD_TIMEOUT,                   /* Conditional variable wait timed out.  */
+  TD_MIN_EVENT_NUM = TD_READY,
+  TD_MAX_EVENT_NUM = TD_TIMEOUT,
+  TD_EVENTS_ENABLE = 31                /* Event reporting enabled.  */
+} td_event_e;
+
+/* Values representing the different ways events are reported.  */
+typedef enum
+{
+  NOTIFY_BPT,                  /* User must insert breakpoint at u.bptaddr. */
+  NOTIFY_AUTOBPT,              /* Breakpoint at u.bptaddr is automatically
+                                  inserted.  */
+  NOTIFY_SYSCALL               /* System call u.syscallno will be invoked.  */
+} td_notify_e;
+
+/* Description how event type is reported.  */
+typedef struct td_notify
+{
+  td_notify_e type;            /* Way the event is reported.  */
+  union
+  {
+    psaddr_t bptaddr;          /* Address of breakpoint.  */
+    int syscallno;             /* Number of system call used.  */
+  } u;
+} td_notify_t;
+
+/* Structure used to report event.  */
+typedef struct td_event_msg
+{
+  td_event_e event;            /* Event type being reported.  */
+  const td_thrhandle_t *th_p;  /* Thread reporting the event.  */
+  union
+  {
+# if 0
+    td_synchandle_t *sh;       /* Handle of synchronization object.  */
+#endif
+    uintptr_t data;            /* Event specific data.  */
+  } msg;
+} td_event_msg_t;
+
+/* Structure containing event data available in each thread structure.  */
+typedef struct
+{
+  td_thr_events_t eventmask;   /* Mask of enabled events.  */
+  td_event_e eventnum;         /* Number of last event.  */
+  void *eventdata;             /* Data associated with event.  */
+} td_eventbuf_t;
+
+
+/* Gathered statistics about the process.  */
+typedef struct td_ta_stats
+{
+  int nthreads;                /* Total number of threads in use.  */
+  int r_concurrency;           /* Concurrency level requested by user.  */
+  int nrunnable_num;           /* Average runnable threads, numerator.  */
+  int nrunnable_den;           /* Average runnable threads, denominator.  */
+  int a_concurrency_num;       /* Achieved concurrency level, numerator.  */
+  int a_concurrency_den;       /* Achieved concurrency level, denominator.  */
+  int nlwps_num;               /* Average number of processes in use,
+                                  numerator.  */
+  int nlwps_den;               /* Average number of processes in use,
+                                  denominator.  */
+  int nidle_num;               /* Average number of idling processes,
+                                  numerator.  */
+  int nidle_den;               /* Average number of idling processes,
+                                  denominator.  */
+} td_ta_stats_t;
+
+
+/* Since Sun's library is based on Solaris threads we have to define a few
+   types to map them to POSIX threads.  */
+typedef pthread_t thread_t;
+typedef pthread_key_t thread_key_t;
+
+
+/* Callback for iteration over threads.  */
+typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
+
+/* Callback for iteration over thread local data.  */
+typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
+
+
+
+/* Forward declaration.  This has to be defined by the user.  */
+struct ps_prochandle;
+
+
+/* Information about the thread.  */
+typedef struct td_thrinfo
+{
+  td_thragent_t *ti_ta_p;              /* Process handle.  */
+  unsigned int ti_user_flags;          /* Unused.  */
+  thread_t ti_tid;                     /* Thread ID returned by
+                                          pthread_create().  */
+  char *ti_tls;                                /* Pointer to thread-local data.  */
+  psaddr_t ti_startfunc;               /* Start function passed to
+                                          pthread_create().  */
+  psaddr_t ti_stkbase;                 /* Base of thread's stack.  */
+  long int ti_stksize;                 /* Size of thread's stack.  */
+  psaddr_t ti_ro_area;                 /* Unused.  */
+  int ti_ro_size;                      /* Unused.  */
+  td_thr_state_e ti_state;             /* Thread state.  */
+  unsigned char ti_db_suspended;       /* Nonzero if suspended by debugger. */
+  td_thr_type_e ti_type;               /* Type of the thread (system vs
+                                          user thread).  */
+  intptr_t ti_pc;                      /* Unused.  */
+  intptr_t ti_sp;                      /* Unused.  */
+  short int ti_flags;                  /* Unused.  */
+  int ti_pri;                          /* Thread priority.  */
+  lwpid_t ti_lid;                      /* Kernel PID for this thread.  */
+  sigset_t ti_sigmask;                 /* Signal mask.  */
+  unsigned char ti_traceme;            /* Nonzero if event reporting
+                                          enabled.  */
+  unsigned char ti_preemptflag;                /* Unused.  */
+  unsigned char ti_pirecflag;          /* Unused.  */
+  sigset_t ti_pending;                 /* Set of pending signals.  */
+  td_thr_events_t ti_events;           /* Set of enabled events.  */
+} td_thrinfo_t;
+
+
+
+/* Prototypes for exported library functions.  */
+
+/* Initialize the thread debug support library.  */
+extern td_err_e td_init (void);
+
+/* Historical relict.  Should not be used anymore.  */
+extern td_err_e td_log (void);
+
+/* Return list of symbols the library can request.  */
+extern const char **td_symbol_list (void);
+
+/* Generate new thread debug library handle for process PS.  */
+extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
+
+/* Free resources allocated for TA.  */
+extern td_err_e td_ta_delete (td_thragent_t *__ta);
+
+/* Get number of currently running threads in process associated with TA.  */
+extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
+
+/* Return process handle passed in `td_ta_new' for process associated with
+   TA.  */
+extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
+                             struct ps_prochandle **__ph);
+
+/* Map thread library handle PT to thread debug library handle for process
+   associated with TA and store result in *TH.  */
+extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
+                                 td_thrhandle_t *__th);
+
+/* Map process ID LWPID to thread debug library handle for process
+   associated with TA and store result in *TH.  */
+extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
+                                  td_thrhandle_t *__th);
+
+
+/* Call for each thread in a process associated with TA the callback function
+   CALLBACK.  */
+extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
+                               td_thr_iter_f *__callback, void *__cbdata_p,
+                               td_thr_state_e __state, int __ti_pri,
+                               sigset_t *__ti_sigmask_p,
+                               unsigned int __ti_user_flags);
+
+/* Call for each defined thread local data entry the callback function KI.  */
+extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
+                               void *__p);
+
+
+/* Get event address for EVENT.  */
+extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
+                                 td_event_e __event, td_notify_t *__ptr);
+
+/* Enable EVENT in global mask.  */
+extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
+                                td_thr_events_t *__event);
+
+/* Disable EVENT in global mask.  */
+extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
+                                  td_thr_events_t *__event);
+
+/* Return information about last event.  */
+extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
+                                   td_event_msg_t *__msg);
+
+
+/* Set suggested concurrency level for process associated with TA.  */
+extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
+
+
+/* Enable collecting statistics for process associated with TA.  */
+extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
+
+/* Reset statistics.  */
+extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
+
+/* Retrieve statistics from process associated with TA.  */
+extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
+                                td_ta_stats_t *__statsp);
+
+
+/* Validate that TH is a thread handle.  */
+extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
+
+/* Return information about thread TH.  */
+extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
+                                td_thrinfo_t *__infop);
+
+/* Retrieve floating-point register contents of process running thread TH.  */
+extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
+                                 prfpregset_t *__regset);
+
+/* Retrieve general register contents of process running thread TH.  */
+extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
+                                prgregset_t __gregs);
+
+/* Retrieve extended register contents of process running thread TH.  */
+extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
+
+/* Get size of extended register set of process running thread TH.  */
+extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
+
+/* Set floating-point register contents of process running thread TH.  */
+extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
+                                 const prfpregset_t *__fpregs);
+
+/* Set general register contents of process running thread TH.  */
+extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
+                                prgregset_t __gregs);
+
+/* Set extended register contents of process running thread TH.  */
+extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
+                                const void *__addr);
+
+
+/* Get address of the given module's TLS storage area for the given thread.  */
+extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
+                               unsigned long int __modid,
+                               psaddr_t *__base);
+
+/* Get address of thread local variable.  */
+extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
+                                    psaddr_t __map_address, size_t __offset,
+                                    psaddr_t *__address);
+
+
+/* Enable reporting for EVENT for thread TH.  */
+extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
+
+/* Enable EVENT for thread TH.  */
+extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
+                                 td_thr_events_t *__event);
+
+/* Disable EVENT for thread TH.  */
+extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
+                                   td_thr_events_t *__event);
+
+/* Get event message for thread TH.  */
+extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
+                                    td_event_msg_t *__msg);
+
+
+/* Set priority of thread TH.  */
+extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
+
+
+/* Set pending signals for thread TH.  */
+extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
+                                     unsigned char __n, const sigset_t *__ss);
+
+/* Set signal mask for thread TH.  */
+extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
+                                  const sigset_t *__ss);
+
+
+/* Return thread local data associated with key TK in thread TH.  */
+extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
+                           const thread_key_t __tk, void **__data);
+
+
+/* Suspend execution of thread TH.  */
+extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
+
+/* Resume execution of thread TH.  */
+extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
+
+#endif /* thread_db.h */
index 9cb0c40..69523df 100644 (file)
@@ -117,6 +117,18 @@ libpthread-sysdep_routines += sys_fcntl sys_fdsync sys_sigaction sys_open \
     sys_open64 sys_priocntlsys schedP priocntl syscall
 endif
 
+ifeq ($(subdir),nptl_db)
+sysdep_headers += proc_service.h
+endif
+
+ifeq ($(subdir),resolv)
+libresolv-routines += sys_sigqueue
+endif
+
+ifeq ($(subdir),rt)
+librt-routines += sys_sigqueue
+endif
+
 CFLAGS-accept.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-connect.c = -fexceptions -fasynchronous-unwind-tables
 CFLAGS-fsync.c = -fexceptions -fasynchronous-unwind-tables
index 4f59cfe..e08fd4a 100644 (file)
@@ -45,7 +45,7 @@ libc {
     _getexecattr; getexecname; _getexecprof; getextmntent; gethrtime;
     gethrvtime; __getgrent_r_sun; __getgrgid_r_sun; __getgrnam_r_sun;
     getipnodebyaddr; getipnodebyname; getipsecalgbyname; getipsecalgbynum;
-    getmntany; __getmntent_gnu; __getopt_sun; getpagesizes; getpagesizes2;
+    getmntany; __getmntent_sun; __getopt_sun; getpagesizes; getpagesizes2;
     getpeerucred; getpflags; getppriv; getprivimplinfo; _getprofattr;
     _getprofnam; getprojid; __getprotobyname_r_sun; __getprotobynumber_r_sun;
     __getprotoent_r_sun; __getpwent_r_sun; __getpwnam_r_sun; __getpwuid_r_sun;
@@ -54,7 +54,7 @@ libc {
     getzonenamebyid;
 
     # h
-    __hasmntopt_gnu;
+    __hasmntopt_sun;
 
     # i
     idmap_reg; idmap_unreg; __init_daemon_priv; __init_suid_priv; _insert;
@@ -121,7 +121,7 @@ libc {
     zone_add_datalink; zone_boot; zone_check_datalink; zone_create;
     zone_destroy; zone_enter; zone_get_id; zone_getattr; zone_list;
     zone_list_datalink; zone_remove_datalink; zone_setattr; zone_shutdown;
-    zone_version;
+    zonept; zone_version;
   }
 }
 
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/aio_sigqueue.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/aio_sigqueue.c
new file mode 100644 (file)
index 0000000..8dc0240
--- /dev/null
@@ -0,0 +1,35 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   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.  */
+
+#include <inline-syscall.h>
+#include <aio.h>
+#include <aio_misc.h>
+#include <signal.h>
+
+DECLARE_INLINE_SYSCALL (int, sigqueue, pid_t pid, int sig,
+    const union sigval value, int si_code, int block);
+
+int
+__aio_sigqueue (sig, val, caller_pid)
+     int sig;
+     const union sigval val;
+     pid_t caller_pid;
+{
+  return INLINE_SYSCALL (sigqueue, 5, caller_pid, sig, val, SI_ASYNCIO, 1);
+}
index f1a618b..fcad436 100644 (file)
@@ -23,7 +23,6 @@
 #endif
 
 #include <bits/wordsize.h>
-#include <stdint.h>
 #include <features.h>
 
 /* This needs to be defined here because we only get timespec for certain
index ae8ba1f..ff9f1e2 100644 (file)
@@ -32,9 +32,9 @@ struct sigstack
     int ss_onstack;            /* Nonzero if executing on this stack.  */
   };
 
-#ifdef _SYSCALL32
+# ifdef _SYSCALL32
 
-# include <sys/types32.h>
+#  include <sys/types32.h>
 
 typedef struct sigaltstack32
   {
@@ -43,23 +43,23 @@ typedef struct sigaltstack32
     int32_t  ss_flags;
   } stack32_t;
 
-#endif
+# endif
 
 
 /* Possible values for `ss_flags.'.  */
 enum
 {
   SS_ONSTACK = 1,
-#define SS_ONSTACK     SS_ONSTACK
+# define SS_ONSTACK    SS_ONSTACK
   SS_DISABLE = 2
-#define SS_DISABLE     SS_DISABLE
+# define SS_DISABLE    SS_DISABLE
 };
 
 /* Minimum stack size for a signal handler.  */
-#define MINSIGSTKSZ    2048
+# define MINSIGSTKSZ   2048
 
 /* System default stack size.  */
-#define SIGSTKSZ       8192
+# define SIGSTKSZ      8192
 
 #endif /* __need_stack_t */
 
index 3b53398..3f49382 100644 (file)
@@ -339,7 +339,9 @@ __USING_NAMESPACE_STD(clock_t)
 #endif
 
 /* OpenSolaris needs this for source compatibility.  */
-#include <stdint.h>
+#ifdef __USE_MISC
+# include <stdint.h>
+#endif
 
 #ifdef _SYSCALL32
 # include <sys/types32.h>
index ba6e590..0855d4e 100644 (file)
@@ -25,9 +25,6 @@
 #define _BITS_UIO_H    1
 
 #include <bits/types.h>
-#include <features.h>
-#define __need_IOV_MAX
-#include <bits/stdio_lim.h>
 
 /* Maximum number of iovec's that can be processed in a single call. */
 #define UIO_MAXIOV     16
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/gai_sigqueue.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/gai_sigqueue.c
new file mode 100644 (file)
index 0000000..3821f34
--- /dev/null
@@ -0,0 +1,34 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   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.  */
+
+#include <inline-syscall.h>
+#include "gai_misc.h"
+#include <signal.h>
+
+DECLARE_INLINE_SYSCALL (int, sigqueue, pid_t pid, int sig,
+    const union sigval value, int si_code, int block);
+
+int
+__gai_sigqueue (sig, val, caller_pid)
+     int sig;
+     const union sigval val;
+     pid_t caller_pid;
+{
+  return INLINE_SYSCALL (sigqueue, 5, caller_pid, sig, val, SI_QUEUE, 1);
+}
index cfd6d9c..2eb2479 100644 (file)
@@ -76,7 +76,11 @@ grantpt (int fd)
   struct strioctl si;
   si.ic_cmd = OWNERPT;
   si.ic_timout = 0;
-  si.ic_len = sizeof(pt_own_t);
-  si.ic_dp = (char*)&pto;
-  return ioctl (fd, I_STR, &si);
+  si.ic_len = sizeof (pt_own_t);
+  si.ic_dp = (char *)&pto;
+
+  int res = (ioctl (fd, I_STR, &si) < 0) ? -1 : 0;
+  if (res != 0 && errno == ENOTTY)
+    __set_errno (EINVAL);
+  return res;
 }
index 7a0449a..9dd8071 100644 (file)
@@ -42,11 +42,11 @@ L(restart):
     /* TODO: adjust cfi.  */
 
     /* Call server function.  */
-    movl DOOR_RESULTS_PC(%esp), %eax
+    movl oDOOR_RESULTS_PC(%esp), %eax
     call *%eax
 
     /* The server function is supposed to call door_return...  */
     pushl $0
-    call pthread_exit
+    call __pthread_exit
 L(pseudo_end):
 PSEUDO_END (__door_return)
index 38550fa..08d993c 100644 (file)
@@ -1,4 +1,4 @@
 #include <sysdep.h>
 #include <doorP.h>
 
-DOOR_RESULTS_PC                offsetof (struct door_results, pc)
+oDOOR_RESULTS_PC       offsetof (struct door_results, pc)
index 19c3cdc..a8f2714 100644 (file)
@@ -27,6 +27,8 @@
 #include <sys/param.h>
 #include <sys/types.h>
 #include <libc-internal.h>
+#include <sys/ucontext.h>
+#include <sys/resource.h>
 
 #include <ldsodefs.h>
 
@@ -39,6 +41,8 @@ int __libc_multiple_libcs attribute_hidden = 1;
 int __libc_argc attribute_hidden;
 char **__libc_argv attribute_hidden;
 
+stack_t _dl_stack;
+
 
 void
 __libc_init_first (int argc, char **argv, char **envp)
@@ -68,6 +72,18 @@ _init (int argc, char **argv, char **envp)
       if (__fpu_control != GLRO(dl_fpu_control))
 #endif
        __setfpucw (__fpu_control);
+
+    /* Setup stack.  */
+    ucontext_t ctx;
+    struct rlimit rlim;
+    if (getrlimit (RLIMIT_STACK, &rlim) == 0 &&
+        rlim.rlim_cur != RLIM_INFINITY && getcontext (&ctx) == 0)
+      {
+        _dl_stack.ss_sp = ctx.uc_stack.ss_sp;
+        _dl_stack.ss_size = rlim.rlim_cur;
+        _dl_stack.ss_flags = 0;
+        setustack (&_dl_stack);
+      }
     }
 
   /* Save the command-line arguments.  */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c
deleted file mode 100644 (file)
index 5541a49..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
-
-   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.  */
-
-#define getmntent __getmntent_gnu
-#include <misc/mntent.c>
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.h
deleted file mode 100644 (file)
index df89026..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/* Utilities for reading/writing fstab, mtab, etc.
-   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2008
-    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        _MNTENT_H
-#define        _MNTENT_H       1
-
-#include <features.h>
-#define __need_FILE
-#include <stdio.h>
-#include <paths.h>
-
-#ifndef __USE_SUN
-
-/* File listing canonical interesting mount points.  */
-# define MNTTAB                _PATH_MNTTAB    /* Deprecated alias.  */
-
-/* File listing currently active mount points.  */
-# define MOUNTED               _PATH_MOUNTED   /* Deprecated alias.  */
-
-
-/* General filesystem types.  */
-# define MNTTYPE_IGNORE        "ignore"        /* Ignore this entry.  */
-# define MNTTYPE_NFS   "nfs"           /* Network file system.  */
-# define MNTTYPE_SWAP  "swap"          /* Swap device.  */
-
-
-/* Generic mount options.  */
-# define MNTOPT_DEFAULTS       "defaults"      /* Use all default options.  */
-# define MNTOPT_RO     "ro"            /* Read only.  */
-# define MNTOPT_RW     "rw"            /* Read/write.  */
-# define MNTOPT_SUID   "suid"          /* Set uid allowed.  */
-# define MNTOPT_NOSUID "nosuid"        /* No set uid allowed.  */
-# define MNTOPT_NOAUTO "noauto"        /* Do not auto mount.  */
-
-
-__BEGIN_DECLS
-
-/* Structure describing a mount table entry.  */
-struct mntent
-  {
-    char *mnt_fsname;          /* Device or server for filesystem.  */
-    char *mnt_dir;             /* Directory mounted on.  */
-    char *mnt_type;            /* Type of filesystem: ufs, nfs, etc.  */
-    char *mnt_opts;            /* Comma-separated options for fs.  */
-    int mnt_freq;              /* Dump frequency (in days).  */
-    int mnt_passno;            /* Pass number for `fsck'.  */
-  };
-
-
-/* Prepare to begin reading and/or writing mount table entries from the
-   beginning of FILE.  MODE is as for `fopen'.  */
-extern FILE *setmntent (__const char *__file, __const char *__mode) __THROW;
-
-/* Read one mount table entry from STREAM.  Returns a pointer to storage
-   reused on the next call, or null for EOF or error (use feof/ferror to
-   check).  */
-# ifdef __REDIRECT_NTH
-extern struct mntent *__getmntent_gnu (FILE *__stream) __THROW;
-extern struct mntent * __REDIRECT_NTH (getmntent, (FILE *__stream),
-                                  __getmntent_gnu);
-# else
-#  define getmntent __getmntent_gnu
-# endif
-
-# ifdef __USE_MISC
-/* Reentrant version of the above function.  */
-extern struct mntent *getmntent_r (FILE *__restrict __stream,
-                                  struct mntent *__restrict __result,
-                                  char *__restrict __buffer,
-                                  int __bufsize) __THROW;
-# endif
-
-/* Close a stream opened with `setmntent'.  */
-extern int endmntent (FILE *__stream) __THROW;
-
-/* Search MNT->mnt_opts for an option matching OPT.
-   Returns the address of the substring, or null if none found.  */
-# ifdef __REDIRECT_NTH
-extern char *__hasmntopt_gnu (__const struct mntent *__mnt,
-                       __const char *__opt) __THROW;
-extern char * __REDIRECT_NTH (hasmntopt, (__const struct mntent *__mnt,
-                       __const char *__opt), __hasmntopt_gnu);
-# else
-#  define hasmntopt __hasmntopt_gnu
-# endif
-
-
-__END_DECLS
-
-#endif /* __USE_SUN */
-
-#endif /* mntent.h */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c
deleted file mode 100644 (file)
index 8a889d3..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
-
-   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.  */
-
-#define __hasmntopt ___hasmntopt_gnu
-#define hasmntopt __hasmntopt_gnu
-#include <misc/mntent_r.c>
index acb9edd..f7ce5f7 100644 (file)
@@ -31,7 +31,7 @@
        (!y->f || (y->f && strcmp (x->f, y->f) == 0))
 
 
-int getmntent (FILE *fp, struct mnttab *mt)
+int __getmntent_sun (FILE *fp, struct mnttab *mt)
 {
   struct extmnttab emt;
   int res = ioctl (fileno (fp), MNTIOC_GETMNTENT, &emt);
@@ -95,7 +95,7 @@ char *mntopt (char **opts)
 }
 
 
-char * hasmntopt (struct mnttab *mt, char *opt)
+char * __hasmntopt_sun (struct mnttab *mt, char *opt)
 {
   /* We make a copy of mnt_mntopts since we modify it.  */
   char buf[MNT_LINE_MAX + 1];
index b2cf2ca..ec68c8b 100644 (file)
@@ -26,7 +26,6 @@
 # include <sys/types.h>
 # include <sys/socket.h>
 #endif
-#include <stdint.h>
 
 
 /* Length of interface name.  */
@@ -205,29 +204,29 @@ struct ifreq
 
     struct ifr_dnld_reqs
       {
-        uint32_t v_addr;
-        uint32_t m_addr;
-        uint32_t ex_addr;
-        uint32_t size;
+        __uint32_t v_addr;
+        __uint32_t m_addr;
+        __uint32_t ex_addr;
+        __uint32_t size;
       } ifru_dnld_req;
 
     struct ifr_fddi_stats
       {
-        uint32_t stat_size;
-        uint32_t fddi_stats;
+        __uint32_t stat_size;
+        __uint32_t fddi_stats;
       } ifru_fddi_stat;
 
     struct ifr_netmapents
       {
-        uint32_t map_ent_size;
-        uint32_t entry_number;
-        uint32_t fddi_map_ent;
+        __uint32_t map_ent_size;
+        __uint32_t entry_number;
+        __uint32_t fddi_map_ent;
       } ifru_netmapent;
 
     struct ifr_fddi_gen_struct
       {
-        uint32_t ifru_fddi_gioctl;
-        uint32_t ifru_fddi_gaddr;
+        __uint32_t ifru_fddi_gioctl;
+        __uint32_t ifru_fddi_gaddr;
       } ifru_fddi_gstruct;
 
     } ifr_ifru;
@@ -289,9 +288,9 @@ typedef struct lif_nd_req
   {
 # define ND_MAX_HDW_LEN  64
     struct sockaddr_storage lnr_addr;
-    uint8_t lnr_state_create;
-    uint8_t lnr_state_same_lla;
-    uint8_t lnr_state_diff_lla;
+    __uint8_t lnr_state_create;
+    __uint8_t lnr_state_same_lla;
+    __uint8_t lnr_state_diff_lla;
     int lnr_hdw_len;
     int lnr_flags;
     int lnr_pad0;
@@ -319,10 +318,10 @@ typedef struct lif_nd_req
 /* Structure used for the SIOC[GS]LIFLNKINFO requests. */
 typedef struct lif_ifinfo_req
   {
-    uint8_t lir_maxhops;
-    uint32_t lir_reachtime;
-    uint32_t lir_reachretrans;
-    uint32_t lir_maxmtu;
+    __uint8_t lir_maxhops;
+    __uint32_t lir_reachtime;
+    __uint32_t lir_reachretrans;
+    __uint32_t lir_maxmtu;
   } lif_ifinfo_req_t;
 
 /* Recommended replacement structure for ifreq. */
@@ -505,11 +504,11 @@ struct iftun_req
     enum ifta_proto ifta_upper;
     enum ifta_proto ifta_lower;
     unsigned int ifta_vers;
-    uint32_t ifta_secinfo[IFTUN_SECINFOLEN];
-    int16_t ifta_encap_lim;
-    uint8_t ifta_hop_limit;
-    uint8_t ifta_spare0;
-    uint32_t ifta_spare1;
+    __uint32_t ifta_secinfo[IFTUN_SECINFOLEN];
+    __int16_t ifta_encap_lim;
+    __uint8_t ifta_hop_limit;
+    __uint8_t ifta_spare0;
+    __uint32_t ifta_spare1;
   };
 
 # define IFTUN_SRC     0x01
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/proc_service.h
new file mode 100644 (file)
index 0000000..38d92ad
--- /dev/null
@@ -0,0 +1,106 @@
+/* Callback interface for libthread_db, functions users must define.
+   Copyright (C) 1999,2002,2003 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 _PROC_SERVICE_H
+#define _PROC_SERVICE_H
+
+/* The definitions in this file must correspond to those in the debugger.  */
+#include <sys/procfs_isa.h>
+#include <elf.h>
+#include <features.h>
+
+#ifdef _LP64
+typedef Elf64_Sym      ps_sym_t;
+#else
+typedef Elf32_Sym      ps_sym_t;
+#endif
+
+/* Functions in this interface return one of these status codes.  */
+typedef enum
+{
+  PS_OK,               /* Generic "call succeeded".  */
+  PS_ERR,              /* Generic error. */
+  PS_BADPID,           /* Bad process handle.  */
+  PS_BADLID,           /* Bad LWP identifier.  */
+  PS_BADADDR,          /* Bad address.  */
+  PS_NOSYM,            /* Could not find given symbol.  */
+  PS_NOFREGS           /* FPU register set not available for given LWP.  */
+} ps_err_e;
+
+#define PS_OBJ_EXEC    ((const char *)0x0)
+#define PS_OBJ_LDSO    ((const char *)0x1)
+
+/* This type is opaque in this interface.
+   It's defined by the user of libthread_db.  */
+struct ps_prochandle;
+
+__BEGIN_DECLS
+
+/* Read or write process memory at the given address.  */
+extern ps_err_e ps_pread(struct ps_prochandle *,
+                          psaddr_t, void *, size_t);
+extern ps_err_e ps_pwrite(struct ps_prochandle *,
+                          psaddr_t, const void *, size_t);
+extern ps_err_e ps_pdread (struct ps_prochandle *,
+                          psaddr_t, void *, size_t);
+extern ps_err_e ps_pdwrite (struct ps_prochandle *,
+                           psaddr_t, const void *, size_t);
+extern ps_err_e ps_ptread (struct ps_prochandle *,
+                          psaddr_t, void *, size_t);
+extern ps_err_e ps_ptwrite (struct ps_prochandle *,
+                           psaddr_t, const void *, size_t);
+
+
+/* Get and set the given LWP's general or FPU register set.  */
+extern ps_err_e ps_lgetregs (struct ps_prochandle *,
+                            lwpid_t, prgregset_t);
+extern ps_err_e ps_lsetregs (struct ps_prochandle *,
+                            lwpid_t, const prgregset_t);
+extern ps_err_e ps_lgetfpregs (struct ps_prochandle *,
+                              lwpid_t, prfpregset_t *);
+extern ps_err_e ps_lsetfpregs (struct ps_prochandle *,
+                              lwpid_t, const prfpregset_t *);
+
+/* Fetch the special per-thread address associated with the given LWP.
+   This call is only used on a few platforms (most use a normal register).
+   The meaning of the `int' parameter is machine-dependent.  */
+extern ps_err_e ps_get_thread_area (const struct ps_prochandle *,
+                                   lwpid_t, int, psaddr_t *);
+
+
+/* Look up the named symbol in the named DSO in the symbol tables
+   associated with the process being debugged, filling in *SYM_ADDR
+   with the corresponding run-time address.  */
+extern ps_err_e ps_pglobal_lookup (struct ps_prochandle *,
+                                  const char *object_name,
+                                  const char *sym_name,
+                                  psaddr_t *sym_addr);
+
+
+/* Stop or continue the entire process.  */
+extern ps_err_e ps_pstop (struct ps_prochandle *);
+extern ps_err_e ps_pcontinue (struct ps_prochandle *);
+
+/* Stop or continue the given LWP alone.  */
+extern ps_err_e ps_lstop (struct ps_prochandle *, lwpid_t);
+extern ps_err_e ps_lcontinue (struct ps_prochandle *, lwpid_t);
+
+__END_DECLS
+
+#endif /* _PROC_SERVICE_H */
index 6cdf071..0de81f3 100644 (file)
@@ -66,10 +66,22 @@ struct extmnttab
 __BEGIN_DECLS
 
 extern void    resetmnttab (FILE *);
-extern int     getmntent (FILE *, struct mnttab *);
-extern int     getextmntent (FILE *, struct extmnttab *, size_t);
-extern int     getmntany (FILE *, struct mnttab *, struct mnttab *);
-extern char    *hasmntopt (struct mnttab *, char *);
+# ifdef __REDIRECT_NTH
+extern int __getmntent_sun (FILE *, struct mnttab *);
+extern int __REDIRECT_NTH (getmntent, (FILE *, struct mnttab *),
+       __getmntent_sun);
+# else
+#  define getmntent __getmntent_sun
+# endif
+extern int getextmntent (FILE *, struct extmnttab *, size_t);
+extern int getmntany (FILE *, struct mnttab *, struct mnttab *);
+# ifdef __REDIRECT_NTH
+extern char    * __hasmntopt_sun (struct mnttab *, char *);
+extern char * __REDIRECT_NTH (hasmntopt, (struct mnttab *, char *),
+       __hasmntopt_sun);
+# else
+#  define hasmntopt __hasmntopt_sun
+# endif
 extern char    *mntopt (char **);
 
 __END_DECLS
index 37cea06..153d4ed 100644 (file)
 #ifndef _SYS_UCONTEXT_H
 #define _SYS_UCONTEXT_H        1
 
-#define __need_stack_t
-#include <bits/sigstack.h>
+#ifndef __stack_t_defined
+# define __need_stack_t
+# include <bits/sigstack.h>
+#endif
 #include <bits/sigset.h>
 #include <sys/regset.h>
 #include <features.h>
index c8a0378..fcfaadc 100644 (file)
@@ -164,7 +164,7 @@ _so_getsockopt      - getsockopt            i:iiiBNi    _so_getsockopt
 _so_listen          - listen                i:iii       _so_listen
 recv                - recv                  RCi:ibni    __libc_recv         __recv recv _so_recv
 recvfrom            - recvfrom              RCi:ibniBN  __libc_recvfrom     __recvfrom recvfrom _so_recvfrom
-recvmsg             - recvmsg               Ri:ipi      __libc_recvmsg      __recvmsg recvmsg _so_recvmsg
+recvmsg             - recvmsg               RCi:ipi     __libc_recvmsg      __recvmsg recvmsg _so_recvmsg
 _so_send            - send                  RCi:ibni    _so_send
 _so_sendmsg         - sendmsg               RCi:ipi     _so_sendmsg
 _so_sendto          - sendto                RCi:ibnibn  _so_sendto
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/thread_db.h
new file mode 100644 (file)
index 0000000..e9e0c5a
--- /dev/null
@@ -0,0 +1,454 @@
+/* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
+   Copyright (C) 1999,2001,2002,2003 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 _THREAD_DB_H
+#define _THREAD_DB_H   1
+
+/* This is the debugger interface for the NPTL library.  It is
+   modelled closely after the interface with same names in Solaris
+   with the goal to share the same code in the debugger.  */
+#include <pthread.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <sys/procfs_isa.h>
+#include <thread.h>
+
+
+/* Error codes of the library.  */
+typedef enum
+{
+  TD_OK,         /* No error.  */
+  TD_ERR,        /* No further specified error.  */
+  TD_NOTHR,      /* No matching thread found.  */
+  TD_NOSV,       /* No matching synchronization handle found.  */
+  TD_NOLWP,      /* No matching light-weighted process found.  */
+  TD_BADPH,      /* Invalid process handle.  */
+  TD_BADTH,      /* Invalid thread handle.  */
+  TD_BADSH,      /* Invalid synchronization handle.  */
+  TD_BADTA,      /* Invalid thread agent.  */
+  TD_BADKEY,     /* Invalid key.  */
+  TD_NOMSG,      /* No event available.  */
+  TD_NOFPREGS,   /* No floating-point register content available.  */
+  TD_NOLIBTHREAD, /* Application not linked with thread library.  */
+  TD_NOEVENT,    /* Requested event is not supported.  */
+  TD_NOCAPAB,    /* Capability not available.  */
+  TD_DBERR,      /* Internal debug library error.  */
+  TD_NOAPLIC,    /* Operation is not applicable.  */
+  TD_NOTSD,      /* No thread-specific data available.  */
+  TD_MALLOC,     /* Out of memory.  */
+  TD_PARTIALREG,  /* Not entire register set was read or written.  */
+  TD_NOXREGS,    /* X register set not available for given thread.  */
+  TD_TLSDEFER,   /* Thread has not yet allocated TLS for given module.  */
+  TD_NOTALLOC = TD_TLSDEFER,
+  TD_VERSION,    /* Version if libpthread and libthread_db do not match.  */
+  TD_NOTLS       /* There is no TLS segment in the given module.  */
+} td_err_e;
+
+
+/* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
+   select threads regardless of state in td_ta_thr_iter().  */
+typedef enum
+{
+  TD_THR_ANY_STATE,
+  TD_THR_UNKNOWN,
+  TD_THR_STOPPED,
+  TD_THR_RUN,
+  TD_THR_ACTIVE,
+  TD_THR_ZOMBIE,
+  TD_THR_SLEEP,
+  TD_THR_STOPPED_ASLEEP
+} td_thr_state_e;
+
+/* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
+   to select threads regardless of type in td_ta_thr_iter().  */
+typedef enum
+{
+  TD_THR_ANY_TYPE,
+  TD_THR_USER,
+  TD_THR_SYSTEM
+} td_thr_type_e;
+
+
+/* Types of the debugging library.  */
+
+/* Handle for a process.  This type is opaque.  */
+typedef struct td_thragent td_thragent_t;
+
+/* The actual thread handle type.  This is also opaque.  */
+typedef struct td_thrhandle
+{
+  td_thragent_t *th_ta_p;
+  psaddr_t th_unique;
+} td_thrhandle_t;
+
+
+/* Forward declaration of a type defined by and for the dynamic linker.  */
+struct link_map;
+
+
+/* Flags for `td_ta_thr_iter'.  */
+#define TD_THR_ANY_USER_FLAGS  0xffffffff
+#define TD_THR_LOWEST_PRIORITY -20
+#define TD_SIGNO_MASK          NULL
+
+
+#define TD_EVENTSIZE   2
+#define BT_UISHIFT     5 /* log base 2 of BT_NBIPUI, to extract word index */
+#define BT_NBIPUI      (1 << BT_UISHIFT)       /* n bits per uint */
+#define BT_UIMASK      (BT_NBIPUI - 1)         /* to extract bit index */
+
+/* Bitmask of enabled events. */
+typedef struct td_thr_events
+{
+  uint32_t event_bits[TD_EVENTSIZE];
+} td_thr_events_t;
+
+/* Event set manipulation macros. */
+#define __td_eventmask(n) \
+  (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
+#define __td_eventword(n) \
+  ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
+
+#define td_event_emptyset(setp) \
+  do {                                                                       \
+    int __i;                                                                 \
+    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
+      (setp)->event_bits[__i - 1] = 0;                                       \
+  } while (0)
+
+#define td_event_fillset(setp) \
+  do {                                                                       \
+    int __i;                                                                 \
+    for (__i = TD_EVENTSIZE; __i > 0; --__i)                                 \
+      (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);                   \
+  } while (0)
+
+#define td_event_addset(setp, n) \
+  (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
+#define td_event_delset(setp, n) \
+  (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
+#define td_eventismember(setp, n) \
+  (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
+#if TD_EVENTSIZE == 2
+# define td_eventisempty(setp) \
+  (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
+#else
+# error "td_eventisempty must be changed to match TD_EVENTSIZE"
+#endif
+
+/* Events reportable by the thread implementation.  */
+typedef enum
+{
+  TD_ALL_EVENTS,                /* Pseudo-event number.  */
+  TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
+  TD_READY,                     /* Is executable now. */
+  TD_SLEEP,                     /* Blocked in a synchronization obj.  */
+  TD_SWITCHTO,                  /* Now assigned to a process.  */
+  TD_SWITCHFROM,                /* Not anymore assigned to a process.  */
+  TD_LOCK_TRY,                  /* Trying to get an unavailable lock.  */
+  TD_CATCHSIG,                  /* Signal posted to the thread.  */
+  TD_IDLE,                      /* Process getting idle.  */
+  TD_CREATE,                    /* New thread created.  */
+  TD_DEATH,                     /* Thread terminated.  */
+  TD_PREEMPT,                   /* Preempted.  */
+  TD_PRI_INHERIT,               /* Inherited elevated priority.  */
+  TD_REAP,                      /* Reaped.  */
+  TD_CONCURRENCY,               /* Number of processes changing.  */
+  TD_TIMEOUT,                   /* Conditional variable wait timed out.  */
+  TD_MIN_EVENT_NUM = TD_READY,
+  TD_MAX_EVENT_NUM = TD_TIMEOUT,
+  TD_EVENTS_ENABLE = 31                /* Event reporting enabled.  */
+} td_event_e;
+
+/* Values representing the different ways events are reported.  */
+typedef enum
+{
+  NOTIFY_BPT,                  /* User must insert breakpoint at u.bptaddr. */
+  NOTIFY_AUTOBPT,              /* Breakpoint at u.bptaddr is automatically
+                                  inserted.  */
+  NOTIFY_SYSCALL               /* System call u.syscallno will be invoked.  */
+} td_notify_e;
+
+/* Description how event type is reported.  */
+typedef struct td_notify
+{
+  td_notify_e type;            /* Way the event is reported.  */
+  union
+  {
+    psaddr_t bptaddr;          /* Address of breakpoint.  */
+    int syscallno;             /* Number of system call used.  */
+  } u;
+} td_notify_t;
+
+/* Structure used to report event.  */
+typedef struct td_event_msg
+{
+  td_event_e event;            /* Event type being reported.  */
+  const td_thrhandle_t *th_p;  /* Thread reporting the event.  */
+  union
+  {
+# if 0
+    td_synchandle_t *sh;       /* Handle of synchronization object.  */
+#endif
+    uintptr_t data;            /* Event specific data.  */
+  } msg;
+} td_event_msg_t;
+
+/* Structure containing event data available in each thread structure.  */
+typedef struct
+{
+  td_thr_events_t eventmask;   /* Mask of enabled events.  */
+  td_event_e eventnum;         /* Number of last event.  */
+  void *eventdata;             /* Data associated with event.  */
+} td_eventbuf_t;
+
+
+/* Gathered statistics about the process.  */
+typedef struct td_ta_stats
+{
+  int nthreads;                /* Total number of threads in use.  */
+  int r_concurrency;           /* Concurrency level requested by user.  */
+  int nrunnable_num;           /* Average runnable threads, numerator.  */
+  int nrunnable_den;           /* Average runnable threads, denominator.  */
+  int a_concurrency_num;       /* Achieved concurrency level, numerator.  */
+  int a_concurrency_den;       /* Achieved concurrency level, denominator.  */
+  int nlwps_num;               /* Average number of processes in use,
+                                  numerator.  */
+  int nlwps_den;               /* Average number of processes in use,
+                                  denominator.  */
+  int nidle_num;               /* Average number of idling processes,
+                                  numerator.  */
+  int nidle_den;               /* Average number of idling processes,
+                                  denominator.  */
+} td_ta_stats_t;
+
+
+/* Callback for iteration over threads.  */
+typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
+
+/* Callback for iteration over thread local data.  */
+typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
+
+
+
+/* Forward declaration.  This has to be defined by the user.  */
+struct ps_prochandle;
+
+
+/* Information about the thread.  */
+typedef struct td_thrinfo
+{
+  td_thragent_t *ti_ta_p;              /* Process handle.  */
+  unsigned int ti_user_flags;          /* Unused.  */
+  thread_t ti_tid;                     /* Thread ID returned by
+                                          pthread_create().  */
+  char *ti_tls;                                /* Pointer to thread-local data.  */
+  psaddr_t ti_startfunc;               /* Start function passed to
+                                          pthread_create().  */
+  psaddr_t ti_stkbase;                 /* Base of thread's stack.  */
+  long int ti_stksize;                 /* Size of thread's stack.  */
+  psaddr_t ti_ro_area;                 /* Unused.  */
+  int ti_ro_size;                      /* Unused.  */
+  td_thr_state_e ti_state;             /* Thread state.  */
+  unsigned char ti_db_suspended;       /* Nonzero if suspended by debugger. */
+  td_thr_type_e ti_type;               /* Type of the thread (system vs
+                                          user thread).  */
+  intptr_t ti_pc;                      /* Unused.  */
+  intptr_t ti_sp;                      /* Unused.  */
+  short int ti_flags;                  /* Unused.  */
+  int ti_pri;                          /* Thread priority.  */
+  lwpid_t ti_lid;                      /* Kernel PID for this thread.  */
+  sigset_t ti_sigmask;                 /* Signal mask.  */
+  unsigned char ti_traceme;            /* Nonzero if event reporting
+                                          enabled.  */
+  unsigned char ti_preemptflag;                /* Unused.  */
+  unsigned char ti_pirecflag;          /* Unused.  */
+  sigset_t ti_pending;                 /* Set of pending signals.  */
+  td_thr_events_t ti_events;           /* Set of enabled events.  */
+} td_thrinfo_t;
+
+
+
+/* Prototypes for exported library functions.  */
+
+/* Initialize the thread debug support library.  */
+extern td_err_e td_init (void);
+
+/* Historical relict.  Should not be used anymore.  */
+extern td_err_e td_log (void);
+
+/* Return list of symbols the library can request.  */
+extern const char **td_symbol_list (void);
+
+/* Generate new thread debug library handle for process PS.  */
+extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
+
+/* Free resources allocated for TA.  */
+extern td_err_e td_ta_delete (td_thragent_t *__ta);
+
+/* Get number of currently running threads in process associated with TA.  */
+extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
+
+/* Return process handle passed in `td_ta_new' for process associated with
+   TA.  */
+extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
+                             struct ps_prochandle **__ph);
+
+/* Map thread library handle PT to thread debug library handle for process
+   associated with TA and store result in *TH.  */
+extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
+                                 td_thrhandle_t *__th);
+
+/* Map process ID LWPID to thread debug library handle for process
+   associated with TA and store result in *TH.  */
+extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
+                                  td_thrhandle_t *__th);
+
+
+/* Call for each thread in a process associated with TA the callback function
+   CALLBACK.  */
+extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
+                               td_thr_iter_f *__callback, void *__cbdata_p,
+                               td_thr_state_e __state, int __ti_pri,
+                               sigset_t *__ti_sigmask_p,
+                               unsigned int __ti_user_flags);
+
+/* Call for each defined thread local data entry the callback function KI.  */
+extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
+                               void *__p);
+
+
+/* Get event address for EVENT.  */
+extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
+                                 td_event_e __event, td_notify_t *__ptr);
+
+/* Enable EVENT in global mask.  */
+extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
+                                td_thr_events_t *__event);
+
+/* Disable EVENT in global mask.  */
+extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
+                                  td_thr_events_t *__event);
+
+/* Return information about last event.  */
+extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
+                                   td_event_msg_t *__msg);
+
+
+/* Set suggested concurrency level for process associated with TA.  */
+extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
+
+
+/* Enable collecting statistics for process associated with TA.  */
+extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
+
+/* Reset statistics.  */
+extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
+
+/* Retrieve statistics from process associated with TA.  */
+extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
+                                td_ta_stats_t *__statsp);
+
+
+/* Validate that TH is a thread handle.  */
+extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
+
+/* Return information about thread TH.  */
+extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
+                                td_thrinfo_t *__infop);
+
+/* Retrieve floating-point register contents of process running thread TH.  */
+extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
+                                 prfpregset_t *__regset);
+
+/* Retrieve general register contents of process running thread TH.  */
+extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
+                                prgregset_t __gregs);
+
+/* Retrieve extended register contents of process running thread TH.  */
+extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
+
+/* Get size of extended register set of process running thread TH.  */
+extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
+
+/* Set floating-point register contents of process running thread TH.  */
+extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
+                                 const prfpregset_t *__fpregs);
+
+/* Set general register contents of process running thread TH.  */
+extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
+                                prgregset_t __gregs);
+
+/* Set extended register contents of process running thread TH.  */
+extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
+                                const void *__addr);
+
+
+/* Get address of the given module's TLS storage area for the given thread.  */
+extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
+                               unsigned long int __modid,
+                               psaddr_t *__base);
+
+/* Get address of thread local variable.  */
+extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
+                                    psaddr_t __map_address, size_t __offset,
+                                    psaddr_t *__address);
+
+
+/* Enable reporting for EVENT for thread TH.  */
+extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
+
+/* Enable EVENT for thread TH.  */
+extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
+                                 td_thr_events_t *__event);
+
+/* Disable EVENT for thread TH.  */
+extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
+                                   td_thr_events_t *__event);
+
+/* Get event message for thread TH.  */
+extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
+                                    td_event_msg_t *__msg);
+
+
+/* Set priority of thread TH.  */
+extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
+
+
+/* Set pending signals for thread TH.  */
+extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
+                                     unsigned char __n, const sigset_t *__ss);
+
+/* Set signal mask for thread TH.  */
+extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
+                                  const sigset_t *__ss);
+
+
+/* Return thread local data associated with key TK in thread TH.  */
+extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
+                           const thread_key_t __tk, void **__data);
+
+
+/* Suspend execution of thread TH.  */
+extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
+
+/* Resume execution of thread TH.  */
+extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
+
+#endif /* thread_db.h */
index f8f6029..9184ad9 100644 (file)
@@ -21,6 +21,7 @@
 #include <streams/stropts.h>
 #include <sys/ptms.h>
 #include <stddef.h>
+#include <errno.h>
 
 int
 unlockpt (int fd)
@@ -31,5 +32,9 @@ unlockpt (int fd)
   si.ic_timout = 0;
   si.ic_len = 0;
   si.ic_dp = NULL;
-  return ioctl (fd, I_STR, &si);
+
+  int res = (ioctl (fd, I_STR, &si) < 0) ? -1 :0;
+  if (res != 0 && errno == ENOTTY)
+    __set_errno (EINVAL);
+  return res;
 }
index f6adcd4..40ff2d6 100644 (file)
@@ -21,6 +21,8 @@
 #include <zoneP.h>
 #include <privP.h>
 #include <dlfcn.h>
+#include <streams/stropts.h>
+#include <sys/ptms.h>
 
 static int (*_zone_get_id) (const char *, zoneid_t *);
 
@@ -84,3 +86,16 @@ int zone_get_id (const char *str, zoneid_t *idp)
 
   return ENOSYS;
 }
+
+
+int zonept (int fd, zoneid_t zoneid)
+{
+  /* Send ZONEPT down.  */
+  struct strioctl si;
+  si.ic_cmd = ZONEPT;
+  si.ic_timout = 0;
+  si.ic_len = sizeof (zoneid_t);
+  si.ic_dp = (char *)&zoneid;
+
+  return (ioctl (fd, I_STR, &si) < 0) ? -1 : 0;
+}