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