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