2000-05-22 H.J. Lu <hjl@gnu.org>
[deliverable/binutils-gdb.git] / gdb / sol-thread.c
index 71e92167bdfa149419f0fad4cc1fec462355c9ab..77e3fb14e9b44a280eba1d677ba83884dc60a879 100644 (file)
@@ -122,65 +122,70 @@ static void init_sol_core_ops PARAMS ((void));
 /* Default definitions: These must be defined in tm.h 
    if they are to be shared with a process module such as procfs.  */
 
-#define THREAD_FLAG            0x80000000
-#define is_thread(ARG)         (((ARG) & THREAD_FLAG) != 0)
-#define is_lwp(ARG)            (((ARG) & THREAD_FLAG) == 0)
-#define GET_LWP(PID)           TIDGET (PID)
-#define GET_THREAD(PID)        (((PID) >> 16) & 0x7fff)
-#define BUILD_LWP(TID, PID)    ((TID) << 16 | (PID))
+#define THREAD_FLAG            0x80000000
+#define is_thread(ARG)         (((ARG) & THREAD_FLAG) != 0)
+#define is_lwp(ARG)            (((ARG) & THREAD_FLAG) == 0)
+#define GET_LWP(PID)           TIDGET (PID)
+#define GET_THREAD(PID)                TIDGET (PID)
+#define BUILD_LWP(TID, PID)    MERGEPID (PID, TID)
 
-#define BUILD_THREAD(THREAD_ID, PID) (THREAD_FLAG | BUILD_LWP (THREAD_ID, PID))
+#define BUILD_THREAD(TID, PID) (MERGEPID (PID, TID) | THREAD_FLAG)
 
 /* Pointers to routines from lithread_db resolved by dlopen() */
 
