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