1/* Low level interface for debugging AIX 4.3+ pthreads.
2
3   Copyright (C) 1999, 2000, 2002, 2007 Free Software Foundation, Inc.
4   Written by Nick Duffek <nsd@redhat.com>.
5
6   This file is part of GDB.
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 3 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21
22/* This module uses the libpthdebug.a library provided by AIX 4.3+ for
23   debugging pthread applications.
24
25   Some name prefix conventions:
26     pthdb_	provided by libpthdebug.a
27     pdc_	callbacks that this module provides to libpthdebug.a
28     pd_	variables or functions interfacing with libpthdebug.a
29
30   libpthdebug peculiarities:
31
32     - pthdb_ptid_pthread() is prototyped in <sys/pthdebug.h>, but
33       it's not documented, and after several calls it stops working
34       and causes other libpthdebug functions to fail.
35
36     - pthdb_tid_pthread() doesn't always work after
37       pthdb_session_update(), but it does work after cycling through
38       all threads using pthdb_pthread().
39
40     */
41
42#include "defs.h"
43#include "gdb_assert.h"
44#include "gdbthread.h"
45#include "target.h"
46#include "inferior.h"
47#include "regcache.h"
48#include "gdbcmd.h"
49#include "ppc-tdep.h"
50#include "gdb_string.h"
51#include "observer.h"
52
53#include <procinfo.h>
54#include <sys/types.h>
55#include <sys/ptrace.h>
56#include <sys/reg.h>
57#include <sched.h>
58#include <sys/pthdebug.h>
59
60/* Whether to emit debugging output.  */
61static int debug_aix_thread;
62
63/* In AIX 5.1, functions use pthdb_tid_t instead of tid_t.  */
64#ifndef PTHDB_VERSION_3
65#define pthdb_tid_t	tid_t
66#endif
67
68/* Return whether to treat PID as a debuggable thread id.  */
69
70#define PD_TID(ptid)	(pd_active && ptid_get_tid (ptid) != 0)
71
72/* Build a thread ptid.  */
73#define BUILD_THREAD(TID, PID) ptid_build (PID, 0, TID)
74
75/* Build and lwp ptid.  */
76#define BUILD_LWP(LWP, PID) MERGEPID (PID, LWP)
77
78/* pthdb_user_t value that we pass to pthdb functions.  0 causes
79   PTHDB_BAD_USER errors, so use 1.  */
80
81#define PD_USER	1
82
83/* Success and failure values returned by pthdb callbacks.  */
84
85#define PDC_SUCCESS	PTHDB_SUCCESS
86#define PDC_FAILURE	PTHDB_CALLBACK
87
88/* Private data attached to each element in GDB's thread list.  */
89
90struct private_thread_info {
91  pthdb_pthread_t pdtid;	 /* thread's libpthdebug id */
92  pthdb_tid_t tid;			/* kernel thread id */
93};
94
95/* Information about a thread of which libpthdebug is aware.  */
96
97struct pd_thread {
98  pthdb_pthread_t pdtid;
99  pthread_t pthid;
100  pthdb_tid_t tid;
101};
102
103/* This module's target-specific operations, active while pd_able is true.  */
104
105static struct target_ops aix_thread_ops;
106
107/* Copy of the target over which ops is pushed.  This is more
108   convenient than a pointer to deprecated_child_ops or core_ops,
109   because they lack current_target's default callbacks.  */
110
111static struct target_ops base_target;
112
113/* Address of the function that libpthread will call when libpthdebug
114   is ready to be initialized.  */
115
116static CORE_ADDR pd_brk_addr;
117
118/* Whether the current application is debuggable by pthdb.  */
119
120static int pd_able = 0;
121
122/* Whether a threaded application is being debugged.  */
123
124static int pd_active = 0;
125
126/* Whether the current architecture is 64-bit.
127   Only valid when pd_able is true.  */
128
129static int arch64;
130
131/* Forward declarations for pthdb callbacks.  */
132
133static int pdc_symbol_addrs (pthdb_user_t, pthdb_symbol_t *, int);
134static int pdc_read_data (pthdb_user_t, void *, pthdb_addr_t, size_t);
135static int pdc_write_data (pthdb_user_t, void *, pthdb_addr_t, size_t);
136static int pdc_read_regs (pthdb_user_t user, pthdb_tid_t tid,
137			  unsigned long long flags,
138			  pthdb_context_t *context);
139static int pdc_write_regs (pthdb_user_t user, pthdb_tid_t tid,
140			   unsigned long long flags,
141			   pthdb_context_t *context);
142static int pdc_alloc (pthdb_user_t, size_t, void **);
143static int pdc_realloc (pthdb_user_t, void *, size_t, void **);
144static int pdc_dealloc (pthdb_user_t, void *);
145
146/* pthdb callbacks.  */
147
148static pthdb_callbacks_t pd_callbacks = {
149  pdc_symbol_addrs,
150  pdc_read_data,
151  pdc_write_data,
152  pdc_read_regs,
153  pdc_write_regs,
154  pdc_alloc,
155  pdc_realloc,
156  pdc_dealloc,
157  NULL
158};
159
160/* Current pthdb session.  */
161
162static pthdb_session_t pd_session;
163
164/* Return a printable representation of pthdebug function return
165   STATUS.  */
166
167static char *
168pd_status2str (int status)
169{
170  switch (status)
171    {
172    case PTHDB_SUCCESS:		return "SUCCESS";
173    case PTHDB_NOSYS:		return "NOSYS";
174    case PTHDB_NOTSUP:		return "NOTSUP";
175    case PTHDB_BAD_VERSION:	return "BAD_VERSION";
176    case PTHDB_BAD_USER:	return "BAD_USER";
177    case PTHDB_BAD_SESSION:	return "BAD_SESSION";
178    case PTHDB_BAD_MODE:	return "BAD_MODE";
179    case PTHDB_BAD_FLAGS:	return "BAD_FLAGS";
180    case PTHDB_BAD_CALLBACK:	return "BAD_CALLBACK";
181    case PTHDB_BAD_POINTER:	return "BAD_POINTER";
182    case PTHDB_BAD_CMD:		return "BAD_CMD";
183    case PTHDB_BAD_PTHREAD:	return "BAD_PTHREAD";
184    case PTHDB_BAD_ATTR:	return "BAD_ATTR";
185    case PTHDB_BAD_MUTEX:	return "BAD_MUTEX";
186    case PTHDB_BAD_MUTEXATTR:	return "BAD_MUTEXATTR";
187    case PTHDB_BAD_COND:	return "BAD_COND";
188    case PTHDB_BAD_CONDATTR:	return "BAD_CONDATTR";
189    case PTHDB_BAD_RWLOCK:	return "BAD_RWLOCK";
190    case PTHDB_BAD_RWLOCKATTR:	return "BAD_RWLOCKATTR";
191    case PTHDB_BAD_KEY:		return "BAD_KEY";
192    case PTHDB_BAD_PTID:	return "BAD_PTID";
193    case PTHDB_BAD_TID:		return "BAD_TID";
194    case PTHDB_CALLBACK:	return "CALLBACK";
195    case PTHDB_CONTEXT:		return "CONTEXT";
196    case PTHDB_HELD:		return "HELD";
197    case PTHDB_NOT_HELD:	return "NOT_HELD";
198    case PTHDB_MEMORY:		return "MEMORY";
199    case PTHDB_NOT_PTHREADED:	return "NOT_PTHREADED";
200    case PTHDB_SYMBOL:		return "SYMBOL";
201    case PTHDB_NOT_AVAIL:	return "NOT_AVAIL";
202    case PTHDB_INTERNAL:	return "INTERNAL";
203    default:			return "UNKNOWN";
204    }
205}
206
207/* A call to ptrace(REQ, ID, ...) just returned RET.  Check for
208   exceptional conditions and either return nonlocally or else return
209   1 for success and 0 for failure.  */
210
211static int
212ptrace_check (int req, int id, int ret)
213{
214  if (ret == 0 && !errno)
215    return 1;
216
217  /* According to ptrace(2), ptrace may fail with EPERM if "the
218     Identifier parameter corresponds to a kernel thread which is
219     stopped in kernel mode and whose computational state cannot be
220     read or written."  This happens quite often with register reads.  */
221
222  switch (req)
223    {
224    case PTT_READ_GPRS:
225    case PTT_READ_FPRS:
226    case PTT_READ_SPRS:
227      if (ret == -1 && errno == EPERM)
228	{
229	  if (debug_aix_thread)
230	    fprintf_unfiltered (gdb_stdlog,
231				"ptrace (%d, %d) = %d (errno = %d)\n",
232				req, id, ret, errno);
233	  return ret == -1 ? 0 : 1;
234	}
235      break;
236    }
237  error (_("aix-thread: ptrace (%d, %d) returned %d (errno = %d %s)"),
238	 req, id, ret, errno, safe_strerror (errno));
239  return 0;  /* Not reached.  */
240}
241
242/* Call ptracex (REQ, ID, ADDR, DATA, BUF).  Return success.  */
243
244static int
245ptrace64aix (int req, int id, long long addr, int data, int *buf)
246{
247  errno = 0;
248  return ptrace_check (req, id, ptracex (req, id, addr, data, buf));
249}
250
251/* Call ptrace (REQ, ID, ADDR, DATA, BUF).  Return success.  */
252
253static int
254ptrace32 (int req, int id, int *addr, int data, int *buf)
255{
256  errno = 0;
257  return ptrace_check (req, id,
258		       ptrace (req, id, (int *) addr, data, buf));
259}
260
261/* If *PIDP is a composite process/thread id, convert it to a
262   process id.  */
263
264static void
265pid_to_prc (ptid_t *ptidp)
266{
267  ptid_t ptid;
268
269  ptid = *ptidp;
270  if (PD_TID (ptid))
271    *ptidp = pid_to_ptid (PIDGET (ptid));
272}
273
274/* pthdb callback: for <i> from 0 to COUNT, set SYMBOLS[<i>].addr to
275   the address of SYMBOLS[<i>].name.  */
276
277static int
278pdc_symbol_addrs (pthdb_user_t user, pthdb_symbol_t *symbols, int count)
279{
280  struct minimal_symbol *ms;
281  int i;
282  char *name;
283
284  if (debug_aix_thread)
285    fprintf_unfiltered (gdb_stdlog,
286      "pdc_symbol_addrs (user = %ld, symbols = 0x%lx, count = %d)\n",
287      user, (long) symbols, count);
288
289  for (i = 0; i < count; i++)
290    {
291      name = symbols[i].name;
292      if (debug_aix_thread)
293	fprintf_unfiltered (gdb_stdlog,
294			    "  symbols[%d].name = \"%s\"\n", i, name);
295
296      if (!*name)
297	symbols[i].addr = 0;
298      else
299	{
300	  if (!(ms = lookup_minimal_symbol (name, NULL, NULL)))
301	    {
302	      if (debug_aix_thread)
303		fprintf_unfiltered (gdb_stdlog, " returning PDC_FAILURE\n");
304	      return PDC_FAILURE;
305	    }
306	  symbols[i].addr = SYMBOL_VALUE_ADDRESS (ms);
307	}
308      if (debug_aix_thread)
309	fprintf_unfiltered (gdb_stdlog, "  symbols[%d].addr = %s\n",
310			    i, hex_string (symbols[i].addr));
311    }
312  if (debug_aix_thread)
313    fprintf_unfiltered (gdb_stdlog, " returning PDC_SUCCESS\n");
314  return PDC_SUCCESS;
315}
316
317/* Read registers call back function should be able to read the
318   context information of a debuggee kernel thread from an active
319   process or from a core file.  The information should be formatted
320   in context64 form for both 32-bit and 64-bit process.
321   If successful return 0, else non-zero is returned.  */
322
323static int
324pdc_read_regs (pthdb_user_t user,
325	       pthdb_tid_t tid,
326	       unsigned long long flags,
327	       pthdb_context_t *context)
328{
329  /* This function doesn't appear to be used, so we could probably
330   just return 0 here.  HOWEVER, if it is not defined, the OS will
331   complain and several thread debug functions will fail.  In case
332   this is needed, I have implemented what I think it should do,
333   however this code is untested.  */
334
335  uint64_t gprs64[ppc_num_gprs];
336  uint32_t gprs32[ppc_num_gprs];
337  double fprs[ppc_num_fprs];
338  struct ptxsprs sprs64;
339  struct ptsprs sprs32;
340
341  if (debug_aix_thread)
342    fprintf_unfiltered (gdb_stdlog, "pdc_read_regs tid=%d flags=%s\n",
343                        (int) tid, hex_string (flags));
344
345  /* General-purpose registers.  */
346  if (flags & PTHDB_FLAG_GPRS)
347    {
348      if (arch64)
349	{
350	  if (!ptrace64aix (PTT_READ_GPRS, tid,
351			    (unsigned long) gprs64, 0, NULL))
352	    memset (gprs64, 0, sizeof (gprs64));
353	  memcpy (context->gpr, gprs64, sizeof(gprs64));
354	}
355      else
356	{
357	  if (!ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL))
358	    memset (gprs32, 0, sizeof (gprs32));
359	  memcpy (context->gpr, gprs32, sizeof(gprs32));
360	}
361    }
362
363  /* Floating-point registers.  */
364  if (flags & PTHDB_FLAG_FPRS)
365    {
366      if (!ptrace32 (PTT_READ_FPRS, tid, (int *) fprs, 0, NULL))
367	memset (fprs, 0, sizeof (fprs));
368      	  memcpy (context->fpr, fprs, sizeof(fprs));
369    }
370
371  /* Special-purpose registers.  */
372  if (flags & PTHDB_FLAG_SPRS)
373    {
374      if (arch64)
375	{
376	  if (!ptrace64aix (PTT_READ_SPRS, tid,
377			    (unsigned long) &sprs64, 0, NULL))
378	    memset (&sprs64, 0, sizeof (sprs64));
379      	  memcpy (&context->msr, &sprs64, sizeof(sprs64));
380	}
381      else
382	{
383	  if (!ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL))
384	    memset (&sprs32, 0, sizeof (sprs32));
385      	  memcpy (&context->msr, &sprs32, sizeof(sprs32));
386	}
387    }
388  return 0;
389}
390
391/* Write register function should be able to write requested context
392   information to specified debuggee's kernel thread id.
393   If successful return 0, else non-zero is returned.  */
394
395static int
396pdc_write_regs (pthdb_user_t user,
397		pthdb_tid_t tid,
398		unsigned long long flags,
399		pthdb_context_t *context)
400{
401  /* This function doesn't appear to be used, so we could probably
402     just return 0 here.  HOWEVER, if it is not defined, the OS will
403     complain and several thread debug functions will fail.  In case
404     this is needed, I have implemented what I think it should do,
405     however this code is untested.  */
406
407  if (debug_aix_thread)
408    fprintf_unfiltered (gdb_stdlog, "pdc_write_regs tid=%d flags=%s\n",
409                        (int) tid, hex_string (flags));
410
411  /* General-purpose registers.  */
412  if (flags & PTHDB_FLAG_GPRS)
413    {
414      if (arch64)
415	ptrace64aix (PTT_WRITE_GPRS, tid,
416		     (unsigned long) context->gpr, 0, NULL);
417      else
418	ptrace32 (PTT_WRITE_GPRS, tid, (int *) context->gpr, 0, NULL);
419    }
420
421 /* Floating-point registers.  */
422  if (flags & PTHDB_FLAG_FPRS)
423    {
424      ptrace32 (PTT_WRITE_FPRS, tid, (int *) context->fpr, 0, NULL);
425    }
426
427  /* Special-purpose registers.  */
428  if (flags & PTHDB_FLAG_SPRS)
429    {
430      if (arch64)
431	{
432	  ptrace64aix (PTT_WRITE_SPRS, tid,
433		       (unsigned long) &context->msr, 0, NULL);
434	}
435      else
436	{
437	  ptrace32 (PTT_WRITE_SPRS, tid, (int *) &context->msr, 0, NULL);
438	}
439    }
440  return 0;
441}
442
443/* pthdb callback: read LEN bytes from process ADDR into BUF.  */
444
445static int
446pdc_read_data (pthdb_user_t user, void *buf,
447	       pthdb_addr_t addr, size_t len)
448{
449  int status, ret;
450
451  if (debug_aix_thread)
452    fprintf_unfiltered (gdb_stdlog,
453      "pdc_read_data (user = %ld, buf = 0x%lx, addr = %s, len = %ld)\n",
454      user, (long) buf, hex_string (addr), len);
455
456  status = target_read_memory (addr, buf, len);
457  ret = status == 0 ? PDC_SUCCESS : PDC_FAILURE;
458
459  if (debug_aix_thread)
460    fprintf_unfiltered (gdb_stdlog, "  status=%d, returning %s\n",
461			status, pd_status2str (ret));
462  return ret;
463}
464
465/* pthdb callback: write LEN bytes from BUF to process ADDR.  */
466
467static int
468pdc_write_data (pthdb_user_t user, void *buf,
469		pthdb_addr_t addr, size_t len)
470{
471  int status, ret;
472
473  if (debug_aix_thread)
474    fprintf_unfiltered (gdb_stdlog,
475      "pdc_write_data (user = %ld, buf = 0x%lx, addr = %s, len = %ld)\n",
476      user, (long) buf, hex_string (addr), len);
477
478  status = target_write_memory (addr, buf, len);
479  ret = status == 0 ? PDC_SUCCESS : PDC_FAILURE;
480
481  if (debug_aix_thread)
482    fprintf_unfiltered (gdb_stdlog, "  status=%d, returning %s\n", status,
483			pd_status2str (ret));
484  return ret;
485}
486
487/* pthdb callback: allocate a LEN-byte buffer and store a pointer to it
488   in BUFP.  */
489
490static int
491pdc_alloc (pthdb_user_t user, size_t len, void **bufp)
492{
493  if (debug_aix_thread)
494    fprintf_unfiltered (gdb_stdlog,
495                        "pdc_alloc (user = %ld, len = %ld, bufp = 0x%lx)\n",
496			user, len, (long) bufp);
497  *bufp = xmalloc (len);
498  if (debug_aix_thread)
499    fprintf_unfiltered (gdb_stdlog,
500			"  malloc returned 0x%lx\n", (long) *bufp);
501
502  /* Note: xmalloc() can't return 0; therefore PDC_FAILURE will never
503     be returned.  */
504
505  return *bufp ? PDC_SUCCESS : PDC_FAILURE;
506}
507
508/* pthdb callback: reallocate BUF, which was allocated by the alloc or
509   realloc callback, so that it contains LEN bytes, and store a
510   pointer to the result in BUFP.  */
511
512static int
513pdc_realloc (pthdb_user_t user, void *buf, size_t len, void **bufp)
514{
515  if (debug_aix_thread)
516    fprintf_unfiltered (gdb_stdlog,
517      "pdc_realloc (user = %ld, buf = 0x%lx, len = %ld, bufp = 0x%lx)\n",
518      user, (long) buf, len, (long) bufp);
519  *bufp = xrealloc (buf, len);
520  if (debug_aix_thread)
521    fprintf_unfiltered (gdb_stdlog,
522			"  realloc returned 0x%lx\n", (long) *bufp);
523  return *bufp ? PDC_SUCCESS : PDC_FAILURE;
524}
525
526/* pthdb callback: free BUF, which was allocated by the alloc or
527   realloc callback.  */
528
529static int
530pdc_dealloc (pthdb_user_t user, void *buf)
531{
532  if (debug_aix_thread)
533    fprintf_unfiltered (gdb_stdlog,
534			"pdc_free (user = %ld, buf = 0x%lx)\n", user,
535                        (long) buf);
536  xfree (buf);
537  return PDC_SUCCESS;
538}
539
540/* Return a printable representation of pthread STATE.  */
541
542static char *
543state2str (pthdb_state_t state)
544{
545  switch (state)
546    {
547    case PST_IDLE:
548      /* i18n: Like "Thread-Id %d, [state] idle" */
549      return _("idle");      /* being created */
550    case PST_RUN:
551      /* i18n: Like "Thread-Id %d, [state] running" */
552      return _("running");   /* running */
553    case PST_SLEEP:
554      /* i18n: Like "Thread-Id %d, [state] sleeping" */
555      return _("sleeping");  /* awaiting an event */
556    case PST_READY:
557      /* i18n: Like "Thread-Id %d, [state] ready" */
558      return _("ready");     /* runnable */
559    case PST_TERM:
560      /* i18n: Like "Thread-Id %d, [state] finished" */
561      return _("finished");  /* awaiting a join/detach */
562    default:
563      /* i18n: Like "Thread-Id %d, [state] unknown" */
564      return _("unknown");
565    }
566}
567
568/* qsort() comparison function for sorting pd_thread structs by pthid.  */
569
570static int
571pcmp (const void *p1v, const void *p2v)
572{
573  struct pd_thread *p1 = (struct pd_thread *) p1v;
574  struct pd_thread *p2 = (struct pd_thread *) p2v;
575  return p1->pthid < p2->pthid ? -1 : p1->pthid > p2->pthid;
576}
577
578/* iterate_over_threads() callback for counting GDB threads.  */
579
580static int
581giter_count (struct thread_info *thread, void *countp)
582{
583  (*(int *) countp)++;
584  return 0;
585}
586
587/* iterate_over_threads() callback for accumulating GDB thread pids.  */
588
589static int
590giter_accum (struct thread_info *thread, void *bufp)
591{
592  **(struct thread_info ***) bufp = thread;
593  (*(struct thread_info ***) bufp)++;
594  return 0;
595}
596
597/* ptid comparison function */
598
599static int
600ptid_cmp (ptid_t ptid1, ptid_t ptid2)
601{
602  int pid1, pid2;
603
604  if (ptid_get_pid (ptid1) < ptid_get_pid (ptid2))
605    return -1;
606  else if (ptid_get_pid (ptid1) > ptid_get_pid (ptid2))
607    return 1;
608  else if (ptid_get_tid (ptid1) < ptid_get_tid (ptid2))
609    return -1;
610  else if (ptid_get_tid (ptid1) > ptid_get_tid (ptid2))
611    return 1;
612  else if (ptid_get_lwp (ptid1) < ptid_get_lwp (ptid2))
613    return -1;
614  else if (ptid_get_lwp (ptid1) > ptid_get_lwp (ptid2))
615    return 1;
616  else
617    return 0;
618}
619
620/* qsort() comparison function for sorting thread_info structs by pid.  */
621
622static int
623gcmp (const void *t1v, const void *t2v)
624{
625  struct thread_info *t1 = *(struct thread_info **) t1v;
626  struct thread_info *t2 = *(struct thread_info **) t2v;
627  return ptid_cmp (t1->ptid, t2->ptid);
628}
629
630/* Search through the list of all kernel threads for the thread
631   that has stopped on a SIGTRAP signal, and return its TID.
632   Return 0 if none found.  */
633
634static pthdb_tid_t
635get_signaled_thread (void)
636{
637  struct thrdsinfo64 thrinf;
638  pthdb_tid_t ktid = 0;
639  int result = 0;
640
641  /* getthrds(3) isn't prototyped in any AIX 4.3.3 #include file.  */
642  extern int getthrds (pid_t, struct thrdsinfo64 *,
643		       int, pthdb_tid_t *, int);
644
645  while (1)
646  {
647    if (getthrds (PIDGET (inferior_ptid), &thrinf,
648          	  sizeof (thrinf), &ktid, 1) != 1)
649      break;
650
651    if (thrinf.ti_cursig == SIGTRAP)
652      return thrinf.ti_tid;
653  }
654
655  /* Didn't find any thread stopped on a SIGTRAP signal.  */
656  return 0;
657}
658
659/* Synchronize GDB's thread list with libpthdebug's.
660
661   There are some benefits of doing this every time the inferior stops:
662
663     - allows users to run thread-specific commands without needing to
664       run "info threads" first
665
666     - helps pthdb_tid_pthread() work properly (see "libpthdebug
667       peculiarities" at the top of this module)
668
669     - simplifies the demands placed on libpthdebug, which seems to
670       have difficulty with certain call patterns */
671
672static void
673sync_threadlists (void)
674{
675  int cmd, status, infpid;
676  int pcount, psize, pi, gcount, gi;
677  struct pd_thread *pbuf;
678  struct thread_info **gbuf, **g, *thread;
679  pthdb_pthread_t pdtid;
680  pthread_t pthid;
681  pthdb_tid_t tid;
682
683  /* Accumulate an array of libpthdebug threads sorted by pthread id.  */
684
685  pcount = 0;
686  psize = 1;
687  pbuf = (struct pd_thread *) xmalloc (psize * sizeof *pbuf);
688
689  for (cmd = PTHDB_LIST_FIRST;; cmd = PTHDB_LIST_NEXT)
690    {
691      status = pthdb_pthread (pd_session, &pdtid, cmd);
692      if (status != PTHDB_SUCCESS || pdtid == PTHDB_INVALID_PTHREAD)
693	break;
694
695      status = pthdb_pthread_ptid (pd_session, pdtid, &pthid);
696      if (status != PTHDB_SUCCESS || pthid == PTHDB_INVALID_PTID)
697	continue;
698
699      if (pcount == psize)
700	{
701	  psize *= 2;
702	  pbuf = (struct pd_thread *) xrealloc (pbuf,
703						psize * sizeof *pbuf);
704	}
705      pbuf[pcount].pdtid = pdtid;
706      pbuf[pcount].pthid = pthid;
707      pcount++;
708    }
709
710  for (pi = 0; pi < pcount; pi++)
711    {
712      status = pthdb_pthread_tid (pd_session, pbuf[pi].pdtid, &tid);
713      if (status != PTHDB_SUCCESS)
714	tid = PTHDB_INVALID_TID;
715      pbuf[pi].tid = tid;
716    }
717
718  qsort (pbuf, pcount, sizeof *pbuf, pcmp);
719
720  /* Accumulate an array of GDB threads sorted by pid.  */
721
722  gcount = 0;
723  iterate_over_threads (giter_count, &gcount);
724  g = gbuf = (struct thread_info **) xmalloc (gcount * sizeof *gbuf);
725  iterate_over_threads (giter_accum, &g);
726  qsort (gbuf, gcount, sizeof *gbuf, gcmp);
727
728  /* Apply differences between the two arrays to GDB's thread list.  */
729
730  infpid = PIDGET (inferior_ptid);
731  for (pi = gi = 0; pi < pcount || gi < gcount;)
732    {
733      if (pi == pcount)
734	{
735	  delete_thread (gbuf[gi]->ptid);
736	  gi++;
737	}
738      else if (gi == gcount)
739	{
740	  thread = add_thread (BUILD_THREAD (pbuf[pi].pthid, infpid));
741	  thread->private = xmalloc (sizeof (struct private_thread_info));
742	  thread->private->pdtid = pbuf[pi].pdtid;
743	  thread->private->tid = pbuf[pi].tid;
744	  pi++;
745	}
746      else
747	{
748	  ptid_t pptid, gptid;
749	  int cmp_result;
750
751	  pptid = BUILD_THREAD (pbuf[pi].pthid, infpid);
752	  gptid = gbuf[gi]->ptid;
753	  pdtid = pbuf[pi].pdtid;
754	  tid = pbuf[pi].tid;
755
756	  cmp_result = ptid_cmp (pptid, gptid);
757
758	  if (cmp_result == 0)
759	    {
760	      gbuf[gi]->private->pdtid = pdtid;
761	      gbuf[gi]->private->tid = tid;
762	      pi++;
763	      gi++;
764	    }
765	  else if (cmp_result > 0)
766	    {
767	      delete_thread (gptid);
768	      gi++;
769	    }
770	  else
771	    {
772	      thread = add_thread (pptid);
773	      thread->private = xmalloc (sizeof (struct private_thread_info));
774	      thread->private->pdtid = pdtid;
775	      thread->private->tid = tid;
776	      pi++;
777	    }
778	}
779    }
780
781  xfree (pbuf);
782  xfree (gbuf);
783}
784
785/* Iterate_over_threads() callback for locating a thread, using
786   the TID of its associated kernel thread.  */
787
788static int
789iter_tid (struct thread_info *thread, void *tidp)
790{
791  const pthdb_tid_t tid = *(pthdb_tid_t *)tidp;
792
793  return (thread->private->tid == tid);
794}
795
796/* Synchronize libpthdebug's state with the inferior and with GDB,
797   generate a composite process/thread <pid> for the current thread,
798   set inferior_ptid to <pid> if SET_INFPID, and return <pid>.  */
799
800static ptid_t
801pd_update (int set_infpid)
802{
803  int status;
804  ptid_t ptid;
805  pthdb_tid_t tid;
806  struct thread_info *thread = NULL;
807
808  if (!pd_active)
809    return inferior_ptid;
810
811  status = pthdb_session_update (pd_session);
812  if (status != PTHDB_SUCCESS)
813    return inferior_ptid;
814
815  sync_threadlists ();
816
817  /* Define "current thread" as one that just received a trap signal.  */
818
819  tid = get_signaled_thread ();
820  if (tid != 0)
821    thread = iterate_over_threads (iter_tid, &tid);
822  if (!thread)
823    ptid = inferior_ptid;
824  else
825    {
826      ptid = thread->ptid;
827      if (set_infpid)
828	inferior_ptid = ptid;
829    }
830  return ptid;
831}
832
833/* Try to start debugging threads in the current process.
834   If successful and SET_INFPID, set inferior_ptid to reflect the
835   current thread.  */
836
837static ptid_t
838pd_activate (int set_infpid)
839{
840  int status;
841
842  status = pthdb_session_init (PD_USER, arch64 ? PEM_64BIT : PEM_32BIT,
843			       PTHDB_FLAG_REGS, &pd_callbacks,
844			       &pd_session);
845  if (status != PTHDB_SUCCESS)
846    {
847      return inferior_ptid;
848    }
849  pd_active = 1;
850  return pd_update (set_infpid);
851}
852
853/* Undo the effects of pd_activate().  */
854
855static void
856pd_deactivate (void)
857{
858  if (!pd_active)
859    return;
860  pthdb_session_destroy (pd_session);
861
862  pid_to_prc (&inferior_ptid);
863  pd_active = 0;
864}
865
866/* An object file has just been loaded.  Check whether the current
867   application is pthreaded, and if so, prepare for thread debugging.  */
868
869static void
870pd_enable (void)
871{
872  int status;
873  char *stub_name;
874  struct minimal_symbol *ms;
875
876  /* Don't initialize twice.  */
877  if (pd_able)
878    return;
879
880  /* Check application word size.  */
881  arch64 = register_size (current_gdbarch, 0) == 8;
882
883  /* Check whether the application is pthreaded.  */
884  stub_name = NULL;
885  status = pthdb_session_pthreaded (PD_USER, PTHDB_FLAG_REGS,
886				    &pd_callbacks, &stub_name);
887  if ((status != PTHDB_SUCCESS &&
888       status != PTHDB_NOT_PTHREADED) || !stub_name)
889    return;
890
891  /* Set a breakpoint on the returned stub function.  */
892  if (!(ms = lookup_minimal_symbol (stub_name, NULL, NULL)))
893    return;
894  pd_brk_addr = SYMBOL_VALUE_ADDRESS (ms);
895  if (!create_thread_event_breakpoint (pd_brk_addr))
896    return;
897
898  /* Prepare for thread debugging.  */
899  base_target = current_target;
900  push_target (&aix_thread_ops);
901  pd_able = 1;
902
903  /* If we're debugging a core file or an attached inferior, the
904     pthread library may already have been initialized, so try to
905     activate thread debugging.  */
906  pd_activate (1);
907}
908
909/* Undo the effects of pd_enable().  */
910
911static void
912pd_disable (void)
913{
914  if (!pd_able)
915    return;
916  if (pd_active)
917    pd_deactivate ();
918  pd_able = 0;
919  unpush_target (&aix_thread_ops);
920}
921
922/* new_objfile observer callback.
923
924   If OBJFILE is non-null, check whether a threaded application is
925   being debugged, and if so, prepare for thread debugging.
926
927   If OBJFILE is null, stop debugging threads.  */
928
929static void
930new_objfile (struct objfile *objfile)
931{
932  if (objfile)
933    pd_enable ();
934  else
935    pd_disable ();
936}
937
938/* Attach to process specified by ARGS.  */
939
940static void
941aix_thread_attach (char *args, int from_tty)
942{
943  base_target.to_attach (args, from_tty);
944  pd_activate (1);
945}
946
947/* Detach from the process attached to by aix_thread_attach().  */
948
949static void
950aix_thread_detach (char *args, int from_tty)
951{
952  pd_disable ();
953  base_target.to_detach (args, from_tty);
954}
955
956/* Tell the inferior process to continue running thread PID if != -1
957   and all threads otherwise.  */
958
959static void
960aix_thread_resume (ptid_t ptid, int step, enum target_signal sig)
961{
962  struct thread_info *thread;
963  pthdb_tid_t tid[2];
964
965  if (!PD_TID (ptid))
966    {
967      struct cleanup *cleanup = save_inferior_ptid ();
968      inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
969      base_target.to_resume (ptid, step, sig);
970      do_cleanups (cleanup);
971    }
972  else
973    {
974      thread = find_thread_pid (ptid);
975      if (!thread)
976	error (_("aix-thread resume: unknown pthread %ld"),
977	       TIDGET (ptid));
978
979      tid[0] = thread->private->tid;
980      if (tid[0] == PTHDB_INVALID_TID)
981	error (_("aix-thread resume: no tid for pthread %ld"),
982	       TIDGET (ptid));
983      tid[1] = 0;
984
985      if (arch64)
986	ptrace64aix (PTT_CONTINUE, tid[0], 1,
987		     target_signal_to_host (sig), (int *) tid);
988      else
989	ptrace32 (PTT_CONTINUE, tid[0], (int *) 1,
990		  target_signal_to_host (sig), (int *) tid);
991    }
992}
993
994/* Wait for thread/process ID if != -1 or for any thread otherwise.
995   If an error occurs, return -1, else return the pid of the stopped
996   thread.  */
997
998static ptid_t
999aix_thread_wait (ptid_t ptid, struct target_waitstatus *status)
1000{
1001  struct cleanup *cleanup = save_inferior_ptid ();
1002
1003  pid_to_prc (&ptid);
1004
1005  inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
1006  ptid = base_target.to_wait (ptid, status);
1007  do_cleanups (cleanup);
1008
1009  if (PIDGET (ptid) == -1)
1010    return pid_to_ptid (-1);
1011
1012  /* Check whether libpthdebug might be ready to be initialized.  */
1013  if (!pd_active && status->kind == TARGET_WAITKIND_STOPPED &&
1014      status->value.sig == TARGET_SIGNAL_TRAP
1015      && read_pc_pid (ptid)
1016	 - gdbarch_decr_pc_after_break (current_gdbarch) == pd_brk_addr)
1017    return pd_activate (0);
1018
1019  return pd_update (0);
1020}
1021
1022/* Record that the 64-bit general-purpose registers contain VALS.  */
1023
1024static void
1025supply_gprs64 (struct regcache *regcache, uint64_t *vals)
1026{
1027  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1028  int regno;
1029
1030  for (regno = 0; regno < ppc_num_gprs; regno++)
1031    regcache_raw_supply (regcache, tdep->ppc_gp0_regnum + regno,
1032			 (char *) (vals + regno));
1033}
1034
1035/* Record that 32-bit register REGNO contains VAL.  */
1036
1037static void
1038supply_reg32 (struct regcache *regcache, int regno, uint32_t val)
1039{
1040  regcache_raw_supply (regcache, regno, (char *) &val);
1041}
1042
1043/* Record that the floating-point registers contain VALS.  */
1044
1045static void
1046supply_fprs (struct regcache *regcache, double *vals)
1047{
1048  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1049  int regno;
1050
1051  /* This function should never be called on architectures without
1052     floating-point registers.  */
1053  gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
1054
1055  for (regno = 0; regno < ppc_num_fprs; regno++)
1056    regcache_raw_supply (regcache, regno + tdep->ppc_fp0_regnum,
1057			 (char *) (vals + regno));
1058}
1059
1060/* Predicate to test whether given register number is a "special" register.  */
1061static int
1062special_register_p (int regno)
1063{
1064  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1065
1066  return regno == gdbarch_pc_regnum (current_gdbarch)
1067      || regno == tdep->ppc_ps_regnum
1068      || regno == tdep->ppc_cr_regnum
1069      || regno == tdep->ppc_lr_regnum
1070      || regno == tdep->ppc_ctr_regnum
1071      || regno == tdep->ppc_xer_regnum
1072      || (tdep->ppc_fpscr_regnum >= 0 && regno == tdep->ppc_fpscr_regnum)
1073      || (tdep->ppc_mq_regnum >= 0 && regno == tdep->ppc_mq_regnum);
1074}
1075
1076
1077/* Record that the special registers contain the specified 64-bit and
1078   32-bit values.  */
1079
1080static void
1081supply_sprs64 (struct regcache *regcache,
1082	       uint64_t iar, uint64_t msr, uint32_t cr,
1083	       uint64_t lr, uint64_t ctr, uint32_t xer,
1084	       uint32_t fpscr)
1085{
1086  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1087
1088  regcache_raw_supply (regcache, gdbarch_pc_regnum (current_gdbarch),
1089		       (char *) &iar);
1090  regcache_raw_supply (regcache, tdep->ppc_ps_regnum, (char *) &msr);
1091  regcache_raw_supply (regcache, tdep->ppc_cr_regnum, (char *) &cr);
1092  regcache_raw_supply (regcache, tdep->ppc_lr_regnum, (char *) &lr);
1093  regcache_raw_supply (regcache, tdep->ppc_ctr_regnum, (char *) &ctr);
1094  regcache_raw_supply (regcache, tdep->ppc_xer_regnum, (char *) &xer);
1095  if (tdep->ppc_fpscr_regnum >= 0)
1096    regcache_raw_supply (regcache, tdep->ppc_fpscr_regnum,
1097			 (char *) &fpscr);
1098}
1099
1100/* Record that the special registers contain the specified 32-bit
1101   values.  */
1102
1103static void
1104supply_sprs32 (struct regcache *regcache,
1105	       uint32_t iar, uint32_t msr, uint32_t cr,
1106	       uint32_t lr, uint32_t ctr, uint32_t xer,
1107	       uint32_t fpscr)
1108{
1109  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1110
1111  regcache_raw_supply (regcache, gdbarch_pc_regnum (current_gdbarch),
1112		       (char *) &iar);
1113  regcache_raw_supply (regcache, tdep->ppc_ps_regnum, (char *) &msr);
1114  regcache_raw_supply (regcache, tdep->ppc_cr_regnum, (char *) &cr);
1115  regcache_raw_supply (regcache, tdep->ppc_lr_regnum, (char *) &lr);
1116  regcache_raw_supply (regcache, tdep->ppc_ctr_regnum, (char *) &ctr);
1117  regcache_raw_supply (regcache, tdep->ppc_xer_regnum, (char *) &xer);
1118  if (tdep->ppc_fpscr_regnum >= 0)
1119    regcache_raw_supply (regcache, tdep->ppc_fpscr_regnum,
1120			 (char *) &fpscr);
1121}
1122
1123/* Fetch all registers from pthread PDTID, which doesn't have a kernel
1124   thread.
1125
1126   There's no way to query a single register from a non-kernel
1127   pthread, so there's no need for a single-register version of this
1128   function.  */
1129
1130static void
1131fetch_regs_user_thread (struct regcache *regcache, pthdb_pthread_t pdtid)
1132{
1133  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1134  int status, i;
1135  pthdb_context_t ctx;
1136
1137  if (debug_aix_thread)
1138    fprintf_unfiltered (gdb_stdlog,
1139			"fetch_regs_user_thread %lx\n", (long) pdtid);
1140  status = pthdb_pthread_context (pd_session, pdtid, &ctx);
1141  if (status != PTHDB_SUCCESS)
1142    error (_("aix-thread: fetch_registers: pthdb_pthread_context returned %s"),
1143           pd_status2str (status));
1144
1145  /* General-purpose registers.  */
1146
1147  if (arch64)
1148    supply_gprs64 (regcache, ctx.gpr);
1149  else
1150    for (i = 0; i < ppc_num_gprs; i++)
1151      supply_reg32 (regcache, tdep->ppc_gp0_regnum + i, ctx.gpr[i]);
1152
1153  /* Floating-point registers.  */
1154
1155  if (ppc_floating_point_unit_p (current_gdbarch))
1156    supply_fprs (regcache, ctx.fpr);
1157
1158  /* Special registers.  */
1159
1160  if (arch64)
1161    supply_sprs64 (regcache, ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr,
1162			     ctx.xer, ctx.fpscr);
1163  else
1164    supply_sprs32 (regcache, ctx.iar, ctx.msr, ctx.cr, ctx.lr, ctx.ctr,
1165			     ctx.xer, ctx.fpscr);
1166}
1167
1168/* Fetch register REGNO if != -1 or all registers otherwise from
1169   kernel thread TID.
1170
1171   AIX provides a way to query all of a kernel thread's GPRs, FPRs, or
1172   SPRs, but there's no way to query individual registers within those
1173   groups.  Therefore, if REGNO != -1, this function fetches an entire
1174   group.
1175
1176   Unfortunately, kernel thread register queries often fail with
1177   EPERM, indicating that the thread is in kernel space.  This breaks
1178   backtraces of threads other than the current one.  To make that
1179   breakage obvious without throwing an error to top level (which is
1180   bad e.g. during "info threads" output), zero registers that can't
1181   be retrieved.  */
1182
1183static void
1184fetch_regs_kernel_thread (struct regcache *regcache, int regno,
1185			  pthdb_tid_t tid)
1186{
1187  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1188  uint64_t gprs64[ppc_num_gprs];
1189  uint32_t gprs32[ppc_num_gprs];
1190  double fprs[ppc_num_fprs];
1191  struct ptxsprs sprs64;
1192  struct ptsprs sprs32;
1193  int i;
1194
1195  if (debug_aix_thread)
1196    fprintf_unfiltered (gdb_stdlog,
1197	"fetch_regs_kernel_thread tid=%lx regno=%d arch64=%d\n",
1198	(long) tid, regno, arch64);
1199
1200  /* General-purpose registers.  */
1201  if (regno == -1
1202      || (tdep->ppc_gp0_regnum <= regno
1203          && regno < tdep->ppc_gp0_regnum + ppc_num_gprs))
1204    {
1205      if (arch64)
1206	{
1207	  if (!ptrace64aix (PTT_READ_GPRS, tid,
1208			    (unsigned long) gprs64, 0, NULL))
1209	    memset (gprs64, 0, sizeof (gprs64));
1210	  supply_gprs64 (regcache, gprs64);
1211	}
1212      else
1213	{
1214	  if (!ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL))
1215	    memset (gprs32, 0, sizeof (gprs32));
1216	  for (i = 0; i < ppc_num_gprs; i++)
1217	    supply_reg32 (regcache, tdep->ppc_gp0_regnum + i, gprs32[i]);
1218	}
1219    }
1220
1221  /* Floating-point registers.  */
1222
1223  if (ppc_floating_point_unit_p (current_gdbarch)
1224      && (regno == -1
1225          || (regno >= tdep->ppc_fp0_regnum
1226              && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)))
1227    {
1228      if (!ptrace32 (PTT_READ_FPRS, tid, (int *) fprs, 0, NULL))
1229	memset (fprs, 0, sizeof (fprs));
1230      supply_fprs (regcache, fprs);
1231    }
1232
1233  /* Special-purpose registers.  */
1234
1235  if (regno == -1 || special_register_p (regno))
1236    {
1237      if (arch64)
1238	{
1239	  if (!ptrace64aix (PTT_READ_SPRS, tid,
1240			    (unsigned long) &sprs64, 0, NULL))
1241	    memset (&sprs64, 0, sizeof (sprs64));
1242	  supply_sprs64 (regcache, sprs64.pt_iar, sprs64.pt_msr,
1243			 sprs64.pt_cr, sprs64.pt_lr, sprs64.pt_ctr,
1244			 sprs64.pt_xer, sprs64.pt_fpscr);
1245	}
1246      else
1247	{
1248	  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1249
1250	  if (!ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL))
1251	    memset (&sprs32, 0, sizeof (sprs32));
1252	  supply_sprs32 (regcache, sprs32.pt_iar, sprs32.pt_msr, sprs32.pt_cr,
1253			 sprs32.pt_lr, sprs32.pt_ctr, sprs32.pt_xer,
1254			 sprs32.pt_fpscr);
1255
1256	  if (tdep->ppc_mq_regnum >= 0)
1257	    regcache_raw_supply (regcache, tdep->ppc_mq_regnum,
1258				 (char *) &sprs32.pt_mq);
1259	}
1260    }
1261}
1262
1263/* Fetch register REGNO if != -1 or all registers otherwise in the
1264   thread/process specified by inferior_ptid.  */
1265
1266static void
1267aix_thread_fetch_registers (struct regcache *regcache, int regno)
1268{
1269  struct thread_info *thread;
1270  pthdb_tid_t tid;
1271
1272  if (!PD_TID (inferior_ptid))
1273    base_target.to_fetch_registers (regcache, regno);
1274  else
1275    {
1276      thread = find_thread_pid (inferior_ptid);
1277      tid = thread->private->tid;
1278
1279      if (tid == PTHDB_INVALID_TID)
1280	fetch_regs_user_thread (regcache, thread->private->pdtid);
1281      else
1282	fetch_regs_kernel_thread (regcache, regno, tid);
1283    }
1284}
1285
1286/* Store the gp registers into an array of uint32_t or uint64_t.  */
1287
1288static void
1289fill_gprs64 (const struct regcache *regcache, uint64_t *vals)
1290{
1291  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1292  int regno;
1293
1294  for (regno = 0; regno < ppc_num_gprs; regno++)
1295    if (regcache_valid_p (regcache, tdep->ppc_gp0_regnum + regno))
1296      regcache_raw_collect (regcache, tdep->ppc_gp0_regnum + regno,
1297			    vals + regno);
1298}
1299
1300static void
1301fill_gprs32 (const struct regcache *regcache, uint32_t *vals)
1302{
1303  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1304  int regno;
1305
1306  for (regno = 0; regno < ppc_num_gprs; regno++)
1307    if (regcache_valid_p (regcache, tdep->ppc_gp0_regnum + regno))
1308      regcache_raw_collect (regcache, tdep->ppc_gp0_regnum + regno,
1309			    vals + regno);
1310}
1311
1312/* Store the floating point registers into a double array.  */
1313static void
1314fill_fprs (const struct regcache *regcache, double *vals)
1315{
1316  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1317  int regno;
1318
1319  /* This function should never be called on architectures without
1320     floating-point registers.  */
1321  gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
1322
1323  for (regno = tdep->ppc_fp0_regnum;
1324       regno < tdep->ppc_fp0_regnum + ppc_num_fprs;
1325       regno++)
1326    if (regcache_valid_p (regcache, regno))
1327      regcache_raw_collect (regcache, regno, vals + regno);
1328}
1329
1330/* Store the special registers into the specified 64-bit and 32-bit
1331   locations.  */
1332
1333static void
1334fill_sprs64 (const struct regcache *regcache,
1335	     uint64_t *iar, uint64_t *msr, uint32_t *cr,
1336	     uint64_t *lr, uint64_t *ctr, uint32_t *xer,
1337	     uint32_t *fpscr)
1338{
1339  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1340
1341  /* Verify that the size of the size of the IAR buffer is the
1342     same as the raw size of the PC (in the register cache).  If
1343     they're not, then either GDB has been built incorrectly, or
1344     there's some other kind of internal error.  To be really safe,
1345     we should check all of the sizes.   */
1346  gdb_assert (sizeof (*iar) == register_size
1347				 (current_gdbarch,
1348				  gdbarch_pc_regnum (current_gdbarch)));
1349
1350  if (regcache_valid_p (regcache, gdbarch_pc_regnum (current_gdbarch)))
1351    regcache_raw_collect (regcache, gdbarch_pc_regnum (current_gdbarch), iar);
1352  if (regcache_valid_p (regcache, tdep->ppc_ps_regnum))
1353    regcache_raw_collect (regcache, tdep->ppc_ps_regnum, msr);
1354  if (regcache_valid_p (regcache, tdep->ppc_cr_regnum))
1355    regcache_raw_collect (regcache, tdep->ppc_cr_regnum, cr);
1356  if (regcache_valid_p (regcache, tdep->ppc_lr_regnum))
1357    regcache_raw_collect (regcache, tdep->ppc_lr_regnum, lr);
1358  if (regcache_valid_p (regcache, tdep->ppc_ctr_regnum))
1359    regcache_raw_collect (regcache, tdep->ppc_ctr_regnum, ctr);
1360  if (regcache_valid_p (regcache, tdep->ppc_xer_regnum))
1361    regcache_raw_collect (regcache, tdep->ppc_xer_regnum, xer);
1362  if (tdep->ppc_fpscr_regnum >= 0
1363      && regcache_valid_p (regcache, tdep->ppc_fpscr_regnum))
1364    regcache_raw_collect (regcache, tdep->ppc_fpscr_regnum, fpscr);
1365}
1366
1367static void
1368fill_sprs32 (const struct regcache *regcache,
1369	     uint32_t *iar, uint32_t *msr, uint32_t *cr,
1370	     uint32_t *lr, uint32_t *ctr, uint32_t *xer,
1371	     uint32_t *fpscr)
1372{
1373  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1374
1375  /* Verify that the size of the size of the IAR buffer is the
1376     same as the raw size of the PC (in the register cache).  If
1377     they're not, then either GDB has been built incorrectly, or
1378     there's some other kind of internal error.  To be really safe,
1379     we should check all of the sizes.  */
1380  gdb_assert (sizeof (*iar) == register_size (current_gdbarch,
1381					      gdbarch_pc_regnum
1382					      (current_gdbarch)));
1383
1384  if (regcache_valid_p (regcache, gdbarch_pc_regnum (current_gdbarch)))
1385    regcache_raw_collect (regcache, gdbarch_pc_regnum (current_gdbarch), iar);
1386  if (regcache_valid_p (regcache, tdep->ppc_ps_regnum))
1387    regcache_raw_collect (regcache, tdep->ppc_ps_regnum, msr);
1388  if (regcache_valid_p (regcache, tdep->ppc_cr_regnum))
1389    regcache_raw_collect (regcache, tdep->ppc_cr_regnum, cr);
1390  if (regcache_valid_p (regcache, tdep->ppc_lr_regnum))
1391    regcache_raw_collect (regcache, tdep->ppc_lr_regnum, lr);
1392  if (regcache_valid_p (regcache, tdep->ppc_ctr_regnum))
1393    regcache_raw_collect (regcache, tdep->ppc_ctr_regnum, ctr);
1394  if (regcache_valid_p (regcache, tdep->ppc_xer_regnum))
1395    regcache_raw_collect (regcache, tdep->ppc_xer_regnum, xer);
1396  if (tdep->ppc_fpscr_regnum >= 0
1397      && regcache_valid_p (regcache, tdep->ppc_fpscr_regnum))
1398    regcache_raw_collect (regcache, tdep->ppc_fpscr_regnum, fpscr);
1399}
1400
1401/* Store all registers into pthread PDTID, which doesn't have a kernel
1402   thread.
1403
1404   It's possible to store a single register into a non-kernel pthread,
1405   but I doubt it's worth the effort.  */
1406
1407static void
1408store_regs_user_thread (const struct regcache *regcache, pthdb_pthread_t pdtid)
1409{
1410  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1411  int status, i;
1412  pthdb_context_t ctx;
1413  uint32_t int32;
1414  uint64_t int64;
1415  double   dbl;
1416
1417  if (debug_aix_thread)
1418    fprintf_unfiltered (gdb_stdlog,
1419			"store_regs_user_thread %lx\n", (long) pdtid);
1420
1421  /* Retrieve the thread's current context for its non-register
1422     values.  */
1423  status = pthdb_pthread_context (pd_session, pdtid, &ctx);
1424  if (status != PTHDB_SUCCESS)
1425    error (_("aix-thread: store_registers: pthdb_pthread_context returned %s"),
1426           pd_status2str (status));
1427
1428  /* Collect general-purpose register values from the regcache.  */
1429
1430  for (i = 0; i < ppc_num_gprs; i++)
1431    if (regcache_valid_p (regcache, tdep->ppc_gp0_regnum + i))
1432      {
1433	if (arch64)
1434	  {
1435	    regcache_raw_collect (regcache, tdep->ppc_gp0_regnum + i,
1436				  (void *) &int64);
1437	    ctx.gpr[i] = int64;
1438	  }
1439	else
1440	  {
1441	    regcache_raw_collect (regcache, tdep->ppc_gp0_regnum + i,
1442				  (void *) &int32);
1443	    ctx.gpr[i] = int32;
1444	  }
1445      }
1446
1447  /* Collect floating-point register values from the regcache.  */
1448  if (ppc_floating_point_unit_p (current_gdbarch))
1449    fill_fprs (regcache, ctx.fpr);
1450
1451  /* Special registers (always kept in ctx as 64 bits).  */
1452  if (arch64)
1453    {
1454      fill_sprs64 (regcache, &ctx.iar, &ctx.msr, &ctx.cr, &ctx.lr, &ctx.ctr,
1455			     &ctx.xer, &ctx.fpscr);
1456    }
1457  else
1458    {
1459      /* Problem: ctx.iar etc. are 64 bits, but raw_registers are 32.
1460	 Solution: use 32-bit temp variables.  */
1461      uint32_t tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
1462	       tmp_fpscr;
1463
1464      fill_sprs32 (regcache, &tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr, &tmp_ctr,
1465			     &tmp_xer, &tmp_fpscr);
1466      if (regcache_valid_p (regcache, gdbarch_pc_regnum (current_gdbarch)))
1467	ctx.iar = tmp_iar;
1468      if (regcache_valid_p (regcache, tdep->ppc_ps_regnum))
1469	ctx.msr = tmp_msr;
1470      if (regcache_valid_p (regcache, tdep->ppc_cr_regnum))
1471	ctx.cr  = tmp_cr;
1472      if (regcache_valid_p (regcache, tdep->ppc_lr_regnum))
1473	ctx.lr  = tmp_lr;
1474      if (regcache_valid_p (regcache, tdep->ppc_ctr_regnum))
1475	ctx.ctr = tmp_ctr;
1476      if (regcache_valid_p (regcache, tdep->ppc_xer_regnum))
1477	ctx.xer = tmp_xer;
1478      if (regcache_valid_p (regcache, tdep->ppc_xer_regnum))
1479	ctx.fpscr = tmp_fpscr;
1480    }
1481
1482  status = pthdb_pthread_setcontext (pd_session, pdtid, &ctx);
1483  if (status != PTHDB_SUCCESS)
1484    error (_("aix-thread: store_registers: pthdb_pthread_setcontext returned %s"),
1485           pd_status2str (status));
1486}
1487
1488/* Store register REGNO if != -1 or all registers otherwise into
1489   kernel thread TID.
1490
1491   AIX provides a way to set all of a kernel thread's GPRs, FPRs, or
1492   SPRs, but there's no way to set individual registers within those
1493   groups.  Therefore, if REGNO != -1, this function stores an entire
1494   group.  */
1495
1496static void
1497store_regs_kernel_thread (const struct regcache *regcache, int regno,
1498			  pthdb_tid_t tid)
1499{
1500  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
1501  uint64_t gprs64[ppc_num_gprs];
1502  uint32_t gprs32[ppc_num_gprs];
1503  double fprs[ppc_num_fprs];
1504  struct ptxsprs sprs64;
1505  struct ptsprs  sprs32;
1506  int i;
1507
1508  if (debug_aix_thread)
1509    fprintf_unfiltered (gdb_stdlog,
1510			"store_regs_kernel_thread tid=%lx regno=%d\n",
1511                        (long) tid, regno);
1512
1513  /* General-purpose registers.  */
1514  if (regno == -1
1515      || (tdep->ppc_gp0_regnum <= regno
1516          && regno < tdep->ppc_gp0_regnum + ppc_num_fprs))
1517    {
1518      if (arch64)
1519	{
1520	  /* Pre-fetch: some regs may not be in the cache.  */
1521	  ptrace64aix (PTT_READ_GPRS, tid, (unsigned long) gprs64, 0, NULL);
1522	  fill_gprs64 (regcache, gprs64);
1523	  ptrace64aix (PTT_WRITE_GPRS, tid, (unsigned long) gprs64, 0, NULL);
1524	}
1525      else
1526	{
1527	  /* Pre-fetch: some regs may not be in the cache.  */
1528	  ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL);
1529	  fill_gprs32 (regcache, gprs32);
1530	  ptrace32 (PTT_WRITE_GPRS, tid, gprs32, 0, NULL);
1531	}
1532    }
1533
1534  /* Floating-point registers.  */
1535
1536  if (ppc_floating_point_unit_p (current_gdbarch)
1537      && (regno == -1
1538          || (regno >= tdep->ppc_fp0_regnum
1539              && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)))
1540    {
1541      /* Pre-fetch: some regs may not be in the cache.  */
1542      ptrace32 (PTT_READ_FPRS, tid, (int *) fprs, 0, NULL);
1543      fill_fprs (regcache, fprs);
1544      ptrace32 (PTT_WRITE_FPRS, tid, (int *) fprs, 0, NULL);
1545    }
1546
1547  /* Special-purpose registers.  */
1548
1549  if (regno == -1 || special_register_p (regno))
1550    {
1551      if (arch64)
1552	{
1553	  /* Pre-fetch: some registers won't be in the cache.  */
1554	  ptrace64aix (PTT_READ_SPRS, tid,
1555		       (unsigned long) &sprs64, 0, NULL);
1556	  fill_sprs64 (regcache, &sprs64.pt_iar, &sprs64.pt_msr,
1557		       &sprs64.pt_cr, &sprs64.pt_lr, &sprs64.pt_ctr,
1558		       &sprs64.pt_xer, &sprs64.pt_fpscr);
1559	  ptrace64aix (PTT_WRITE_SPRS, tid,
1560		       (unsigned long) &sprs64, 0, NULL);
1561	}
1562      else
1563	{
1564	  /* The contents of "struct ptspr" were declared as "unsigned
1565	     long" up to AIX 5.2, but are "unsigned int" since 5.3.
1566	     Use temporaries to work around this problem.  Also, add an
1567	     assert here to make sure we fail if the system header files
1568	     use "unsigned long", and the size of that type is not what
1569	     the headers expect.  */
1570	  uint32_t tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
1571		   tmp_fpscr;
1572
1573	  gdb_assert (sizeof (sprs32.pt_iar) == 4);
1574
1575	  /* Pre-fetch: some registers won't be in the cache.  */
1576	  ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL);
1577
1578	  fill_sprs32 (regcache, &tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr,
1579		       &tmp_ctr, &tmp_xer, &tmp_fpscr);
1580
1581	  sprs32.pt_iar = tmp_iar;
1582	  sprs32.pt_msr = tmp_msr;
1583	  sprs32.pt_cr = tmp_cr;
1584	  sprs32.pt_lr = tmp_lr;
1585	  sprs32.pt_ctr = tmp_ctr;
1586	  sprs32.pt_xer = tmp_xer;
1587	  sprs32.pt_fpscr = tmp_fpscr;
1588
1589	  if (tdep->ppc_mq_regnum >= 0)
1590	    if (regcache_valid_p (regcache, tdep->ppc_mq_regnum))
1591	      regcache_raw_collect (regcache, tdep->ppc_mq_regnum,
1592				    &sprs32.pt_mq);
1593
1594	  ptrace32 (PTT_WRITE_SPRS, tid, (int *) &sprs32, 0, NULL);
1595	}
1596    }
1597}
1598
1599/* Store gdb's current view of the register set into the
1600   thread/process specified by inferior_ptid.  */
1601
1602static void
1603aix_thread_store_registers (struct regcache *regcache, int regno)
1604{
1605  struct thread_info *thread;
1606  pthdb_tid_t tid;
1607
1608  if (!PD_TID (inferior_ptid))
1609    base_target.to_store_registers (regcache, regno);
1610  else
1611    {
1612      thread = find_thread_pid (inferior_ptid);
1613      tid = thread->private->tid;
1614
1615      if (tid == PTHDB_INVALID_TID)
1616	store_regs_user_thread (regcache, thread->private->pdtid);
1617      else
1618	store_regs_kernel_thread (regcache, regno, tid);
1619    }
1620}
1621
1622/* Attempt a transfer all LEN bytes starting at OFFSET between the
1623   inferior's OBJECT:ANNEX space and GDB's READBUF/WRITEBUF buffer.
1624   Return the number of bytes actually transferred.  */
1625
1626static LONGEST
1627aix_thread_xfer_partial (struct target_ops *ops, enum target_object object,
1628			 const char *annex, gdb_byte *readbuf,
1629			 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
1630{
1631  struct cleanup *old_chain = save_inferior_ptid ();
1632  LONGEST xfer;
1633
1634  inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
1635  xfer = base_target.to_xfer_partial (ops, object, annex,
1636				      readbuf, writebuf, offset, len);
1637
1638  do_cleanups (old_chain);
1639  return xfer;
1640}
1641
1642/* Kill and forget about the inferior process.  */
1643
1644static void
1645aix_thread_kill (void)
1646{
1647  struct cleanup *cleanup = save_inferior_ptid ();
1648
1649  inferior_ptid = pid_to_ptid (PIDGET (inferior_ptid));
1650  base_target.to_kill ();
1651  do_cleanups (cleanup);
1652}
1653
1654/* Clean up after the inferior exits.  */
1655
1656static void
1657aix_thread_mourn_inferior (void)
1658{
1659  pd_deactivate ();
1660  base_target.to_mourn_inferior ();
1661}
1662
1663/* Return whether thread PID is still valid.  */
1664
1665static int
1666aix_thread_thread_alive (ptid_t ptid)
1667{
1668  if (!PD_TID (ptid))
1669    return base_target.to_thread_alive (ptid);
1670
1671  /* We update the thread list every time the child stops, so all
1672     valid threads should be in the thread list.  */
1673  return in_thread_list (ptid);
1674}
1675
1676/* Return a printable representation of composite PID for use in
1677   "info threads" output.  */
1678
1679static char *
1680aix_thread_pid_to_str (ptid_t ptid)
1681{
1682  static char *ret = NULL;
1683
1684  if (!PD_TID (ptid))
1685    return base_target.to_pid_to_str (ptid);
1686
1687  /* Free previous return value; a new one will be allocated by
1688     xstrprintf().  */
1689  xfree (ret);
1690
1691  ret = xstrprintf (_("Thread %ld"), ptid_get_tid (ptid));
1692  return ret;
1693}
1694
1695/* Return a printable representation of extra information about
1696   THREAD, for use in "info threads" output.  */
1697
1698static char *
1699aix_thread_extra_thread_info (struct thread_info *thread)
1700{
1701  struct ui_file *buf;
1702  int status;
1703  pthdb_pthread_t pdtid;
1704  pthdb_tid_t tid;
1705  pthdb_state_t state;
1706  pthdb_suspendstate_t suspendstate;
1707  pthdb_detachstate_t detachstate;
1708  int cancelpend;
1709  long length;
1710  static char *ret = NULL;
1711
1712  if (!PD_TID (thread->ptid))
1713    return NULL;
1714
1715  buf = mem_fileopen ();
1716
1717  pdtid = thread->private->pdtid;
1718  tid = thread->private->tid;
1719
1720  if (tid != PTHDB_INVALID_TID)
1721    /* i18n: Like "thread-identifier %d, [state] running, suspended" */
1722    fprintf_unfiltered (buf, _("tid %d"), (int)tid);
1723
1724  status = pthdb_pthread_state (pd_session, pdtid, &state);
1725  if (status != PTHDB_SUCCESS)
1726    state = PST_NOTSUP;
1727  fprintf_unfiltered (buf, ", %s", state2str (state));
1728
1729  status = pthdb_pthread_suspendstate (pd_session, pdtid,
1730				       &suspendstate);
1731  if (status == PTHDB_SUCCESS && suspendstate == PSS_SUSPENDED)
1732    /* i18n: Like "Thread-Id %d, [state] running, suspended" */
1733    fprintf_unfiltered (buf, _(", suspended"));
1734
1735  status = pthdb_pthread_detachstate (pd_session, pdtid,
1736				      &detachstate);
1737  if (status == PTHDB_SUCCESS && detachstate == PDS_DETACHED)
1738    /* i18n: Like "Thread-Id %d, [state] running, detached" */
1739    fprintf_unfiltered (buf, _(", detached"));
1740
1741  pthdb_pthread_cancelpend (pd_session, pdtid, &cancelpend);
1742  if (status == PTHDB_SUCCESS && cancelpend)
1743    /* i18n: Like "Thread-Id %d, [state] running, cancel pending" */
1744    fprintf_unfiltered (buf, _(", cancel pending"));
1745
1746  ui_file_write (buf, "", 1);
1747
1748  xfree (ret);			/* Free old buffer.  */
1749
1750  ret = ui_file_xstrdup (buf, &length);
1751  ui_file_delete (buf);
1752
1753  return ret;
1754}
1755
1756/* Initialize target aix_thread_ops.  */
1757
1758static void
1759init_aix_thread_ops (void)
1760{
1761  aix_thread_ops.to_shortname          = "aix-threads";
1762  aix_thread_ops.to_longname           = _("AIX pthread support");
1763  aix_thread_ops.to_doc                = _("AIX pthread support");
1764
1765  aix_thread_ops.to_attach             = aix_thread_attach;
1766  aix_thread_ops.to_detach             = aix_thread_detach;
1767  aix_thread_ops.to_resume             = aix_thread_resume;
1768  aix_thread_ops.to_wait               = aix_thread_wait;
1769  aix_thread_ops.to_fetch_registers    = aix_thread_fetch_registers;
1770  aix_thread_ops.to_store_registers    = aix_thread_store_registers;
1771  aix_thread_ops.to_xfer_partial       = aix_thread_xfer_partial;
1772  /* No need for aix_thread_ops.to_create_inferior, because we activate thread
1773     debugging when the inferior reaches pd_brk_addr.  */
1774  aix_thread_ops.to_kill               = aix_thread_kill;
1775  aix_thread_ops.to_mourn_inferior     = aix_thread_mourn_inferior;
1776  aix_thread_ops.to_thread_alive       = aix_thread_thread_alive;
1777  aix_thread_ops.to_pid_to_str         = aix_thread_pid_to_str;
1778  aix_thread_ops.to_extra_thread_info  = aix_thread_extra_thread_info;
1779  aix_thread_ops.to_stratum            = thread_stratum;
1780  aix_thread_ops.to_magic              = OPS_MAGIC;
1781}
1782
1783/* Module startup initialization function, automagically called by
1784   init.c.  */
1785
1786void
1787_initialize_aix_thread (void)
1788{
1789  init_aix_thread_ops ();
1790  add_target (&aix_thread_ops);
1791
1792  /* Notice when object files get loaded and unloaded.  */
1793  observer_attach_new_objfile (new_objfile);
1794
1795  add_setshow_boolean_cmd ("aix-thread", class_maintenance, &debug_aix_thread,
1796			    _("Set debugging of AIX thread module."),
1797			    _("Show debugging of AIX thread module."),
1798			    _("Enables debugging output (used to debug GDB)."),
1799			    NULL, NULL, /* FIXME: i18n: Debugging of AIX thread module is \"%d\".  */
1800			    &setdebuglist, &showdebuglist);
1801}
1802