-static void
-  (*p_td_log) (const int on_off);
-static td_err_e
-  (*p_td_ta_new) (const struct ps_prochandle * ph_p, td_thragent_t ** ta_pp);
-static td_err_e
-  (*p_td_ta_delete) (td_thragent_t * ta_p);
-static td_err_e
-  (*p_td_init) (void);
-static td_err_e
-  (*p_td_ta_get_ph) (const td_thragent_t * ta_p, struct ps_prochandle ** ph_pp);
-static td_err_e
-  (*p_td_ta_get_nthreads) (const td_thragent_t * ta_p, int *nthread_p);
-static td_err_e
-  (*p_td_ta_tsd_iter) (const td_thragent_t * ta_p, td_key_iter_f * cb, void *cbdata_p);
-static td_err_e
-  (*p_td_ta_thr_iter) (const td_thragent_t * ta_p, td_thr_iter_f * cb, void *cbdata_p, td_thr_state_e state,
-              int ti_pri, sigset_t * ti_sigmask_p, unsigned ti_user_flags);
-static td_err_e
-  (*p_td_thr_validate) (const td_thrhandle_t * th_p);
-static td_err_e
-  (*p_td_thr_tsd) (const td_thrhandle_t * th_p, const thread_key_t key, void **data_pp);
-static td_err_e
-  (*p_td_thr_get_info) (const td_thrhandle_t * th_p, td_thrinfo_t * ti_p);
-static td_err_e
-  (*p_td_thr_getfpregs) (const td_thrhandle_t * th_p, prfpregset_t * fpregset);
-static td_err_e
-  (*p_td_thr_getxregsize) (const td_thrhandle_t * th_p, int *xregsize);
-static td_err_e
-  (*p_td_thr_getxregs) (const td_thrhandle_t * th_p, const caddr_t xregset);
-static td_err_e
-  (*p_td_thr_sigsetmask) (const td_thrhandle_t * th_p, const sigset_t ti_sigmask);
-static td_err_e
-  (*p_td_thr_setprio) (const td_thrhandle_t * th_p, const int ti_pri);
-static td_err_e
-  (*p_td_thr_setsigpending) (const td_thrhandle_t * th_p, const uchar_t ti_pending_flag, const sigset_t ti_pending);
-static td_err_e
-  (*p_td_thr_setfpregs) (const td_thrhandle_t * th_p, const prfpregset_t * fpregset);
-static td_err_e
-  (*p_td_thr_setxregs) (const td_thrhandle_t * th_p, const caddr_t xregset);
-static td_err_e
-  (*p_td_ta_map_id2thr) (const td_thragent_t * ta_p, thread_t tid, td_thrhandle_t * th_p);
-static td_err_e
-  (*p_td_ta_map_lwp2thr) (const td_thragent_t * ta_p, lwpid_t lwpid, td_thrhandle_t * th_p);
-static td_err_e
-  (*p_td_thr_getgregs) (const td_thrhandle_t * th_p, prgregset_t regset);
-static td_err_e
-  (*p_td_thr_setgregs) (const td_thrhandle_t * th_p, const prgregset_t regset);
-\f
+static void     (*p_td_log)               (const int on_off);
+static td_err_e (*p_td_ta_new)            (const struct ps_prochandle * ph_p, 
+                                          td_thragent_t ** ta_pp);
+static td_err_e (*p_td_ta_delete)         (td_thragent_t * ta_p);
+static td_err_e (*p_td_init)              (void);
+static td_err_e (*p_td_ta_get_ph)         (const td_thragent_t * ta_p, 
+                                          struct ps_prochandle ** ph_pp);
+static td_err_e (*p_td_ta_get_nthreads)   (const td_thragent_t * ta_p, 
+                                          int *nthread_p);
+static td_err_e (*p_td_ta_tsd_iter)       (const td_thragent_t * ta_p, 
+                                          td_key_iter_f * cb, 
+                                          void *cbdata_p);
+static td_err_e (*p_td_ta_thr_iter)       (const td_thragent_t * ta_p, 
+                                          td_thr_iter_f * cb, 
+                                          void *cbdata_p, 
+                                          td_thr_state_e state,
+                                          int ti_pri, 
+                                          sigset_t * ti_sigmask_p, 
+                                          unsigned ti_user_flags);
+static td_err_e (*p_td_thr_validate)      (const td_thrhandle_t * th_p);
+static td_err_e (*p_td_thr_tsd)           (const td_thrhandle_t * th_p, 
+                                          const thread_key_t key, 
+                                          void **data_pp);
+static td_err_e (*p_td_thr_get_info)      (const td_thrhandle_t * th_p, 
+                                          td_thrinfo_t * ti_p);
+static td_err_e (*p_td_thr_getfpregs)     (const td_thrhandle_t * th_p, 
+                                          prfpregset_t * fpregset);
+static td_err_e (*p_td_thr_getxregsize)   (const td_thrhandle_t * th_p, 
+                                          int *xregsize);
+static td_err_e (*p_td_thr_getxregs)      (const td_thrhandle_t * th_p, 
+                                          const caddr_t xregset);
+static td_err_e (*p_td_thr_sigsetmask)    (const td_thrhandle_t * th_p, 
+                                          const sigset_t ti_sigmask);
+static td_err_e (*p_td_thr_setprio)       (const td_thrhandle_t * th_p, 
+                                          const int ti_pri);
+static td_err_e (*p_td_thr_setsigpending) (const td_thrhandle_t * th_p, 
+                                          const uchar_t ti_pending_flag, 
+                                          const sigset_t ti_pending);
+static td_err_e (*p_td_thr_setfpregs)     (const td_thrhandle_t * th_p, 
+                                          const prfpregset_t * fpregset);
+static td_err_e (*p_td_thr_setxregs)      (const td_thrhandle_t * th_p, 
+                                          const caddr_t xregset);
+static td_err_e (*p_td_ta_map_id2thr)     (const td_thragent_t * ta_p, 
+                                          thread_t tid, 
+                                          td_thrhandle_t * th_p);
+static td_err_e (*p_td_ta_map_lwp2thr)    (const td_thragent_t * ta_p, 
+                                          lwpid_t lwpid, 
+                                          td_thrhandle_t * th_p);
+static td_err_e (*p_td_thr_getgregs)      (const td_thrhandle_t * th_p, 
+                                          prgregset_t regset);
+static td_err_e (*p_td_thr_setgregs)      (const td_thrhandle_t * th_p, 
+                                          const prgregset_t regset);
+
 /*
 
    LOCAL FUNCTION
@@ -390,7 +395,8 @@ lwp_to_thread (lwp)
 
   val = p_td_thr_validate (&th);
   if (val == TD_NOTHR)
-    return lwp;                        /* libthread doesn't know about it, just return lwp */
+    return lwp;                        /* libthread doesn't know about it;
+                                  just return lwp */
   else if (val != TD_OK)
     error ("lwp_to_thread: td_thr_validate: %s.", td_err_string (val));
 
