Remove declaration of inf_tid_to_proc
[deliverable/binutils-gdb.git] / gdb / rs6000-nat.c
CommitLineData
c906108c 1/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
4646aa9d 2
ecd75fc8 3 Copyright (C) 1986-2014 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
21#include "inferior.h"
22#include "target.h"
23#include "gdbcore.h"
c906108c
SS
24#include "symfile.h"
25#include "objfiles.h"
42203e46 26#include "libbfd.h" /* For bfd_default_set_arch_mach (FIXME) */
c906108c 27#include "bfd.h"
60250e8b 28#include "exceptions.h"
c906108c 29#include "gdb-stabs.h"
4e052eda 30#include "regcache.h"
19caaa45 31#include "arch-utils.h"
dab06dbe 32#include "inf-child.h"
037a727e 33#include "inf-ptrace.h"
11bf77db 34#include "ppc-tdep.h"
6f7f3f0d 35#include "rs6000-tdep.h"
356a5233 36#include "rs6000-aix-tdep.h"
4646aa9d 37#include "exec.h"
06d3b283 38#include "observer.h"
63807e1d 39#include "xcoffread.h"
c906108c
SS
40
41#include <sys/ptrace.h>
42#include <sys/reg.h>
43
c906108c
SS
44#include <sys/dir.h>
45#include <sys/user.h>
46#include <signal.h>
47#include <sys/ioctl.h>
48#include <fcntl.h>
7a78ae4e 49#include <errno.h>
c906108c
SS
50
51#include <a.out.h>
52#include <sys/file.h>
53ce3c39 53#include <sys/stat.h>
92107356 54#include "gdb_bfd.h"
c906108c 55#include <sys/core.h>
7a78ae4e
ND
56#define __LDINFO_PTRACE32__ /* for __ld_info32 */
57#define __LDINFO_PTRACE64__ /* for __ld_info64 */
c906108c 58#include <sys/ldr.h>
7a78ae4e 59#include <sys/systemcfg.h>
c906108c 60
7a78ae4e
ND
61/* On AIX4.3+, sys/ldr.h provides different versions of struct ld_info for
62 debugging 32-bit and 64-bit processes. Define a typedef and macros for
0df8b418 63 accessing fields in the appropriate structures. */
7a78ae4e
ND
64
65/* In 32-bit compilation mode (which is the only mode from which ptrace()
0df8b418 66 works on 4.3), __ld_info32 is #defined as equivalent to ld_info. */
7a78ae4e 67
b08ee99f 68#if defined (__ld_info32) || defined (__ld_info64)
7a78ae4e
ND
69# define ARCH3264
70#endif
71
0df8b418 72/* Return whether the current architecture is 64-bit. */
7a78ae4e
ND
73
74#ifndef ARCH3264
75# define ARCH64() 0
76#else
f5656ead 77# define ARCH64() (register_size (target_gdbarch (), 0) == 8)
7a78ae4e
ND
78#endif
79
fb14de7b 80static void exec_one_dummy_insn (struct regcache *);
c906108c 81
4d1eb6b4
JB
82static LONGEST rs6000_xfer_shared_libraries
83 (struct target_ops *ops, enum target_object object,
84 const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf,
85 ULONGEST offset, LONGEST len);
86
dd7be90a
KB
87/* Given REGNO, a gdb register number, return the corresponding
88 number suitable for use as a ptrace() parameter. Return -1 if
89 there's no suitable mapping. Also, set the int pointed to by
90 ISFLOAT to indicate whether REGNO is a floating point register. */
c906108c 91
dd7be90a 92static int
206988c4 93regmap (struct gdbarch *gdbarch, int regno, int *isfloat)
c5aa993b 94{
206988c4 95 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
dd7be90a
KB
96
97 *isfloat = 0;
8bf659e8
JB
98 if (tdep->ppc_gp0_regnum <= regno
99 && regno < tdep->ppc_gp0_regnum + ppc_num_gprs)
dd7be90a 100 return regno;
383f0f5b
JB
101 else if (tdep->ppc_fp0_regnum >= 0
102 && tdep->ppc_fp0_regnum <= regno
366f009f 103 && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)
dd7be90a
KB
104 {
105 *isfloat = 1;
366f009f 106 return regno - tdep->ppc_fp0_regnum + FPR0;
dd7be90a 107 }
206988c4 108 else if (regno == gdbarch_pc_regnum (gdbarch))
dd7be90a
KB
109 return IAR;
110 else if (regno == tdep->ppc_ps_regnum)
111 return MSR;
112 else if (regno == tdep->ppc_cr_regnum)
113 return CR;
114 else if (regno == tdep->ppc_lr_regnum)
115 return LR;
116 else if (regno == tdep->ppc_ctr_regnum)
117 return CTR;
118 else if (regno == tdep->ppc_xer_regnum)
119 return XER;
383f0f5b
JB
120 else if (tdep->ppc_fpscr_regnum >= 0
121 && regno == tdep->ppc_fpscr_regnum)
0e061eef 122 return FPSCR;
dd7be90a
KB
123 else if (tdep->ppc_mq_regnum >= 0 && regno == tdep->ppc_mq_regnum)
124 return MQ;
125 else
126 return -1;
127}
c906108c 128
0df8b418 129/* Call ptrace(REQ, ID, ADDR, DATA, BUF). */
c906108c 130
7a78ae4e 131static int
8b5790f2 132rs6000_ptrace32 (int req, int id, int *addr, int data, int *buf)
7a78ae4e 133{
1ed3ee94 134#ifdef HAVE_PTRACE64
11cb8762 135 int ret = ptrace64 (req, id, (uintptr_t) addr, data, buf);
1ed3ee94 136#else
7a78ae4e 137 int ret = ptrace (req, id, (int *)addr, data, buf);
1ed3ee94 138#endif
7a78ae4e 139#if 0
8b5790f2 140 printf ("rs6000_ptrace32 (%d, %d, 0x%x, %08x, 0x%x) = 0x%x\n",
7a78ae4e
ND
141 req, id, (unsigned int)addr, data, (unsigned int)buf, ret);
142#endif
143 return ret;
144}
c906108c 145
0df8b418 146/* Call ptracex(REQ, ID, ADDR, DATA, BUF). */
c906108c 147
7a78ae4e 148static int
0d16ee5d 149rs6000_ptrace64 (int req, int id, long long addr, int data, void *buf)
7a78ae4e
ND
150{
151#ifdef ARCH3264
1ed3ee94 152# ifdef HAVE_PTRACE64
b08ee99f 153 int ret = ptrace64 (req, id, addr, data, buf);
1ed3ee94 154# else
7a78ae4e 155 int ret = ptracex (req, id, addr, data, buf);
1ed3ee94 156# endif
7a78ae4e
ND
157#else
158 int ret = 0;
159#endif
160#if 0
2244ba2e
PM
161 printf ("rs6000_ptrace64 (%d, %d, %s, %08x, 0x%x) = 0x%x\n",
162 req, id, hex_string (addr), data, (unsigned int)buf, ret);
7a78ae4e
ND
163#endif
164 return ret;
165}
c906108c 166
0df8b418 167/* Fetch register REGNO from the inferior. */
c906108c 168
7a78ae4e 169static void
56be3814 170fetch_register (struct regcache *regcache, int regno)
7a78ae4e 171{
8b164abb 172 struct gdbarch *gdbarch = get_regcache_arch (regcache);
d9d9c31f 173 int addr[MAX_REGISTER_SIZE];
dd7be90a 174 int nr, isfloat;
c906108c 175
0df8b418 176 /* Retrieved values may be -1, so infer errors from errno. */
7a78ae4e 177 errno = 0;
c906108c 178
206988c4 179 nr = regmap (gdbarch, regno, &isfloat);
dd7be90a 180
0df8b418 181 /* Floating-point registers. */
dd7be90a 182 if (isfloat)
dfd4cc63 183 rs6000_ptrace32 (PT_READ_FPR, ptid_get_pid (inferior_ptid), addr, nr, 0);
c906108c 184
0df8b418 185 /* Bogus register number. */
dd7be90a 186 else if (nr < 0)
2a18e3d9 187 {
8b164abb 188 if (regno >= gdbarch_num_regs (gdbarch))
2a18e3d9
EZ
189 fprintf_unfiltered (gdb_stderr,
190 "gdb error: register no %d not implemented.\n",
191 regno);
dd7be90a 192 return;
2a18e3d9 193 }
c906108c 194
0df8b418 195 /* Fixed-point registers. */
7a78ae4e
ND
196 else
197 {
7a78ae4e 198 if (!ARCH64 ())
dfd4cc63 199 *addr = rs6000_ptrace32 (PT_READ_GPR, ptid_get_pid (inferior_ptid),
0df8b418 200 (int *) nr, 0, 0);
7a78ae4e
ND
201 else
202 {
203 /* PT_READ_GPR requires the buffer parameter to point to long long,
0df8b418 204 even if the register is really only 32 bits. */
7a78ae4e 205 long long buf;
dfd4cc63
LM
206 rs6000_ptrace64 (PT_READ_GPR, ptid_get_pid (inferior_ptid),
207 nr, 0, &buf);
8b164abb 208 if (register_size (gdbarch, regno) == 8)
7a78ae4e
ND
209 memcpy (addr, &buf, 8);
210 else
211 *addr = buf;
212 }
213 }
214
215 if (!errno)
56be3814 216 regcache_raw_supply (regcache, regno, (char *) addr);
7a78ae4e
ND
217 else
218 {
219#if 0
0df8b418 220 /* FIXME: this happens 3 times at the start of each 64-bit program. */
9b20d036 221 perror (_("ptrace read"));
7a78ae4e
ND
222#endif
223 errno = 0;
224 }
c906108c
SS
225}
226
0df8b418 227/* Store register REGNO back into the inferior. */
c906108c 228
7a78ae4e 229static void
fb14de7b 230store_register (struct regcache *regcache, int regno)
c906108c 231{
8b164abb 232 struct gdbarch *gdbarch = get_regcache_arch (regcache);
d9d9c31f 233 int addr[MAX_REGISTER_SIZE];
dd7be90a 234 int nr, isfloat;
c906108c 235
11bf77db 236 /* Fetch the register's value from the register cache. */
56be3814 237 regcache_raw_collect (regcache, regno, addr);
11bf77db 238
0df8b418 239 /* -1 can be a successful return value, so infer errors from errno. */
c906108c
SS
240 errno = 0;
241
206988c4 242 nr = regmap (gdbarch, regno, &isfloat);
dd7be90a 243
0df8b418 244 /* Floating-point registers. */
dd7be90a 245 if (isfloat)
dfd4cc63 246 rs6000_ptrace32 (PT_WRITE_FPR, ptid_get_pid (inferior_ptid), addr, nr, 0);
c906108c 247
0df8b418 248 /* Bogus register number. */
dd7be90a 249 else if (nr < 0)
7a78ae4e 250 {
8b164abb 251 if (regno >= gdbarch_num_regs (gdbarch))
7a78ae4e
ND
252 fprintf_unfiltered (gdb_stderr,
253 "gdb error: register no %d not implemented.\n",
254 regno);
255 }
c906108c 256
0df8b418 257 /* Fixed-point registers. */
7a78ae4e
ND
258 else
259 {
8b164abb 260 if (regno == gdbarch_sp_regnum (gdbarch))
7a78ae4e
ND
261 /* Execute one dummy instruction (which is a breakpoint) in inferior
262 process to give kernel a chance to do internal housekeeping.
263 Otherwise the following ptrace(2) calls will mess up user stack
264 since kernel will get confused about the bottom of the stack
0df8b418 265 (%sp). */
fb14de7b 266 exec_one_dummy_insn (regcache);
c906108c 267
11bf77db
KB
268 /* The PT_WRITE_GPR operation is rather odd. For 32-bit inferiors,
269 the register's value is passed by value, but for 64-bit inferiors,
270 the address of a buffer containing the value is passed. */
7a78ae4e 271 if (!ARCH64 ())
dfd4cc63 272 rs6000_ptrace32 (PT_WRITE_GPR, ptid_get_pid (inferior_ptid),
0df8b418 273 (int *) nr, *addr, 0);
7a78ae4e 274 else
c906108c 275 {
7a78ae4e 276 /* PT_WRITE_GPR requires the buffer parameter to point to an 8-byte
0df8b418 277 area, even if the register is really only 32 bits. */
7a78ae4e 278 long long buf;
8b164abb 279 if (register_size (gdbarch, regno) == 8)
7a78ae4e
ND
280 memcpy (&buf, addr, 8);
281 else
282 buf = *addr;
dfd4cc63
LM
283 rs6000_ptrace64 (PT_WRITE_GPR, ptid_get_pid (inferior_ptid),
284 nr, 0, &buf);
c906108c
SS
285 }
286 }
287
7a78ae4e 288 if (errno)
c906108c 289 {
9b20d036 290 perror (_("ptrace write"));
7a78ae4e 291 errno = 0;
c906108c 292 }
7a78ae4e 293}
c906108c 294
7a78ae4e 295/* Read from the inferior all registers if REGNO == -1 and just register
0df8b418 296 REGNO otherwise. */
c906108c 297
037a727e 298static void
28439f5e
PA
299rs6000_fetch_inferior_registers (struct target_ops *ops,
300 struct regcache *regcache, int regno)
7a78ae4e 301{
8b164abb 302 struct gdbarch *gdbarch = get_regcache_arch (regcache);
7a78ae4e 303 if (regno != -1)
56be3814 304 fetch_register (regcache, regno);
7a78ae4e
ND
305
306 else
c906108c 307 {
8b164abb 308 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
7a78ae4e 309
dd7be90a
KB
310 /* Read 32 general purpose registers. */
311 for (regno = tdep->ppc_gp0_regnum;
8bf659e8 312 regno < tdep->ppc_gp0_regnum + ppc_num_gprs;
dd7be90a
KB
313 regno++)
314 {
56be3814 315 fetch_register (regcache, regno);
dd7be90a
KB
316 }
317
318 /* Read general purpose floating point registers. */
383f0f5b
JB
319 if (tdep->ppc_fp0_regnum >= 0)
320 for (regno = 0; regno < ppc_num_fprs; regno++)
56be3814 321 fetch_register (regcache, tdep->ppc_fp0_regnum + regno);
7a78ae4e 322
dd7be90a 323 /* Read special registers. */
8b164abb 324 fetch_register (regcache, gdbarch_pc_regnum (gdbarch));
56be3814
UW
325 fetch_register (regcache, tdep->ppc_ps_regnum);
326 fetch_register (regcache, tdep->ppc_cr_regnum);
327 fetch_register (regcache, tdep->ppc_lr_regnum);
328 fetch_register (regcache, tdep->ppc_ctr_regnum);
329 fetch_register (regcache, tdep->ppc_xer_regnum);
383f0f5b 330 if (tdep->ppc_fpscr_regnum >= 0)
56be3814 331 fetch_register (regcache, tdep->ppc_fpscr_regnum);
dd7be90a 332 if (tdep->ppc_mq_regnum >= 0)
56be3814 333 fetch_register (regcache, tdep->ppc_mq_regnum);
c906108c 334 }
7a78ae4e 335}
c906108c 336
7a78ae4e
ND
337/* Store our register values back into the inferior.
338 If REGNO is -1, do this for all registers.
339 Otherwise, REGNO specifies which register (so we can save time). */
340
037a727e 341static void
28439f5e
PA
342rs6000_store_inferior_registers (struct target_ops *ops,
343 struct regcache *regcache, int regno)
7a78ae4e 344{
8b164abb 345 struct gdbarch *gdbarch = get_regcache_arch (regcache);
7a78ae4e 346 if (regno != -1)
56be3814 347 store_register (regcache, regno);
7a78ae4e
ND
348
349 else
f6077098 350 {
8b164abb 351 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
dd7be90a
KB
352
353 /* Write general purpose registers first. */
354 for (regno = tdep->ppc_gp0_regnum;
8bf659e8 355 regno < tdep->ppc_gp0_regnum + ppc_num_gprs;
dd7be90a
KB
356 regno++)
357 {
56be3814 358 store_register (regcache, regno);
dd7be90a 359 }
7a78ae4e 360
dd7be90a 361 /* Write floating point registers. */
383f0f5b
JB
362 if (tdep->ppc_fp0_regnum >= 0)
363 for (regno = 0; regno < ppc_num_fprs; regno++)
56be3814 364 store_register (regcache, tdep->ppc_fp0_regnum + regno);
7a78ae4e 365
dd7be90a 366 /* Write special registers. */
8b164abb 367 store_register (regcache, gdbarch_pc_regnum (gdbarch));
56be3814
UW
368 store_register (regcache, tdep->ppc_ps_regnum);
369 store_register (regcache, tdep->ppc_cr_regnum);
370 store_register (regcache, tdep->ppc_lr_regnum);
371 store_register (regcache, tdep->ppc_ctr_regnum);
372 store_register (regcache, tdep->ppc_xer_regnum);
383f0f5b 373 if (tdep->ppc_fpscr_regnum >= 0)
56be3814 374 store_register (regcache, tdep->ppc_fpscr_regnum);
dd7be90a 375 if (tdep->ppc_mq_regnum >= 0)
56be3814 376 store_register (regcache, tdep->ppc_mq_regnum);
f6077098 377 }
7a78ae4e 378}
f6077098 379
7a78ae4e 380
037a727e
UW
381/* Attempt a transfer all LEN bytes starting at OFFSET between the
382 inferior's OBJECT:ANNEX space and GDB's READBUF/WRITEBUF buffer.
383 Return the number of bytes actually transferred. */
7a78ae4e 384
037a727e
UW
385static LONGEST
386rs6000_xfer_partial (struct target_ops *ops, enum target_object object,
387 const char *annex, gdb_byte *readbuf,
388 const gdb_byte *writebuf,
389 ULONGEST offset, LONGEST len)
7a78ae4e 390{
037a727e 391 pid_t pid = ptid_get_pid (inferior_ptid);
7a78ae4e 392 int arch64 = ARCH64 ();
7a78ae4e 393
037a727e 394 switch (object)
c906108c 395 {
ff99b71b 396 case TARGET_OBJECT_LIBRARIES_AIX:
4d1eb6b4
JB
397 return rs6000_xfer_shared_libraries (ops, object, annex,
398 readbuf, writebuf,
399 offset, len);
037a727e
UW
400 case TARGET_OBJECT_MEMORY:
401 {
402 union
7a78ae4e 403 {
037a727e
UW
404 PTRACE_TYPE_RET word;
405 gdb_byte byte[sizeof (PTRACE_TYPE_RET)];
406 } buffer;
407 ULONGEST rounded_offset;
408 LONGEST partial_len;
409
410 /* Round the start offset down to the next long word
411 boundary. */
412 rounded_offset = offset & -(ULONGEST) sizeof (PTRACE_TYPE_RET);
413
414 /* Since ptrace will transfer a single word starting at that
415 rounded_offset the partial_len needs to be adjusted down to
416 that (remember this function only does a single transfer).
417 Should the required length be even less, adjust it down
418 again. */
419 partial_len = (rounded_offset + sizeof (PTRACE_TYPE_RET)) - offset;
420 if (partial_len > len)
421 partial_len = len;
422
423 if (writebuf)
424 {
425 /* If OFFSET:PARTIAL_LEN is smaller than
426 ROUNDED_OFFSET:WORDSIZE then a read/modify write will
427 be needed. Read in the entire word. */
428 if (rounded_offset < offset
429 || (offset + partial_len
430 < rounded_offset + sizeof (PTRACE_TYPE_RET)))
431 {
432 /* Need part of initial word -- fetch it. */
433 if (arch64)
434 buffer.word = rs6000_ptrace64 (PT_READ_I, pid,
435 rounded_offset, 0, NULL);
436 else
437 buffer.word = rs6000_ptrace32 (PT_READ_I, pid,
0df8b418
MS
438 (int *) (uintptr_t)
439 rounded_offset,
037a727e
UW
440 0, NULL);
441 }
442
443 /* Copy data to be written over corresponding part of
444 buffer. */
445 memcpy (buffer.byte + (offset - rounded_offset),
446 writebuf, partial_len);
447
448 errno = 0;
449 if (arch64)
450 rs6000_ptrace64 (PT_WRITE_D, pid,
451 rounded_offset, buffer.word, NULL);
452 else
453 rs6000_ptrace32 (PT_WRITE_D, pid,
0df8b418
MS
454 (int *) (uintptr_t) rounded_offset,
455 buffer.word, NULL);
037a727e
UW
456 if (errno)
457 return 0;
458 }
459
460 if (readbuf)
461 {
462 errno = 0;
463 if (arch64)
464 buffer.word = rs6000_ptrace64 (PT_READ_I, pid,
465 rounded_offset, 0, NULL);
466 else
467 buffer.word = rs6000_ptrace32 (PT_READ_I, pid,
468 (int *)(uintptr_t)rounded_offset,
469 0, NULL);
470 if (errno)
471 return 0;
472
473 /* Copy appropriate bytes out of the buffer. */
474 memcpy (readbuf, buffer.byte + (offset - rounded_offset),
475 partial_len);
476 }
477
478 return partial_len;
479 }
480
481 default:
482 return -1;
7a78ae4e 483 }
c906108c
SS
484}
485
482f7fee
UW
486/* Wait for the child specified by PTID to do something. Return the
487 process ID of the child, or MINUS_ONE_PTID in case of error; store
488 the status in *OURSTATUS. */
489
490static ptid_t
117de6a9 491rs6000_wait (struct target_ops *ops,
47608cb1 492 ptid_t ptid, struct target_waitstatus *ourstatus, int options)
482f7fee
UW
493{
494 pid_t pid;
495 int status, save_errno;
496
497 do
498 {
499 set_sigint_trap ();
482f7fee
UW
500
501 do
502 {
503 pid = waitpid (ptid_get_pid (ptid), &status, 0);
504 save_errno = errno;
505 }
506 while (pid == -1 && errno == EINTR);
507
482f7fee
UW
508 clear_sigint_trap ();
509
510 if (pid == -1)
511 {
512 fprintf_unfiltered (gdb_stderr,
513 _("Child process unexpectedly missing: %s.\n"),
514 safe_strerror (save_errno));
515
516 /* Claim it exited with unknown signal. */
517 ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
a493e3e2 518 ourstatus->value.sig = GDB_SIGNAL_UNKNOWN;
fb66883a 519 return inferior_ptid;
482f7fee
UW
520 }
521
522 /* Ignore terminated detached child processes. */
523 if (!WIFSTOPPED (status) && pid != ptid_get_pid (inferior_ptid))
524 pid = -1;
525 }
526 while (pid == -1);
527
528 /* AIX has a couple of strange returns from wait(). */
529
530 /* stop after load" status. */
531 if (status == 0x57c)
532 ourstatus->kind = TARGET_WAITKIND_LOADED;
0df8b418 533 /* signal 0. I have no idea why wait(2) returns with this status word. */
482f7fee
UW
534 else if (status == 0x7f)
535 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
536 /* A normal waitstatus. Let the usual macros deal with it. */
537 else
538 store_waitstatus (ourstatus, status);
539
540 return pid_to_ptid (pid);
541}
037a727e 542
c906108c
SS
543/* Execute one dummy breakpoint instruction. This way we give the kernel
544 a chance to do some housekeeping and update inferior's internal data,
0df8b418 545 including u_area. */
c906108c
SS
546
547static void
fb14de7b 548exec_one_dummy_insn (struct regcache *regcache)
c906108c 549{
4a7622d1 550#define DUMMY_INSN_ADDR AIX_TEXT_SEGMENT_BASE+0x200
c906108c 551
a6d9a66e 552 struct gdbarch *gdbarch = get_regcache_arch (regcache);
7a78ae4e 553 int ret, status, pid;
c906108c 554 CORE_ADDR prev_pc;
8181d85f 555 void *bp;
c906108c 556
0df8b418 557 /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We
c906108c 558 assume that this address will never be executed again by the real
0df8b418 559 code. */
c906108c 560
47607d6f 561 bp = deprecated_insert_raw_breakpoint (gdbarch, NULL, DUMMY_INSN_ADDR);
c906108c 562
c906108c
SS
563 /* You might think this could be done with a single ptrace call, and
564 you'd be correct for just about every platform I've ever worked
565 on. However, rs6000-ibm-aix4.1.3 seems to have screwed this up --
566 the inferior never hits the breakpoint (it's also worth noting
567 powerpc-ibm-aix4.1.3 works correctly). */
fb14de7b
UW
568 prev_pc = regcache_read_pc (regcache);
569 regcache_write_pc (regcache, DUMMY_INSN_ADDR);
7a78ae4e 570 if (ARCH64 ())
dfd4cc63
LM
571 ret = rs6000_ptrace64 (PT_CONTINUE, ptid_get_pid (inferior_ptid),
572 1, 0, NULL);
7a78ae4e 573 else
dfd4cc63 574 ret = rs6000_ptrace32 (PT_CONTINUE, ptid_get_pid (inferior_ptid),
0df8b418 575 (int *) 1, 0, NULL);
c906108c 576
7a78ae4e 577 if (ret != 0)
9b20d036 578 perror (_("pt_continue"));
c906108c 579
c5aa993b
JM
580 do
581 {
dfd4cc63 582 pid = waitpid (ptid_get_pid (inferior_ptid), &status, 0);
c5aa993b 583 }
dfd4cc63 584 while (pid != ptid_get_pid (inferior_ptid));
c5aa993b 585
fb14de7b 586 regcache_write_pc (regcache, prev_pc);
a6d9a66e 587 deprecated_remove_raw_breakpoint (gdbarch, bp);
c906108c 588}
c906108c 589\f
7a78ae4e 590
7a78ae4e 591/* Set the current architecture from the host running GDB. Called when
0df8b418 592 starting a child process. */
7a78ae4e 593
136d6dae
VP
594static void (*super_create_inferior) (struct target_ops *,char *exec_file,
595 char *allargs, char **env, int from_tty);
1f480a5e 596static void
136d6dae
VP
597rs6000_create_inferior (struct target_ops * ops, char *exec_file,
598 char *allargs, char **env, int from_tty)
7a78ae4e
ND
599{
600 enum bfd_architecture arch;
601 unsigned long mach;
602 bfd abfd;
603 struct gdbarch_info info;
604
136d6dae 605 super_create_inferior (ops, exec_file, allargs, env, from_tty);
1f480a5e 606
7a78ae4e
ND
607 if (__power_rs ())
608 {
609 arch = bfd_arch_rs6000;
610 mach = bfd_mach_rs6k;
611 }
612 else
613 {
614 arch = bfd_arch_powerpc;
615 mach = bfd_mach_ppc;
616 }
19caaa45
PS
617
618 /* FIXME: schauer/2002-02-25:
619 We don't know if we are executing a 32 or 64 bit executable,
620 and have no way to pass the proper word size to rs6000_gdbarch_init.
621 So we have to avoid switching to a new architecture, if the architecture
622 matches already.
623 Blindly calling rs6000_gdbarch_init used to work in older versions of
624 GDB, as rs6000_gdbarch_init incorrectly used the previous tdep to
625 determine the wordsize. */
626 if (exec_bfd)
627 {
628 const struct bfd_arch_info *exec_bfd_arch_info;
629
630 exec_bfd_arch_info = bfd_get_arch_info (exec_bfd);
631 if (arch == exec_bfd_arch_info->arch)
632 return;
633 }
634
7a78ae4e
ND
635 bfd_default_set_arch_mach (&abfd, arch, mach);
636
fb6ecb0f 637 gdbarch_info_init (&info);
7a78ae4e 638 info.bfd_arch_info = bfd_get_arch_info (&abfd);
7aea86e6 639 info.abfd = exec_bfd;
7a78ae4e 640
16f33e29 641 if (!gdbarch_update_p (info))
e2e0b3e5 642 internal_error (__FILE__, __LINE__,
0df8b418
MS
643 _("rs6000_create_inferior: failed "
644 "to select architecture"));
7a78ae4e 645}
c906108c 646\f
c906108c 647
4d1eb6b4 648/* Shared Object support. */
c906108c 649
4d1eb6b4
JB
650/* Return the LdInfo data for the given process. Raises an error
651 if the data could not be obtained.
8d08c9ce 652
4d1eb6b4 653 The returned value must be deallocated after use. */
c906108c 654
356a5233 655static gdb_byte *
4d1eb6b4
JB
656rs6000_ptrace_ldinfo (ptid_t ptid)
657{
658 const int pid = ptid_get_pid (ptid);
659 int ldi_size = 1024;
356a5233 660 gdb_byte *ldi = xmalloc (ldi_size);
4d1eb6b4 661 int rc = -1;
7a78ae4e 662
4d1eb6b4
JB
663 while (1)
664 {
665 if (ARCH64 ())
666 rc = rs6000_ptrace64 (PT_LDINFO, pid, (unsigned long) ldi, ldi_size,
667 NULL);
c18e0d23 668 else
4d1eb6b4
JB
669 rc = rs6000_ptrace32 (PT_LDINFO, pid, (int *) ldi, ldi_size, NULL);
670
671 if (rc != -1)
672 break; /* Success, we got the entire ld_info data. */
673
674 if (errno != ENOMEM)
675 perror_with_name (_("ptrace ldinfo"));
676
677 /* ldi is not big enough. Double it and try again. */
678 ldi_size *= 2;
679 ldi = xrealloc (ldi, ldi_size);
680 }
681
682 return ldi;
c906108c 683}
c906108c 684
4d1eb6b4 685/* Implement the to_xfer_partial target_ops method for
ff99b71b 686 TARGET_OBJECT_LIBRARIES_AIX objects. */
6426a772 687
4d1eb6b4
JB
688static LONGEST
689rs6000_xfer_shared_libraries
690 (struct target_ops *ops, enum target_object object,
691 const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf,
692 ULONGEST offset, LONGEST len)
693{
356a5233
JB
694 gdb_byte *ldi_buf;
695 ULONGEST result;
696 struct cleanup *cleanup;
697
698 /* This function assumes that it is being run with a live process.
699 Core files are handled via gdbarch. */
700 gdb_assert (target_has_execution);
c906108c 701
4d1eb6b4
JB
702 if (writebuf)
703 return -1;
c5aa993b 704
356a5233
JB
705 ldi_buf = rs6000_ptrace_ldinfo (inferior_ptid);
706 gdb_assert (ldi_buf != NULL);
707 cleanup = make_cleanup (xfree, ldi_buf);
708 result = rs6000_aix_ld_info_to_xml (target_gdbarch (), ldi_buf,
709 readbuf, offset, len, 1);
710 xfree (ldi_buf);
4d1eb6b4 711
356a5233
JB
712 do_cleanups (cleanup);
713 return result;
c906108c 714}
c906108c 715
e1aca11e
JB
716void _initialize_rs6000_nat (void);
717
c906108c 718void
7a61a01c 719_initialize_rs6000_nat (void)
c906108c 720{
037a727e
UW
721 struct target_ops *t;
722
723 t = inf_ptrace_target ();
724 t->to_fetch_registers = rs6000_fetch_inferior_registers;
725 t->to_store_registers = rs6000_store_inferior_registers;
726 t->to_xfer_partial = rs6000_xfer_partial;
1f480a5e
UW
727
728 super_create_inferior = t->to_create_inferior;
729 t->to_create_inferior = rs6000_create_inferior;
730
482f7fee
UW
731 t->to_wait = rs6000_wait;
732
037a727e 733 add_target (t);
c906108c 734}
This page took 1.712227 seconds and 4 git commands to generate.