@@ -847,7 +853,8 @@ sol_thread_create_inferior (exec_file, allargs, env)
       if (inferior_pid == -1)
        inferior_pid = main_ph.pid;
 
-      add_thread (inferior_pid);
+      if (!in_thread_list (inferior_pid))
+       add_thread (inferior_pid);
     }
 }
 
@@ -995,11 +1002,13 @@ typedef const struct ps_prochandle *gdb_ps_prochandle_t;
 typedef char *gdb_ps_read_buf_t;
 typedef char *gdb_ps_write_buf_t;
 typedef int gdb_ps_size_t;
+typedef paddr_t gdb_ps_addr_t;
 #else
 typedef struct ps_prochandle *gdb_ps_prochandle_t;
 typedef void *gdb_ps_read_buf_t;
 typedef const void *gdb_ps_write_buf_t;
 typedef size_t gdb_ps_size_t;
+typedef psaddr_t gdb_ps_addr_t;
 #endif
 
 
@@ -1044,7 +1053,7 @@ ps_lcontinue (gdb_ps_prochandle_t ph, lwpid_t lwpid)
 
 ps_err_e
 ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *ld_object_name,
-                  const char *ld_symbol_name, paddr_t * ld_symbol_addr)
+                  const char *ld_symbol_name, gdb_ps_addr_t * ld_symbol_addr)
 {
   struct minimal_symbol *ms;
 
@@ -1061,7 +1070,7 @@ ps_pglobal_lookup (gdb_ps_prochandle_t ph, const char *ld_object_name,
 /* Common routine for reading and writing memory.  */
 
 static ps_err_e
-rw_common (int dowrite, const struct ps_prochandle *ph, paddr_t addr,
+rw_common (int dowrite, const struct ps_prochandle *ph, gdb_ps_addr_t addr,
           char *buf, int size)
 {
   struct cleanup *old_chain;
@@ -1105,7 +1114,7 @@ rw_common (int dowrite, const struct ps_prochandle *ph, paddr_t addr,
 /* Copies SIZE bytes from target process .data segment to debugger memory.  */
 
 ps_err_e
-ps_pdread (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_pdread (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
           gdb_ps_read_buf_t buf, gdb_ps_size_t size)
 {
   return rw_common (0, ph, addr, buf, size);
@@ -1114,7 +1123,7 @@ ps_pdread (gdb_ps_prochandle_t ph, paddr_t addr,
 /* Copies SIZE bytes from debugger memory .data segment to target process.  */
 
 ps_err_e
-ps_pdwrite (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_pdwrite (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
            gdb_ps_write_buf_t buf, gdb_ps_size_t size)
 {
   return rw_common (1, ph, addr, (char *) buf, size);
@@ -1123,7 +1132,7 @@ ps_pdwrite (gdb_ps_prochandle_t ph, paddr_t addr,
 /* Copies SIZE bytes from target process .text segment to debugger memory.  */
 
 ps_err_e
-ps_ptread (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_ptread (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
           gdb_ps_read_buf_t buf, gdb_ps_size_t size)
 {
   return rw_common (0, ph, addr, buf, size);
@@ -1132,7 +1141,7 @@ ps_ptread (gdb_ps_prochandle_t ph, paddr_t addr,
 /* Copies SIZE bytes from debugger memory .text segment to target process.  */
 
 ps_err_e
-ps_ptwrite (gdb_ps_prochandle_t ph, paddr_t addr,
+ps_ptwrite (gdb_ps_prochandle_t ph, gdb_ps_addr_t addr,
            gdb_ps_write_buf_t buf, gdb_ps_size_t size)
 {
   return rw_common (1, ph, addr, (char *) buf, size);
@@ -1318,61 +1327,30 @@ ps_lsetfpregs (gdb_ps_prochandle_t ph, lwpid_t lwpid,
 
 #ifdef TM_I386SOL2_H
 
-/* Get local descriptor table.  */
-
-#include <sys/procfs.h>
-#include <sys/reg.h>
-#include <sys/sysi86.h>
-
-static int nldt_allocated = 0;
-static struct ssd *ldt_bufp = NULL;
-
 /* Reads the local descriptor table of a LWP.  */
 
 ps_err_e
 ps_lgetLDT (gdb_ps_prochandle_t ph, lwpid_t lwpid,
            struct ssd *pldt)
 {
-  gregset_t gregset;
-  int lwp_fd;
-  ps_err_e val;
-  int nldt;
-  int i;
-
-  /* Get procfs file descriptor for the LWP.  */
-  lwp_fd = procfs_get_pid_fd (BUILD_LWP (lwpid, PIDGET (inferior_pid)));
-  if (lwp_fd < 0)
-    return PS_BADLID;
+  /* NOTE: only used on Solaris, therefore OK to refer to procfs.c */
+  extern struct ssd *procfs_find_LDT_entry (int);
+  struct ssd *ret;
 
-  /* Fetch registers und LDT descriptors.  */
-  if (ioctl (lwp_fd, PIOCGREG, &gregset) == -1)
-    return PS_ERR;
+  /* FIXME: can't I get the process ID from the prochandle or something?
+   */
 
-  if (ioctl (lwp_fd, PIOCNLDT, &nldt) == -1)
-    return PS_ERR;
+  if (inferior_pid <= 0 || lwpid <= 0)
+    return PS_BADLID;
 
-  if (nldt_allocated < nldt)
+  ret = procfs_find_LDT_entry (BUILD_LWP (lwpid, PIDGET (inferior_pid)));
+  if (ret)
     {
-      ldt_bufp
-       = (struct ssd *) xrealloc (ldt_bufp, (nldt + 1) * sizeof (struct ssd));
-      nldt_allocated = nldt;
+      memcpy (pldt, ret, sizeof (struct ssd));
+      return PS_OK;
     }
-
-  if (ioctl (lwp_fd, PIOCLDT, ldt_bufp) == -1)
+  else /* LDT not found. */
     return PS_ERR;
-
-  /* Search LDT for the LWP via register GS.  */
-  for (i = 0; i < nldt; i++)
-    {
-      if (ldt_bufp[i].sel == (gregset[GS] & 0xffff))
-       {
-         *pldt = ldt_bufp[i];
-         return PS_OK;
-       }
-    }
-
-  /* LDT not found.  */
-  return PS_ERR;
 }
 #endif /* TM_I386SOL2_H */
 \f
@@ -1661,7 +1639,13 @@ init_sol_core_ops ()
   sol_core_ops.to_has_registers = 1;
   sol_core_ops.to_has_execution = 0;
   sol_core_ops.to_has_thread_control = tc_none;
+  sol_core_ops.to_thread_alive = sol_thread_alive;
   sol_core_ops.to_pid_to_str = solaris_pid_to_str;
+  /* On Solaris/x86, when debugging a threaded core file from process <n>,
+     the following causes "info threads" to produce "procfs: couldn't find pid
+     <n> in procinfo list" where <n> is the pid of the process that produced
+     the core file.  Disable it for now. */
+  /* sol_core_ops.to_find_new_threads = sol_find_new_threads; */
   sol_core_ops.to_sections = 0;
   sol_core_ops.to_sections_end = 0;
   sol_core_ops.to_magic = OPS_MAGIC;
This page took 0.028575 seconds and 4 git commands to generate.