Thu Aug 7 13:39:31 1997 Geoffrey Noer <noer@cygnus.com>
[deliverable/binutils-gdb.git] / gdb / rs6000-nat.c
CommitLineData
ef6f3a8b 1/* IBM RS/6000 native-dependent code for GDB, the GNU debugger.
211b564e 2 Copyright 1986, 1987, 1989, 1991, 1992, 1994, 1995, 1996, 1997
df1e1074 3 Free Software Foundation, Inc.
ef6f3a8b
RP
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
6c9638b4 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
ef6f3a8b
RP
20
21#include "defs.h"
22#include "inferior.h"
23#include "target.h"
d87d7b10
SG
24#include "gdbcore.h"
25#include "xcoffsolib.h"
26#include "symfile.h"
27#include "objfiles.h"
886955e7 28#include "libbfd.h" /* For bfd_cache_lookup (FIXME) */
d87d7b10 29#include "bfd.h"
e2adc41a 30#include "gdb-stabs.h"
ef6f3a8b
RP
31
32#include <sys/ptrace.h>
33#include <sys/reg.h>
34
35#include <sys/param.h>
36#include <sys/dir.h>
37#include <sys/user.h>
38#include <signal.h>
39#include <sys/ioctl.h>
40#include <fcntl.h>
41
42#include <a.out.h>
43#include <sys/file.h>
2b576293 44#include "gdb_stat.h"
ef6f3a8b 45#include <sys/core.h>
d87d7b10 46#include <sys/ldr.h>
ef6f3a8b
RP
47
48extern int errno;
0c4b30ea 49
d87d7b10
SG
50extern struct vmap * map_vmap PARAMS ((bfd *bf, bfd *arch));
51
52extern struct target_ops exec_ops;
ef6f3a8b 53
a95d92fa
FF
54static void
55vmap_exec PARAMS ((void));
56
57static void
58vmap_ldinfo PARAMS ((struct ld_info *));
59
60static struct vmap *
61add_vmap PARAMS ((struct ld_info *));
62
63static int
64objfile_symbol_add PARAMS ((char *));
65
66static void
67vmap_symtab PARAMS ((struct vmap *));
68
69static void
948a9d92 70fetch_core_registers PARAMS ((char *, unsigned int, int, CORE_ADDR));
a95d92fa 71
ef6f3a8b
RP
72static void
73exec_one_dummy_insn PARAMS ((void));
74
d87d7b10
SG
75extern void
76add_text_to_loadinfo PARAMS ((CORE_ADDR textaddr, CORE_ADDR dataaddr));
77
0c4b30ea
SS
78extern void
79fixup_breakpoints PARAMS ((CORE_ADDR low, CORE_ADDR high, CORE_ADDR delta));
80
ef6f3a8b
RP
81/* Conversion from gdb-to-system special purpose register numbers.. */
82
83static int special_regs[] = {
84 IAR, /* PC_REGNUM */
85 MSR, /* PS_REGNUM */
86 CR, /* CR_REGNUM */
87 LR, /* LR_REGNUM */
88 CTR, /* CTR_REGNUM */
89 XER, /* XER_REGNUM */
90 MQ /* MQ_REGNUM */
91};
92
93void
94fetch_inferior_registers (regno)
95 int regno;
96{
97 int ii;
98 extern char registers[];
99
100 if (regno < 0) { /* for all registers */
101
102 /* read 32 general purpose registers. */
103
104 for (ii=0; ii < 32; ++ii)
105 *(int*)&registers[REGISTER_BYTE (ii)] =
106 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) ii, 0, 0);
107
108 /* read general purpose floating point registers. */
109
110 for (ii=0; ii < 32; ++ii)
111 ptrace (PT_READ_FPR, inferior_pid,
0c4b30ea 112 (PTRACE_ARG3_TYPE) &registers [REGISTER_BYTE (FP0_REGNUM+ii)],
ef6f3a8b
RP
113 FPR0+ii, 0);
114
115 /* read special registers. */
116 for (ii=0; ii <= LAST_SP_REGNUM-FIRST_SP_REGNUM; ++ii)
117 *(int*)&registers[REGISTER_BYTE (FIRST_SP_REGNUM+ii)] =
118 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) special_regs[ii],
119 0, 0);
120
121 registers_fetched ();
122 return;
123 }
124
125 /* else an individual register is addressed. */
126
127 else if (regno < FP0_REGNUM) { /* a GPR */
128 *(int*)&registers[REGISTER_BYTE (regno)] =
129 ptrace (PT_READ_GPR, inferior_pid, (PTRACE_ARG3_TYPE) regno, 0, 0);
130 }
131 else if (regno <= FPLAST_REGNUM) { /* a FPR */
132 ptrace (PT_READ_FPR, inferior_pid,
0c4b30ea 133 (PTRACE_ARG3_TYPE) &registers [REGISTER_BYTE (regno)],
ef6f3a8b
RP
134 (regno-FP0_REGNUM+FPR0), 0);
135 }
136 else if (regno <= LAST_SP_REGNUM) { /* a special register */
137 *(int*)&registers[REGISTER_BYTE (regno)] =
138 ptrace (PT_READ_GPR, inferior_pid,
139 (PTRACE_ARG3_TYPE) special_regs[regno-FIRST_SP_REGNUM], 0, 0);
140 }
141 else
199b2450 142 fprintf_unfiltered (gdb_stderr, "gdb error: register no %d not implemented.\n", regno);
ef6f3a8b
RP
143
144 register_valid [regno] = 1;
145}
146
147/* Store our register values back into the inferior.
148 If REGNO is -1, do this for all registers.
149 Otherwise, REGNO specifies which register (so we can save time). */
150
151void
152store_inferior_registers (regno)
153 int regno;
154{
155 extern char registers[];
156
157 errno = 0;
158
0c4b30ea
SS
159 if (regno == -1)
160 { /* for all registers.. */
ef6f3a8b
RP
161 int ii;
162
163 /* execute one dummy instruction (which is a breakpoint) in inferior
164 process. So give kernel a chance to do internal house keeping.
165 Otherwise the following ptrace(2) calls will mess up user stack
166 since kernel will get confused about the bottom of the stack (%sp) */
167
168 exec_one_dummy_insn ();
169
170 /* write general purpose registers first! */
0c4b30ea
SS
171 for ( ii=GPR0; ii<=GPR31; ++ii)
172 {
173 ptrace (PT_WRITE_GPR, inferior_pid, (PTRACE_ARG3_TYPE) ii,
174 *(int*)&registers[REGISTER_BYTE (ii)], 0);
175 if (errno)
176 {
177 perror ("ptrace write_gpr");
178 errno = 0;
179 }
ef6f3a8b 180 }
ef6f3a8b
RP
181
182 /* write floating point registers now. */
0c4b30ea
SS
183 for ( ii=0; ii < 32; ++ii)
184 {
185 ptrace (PT_WRITE_FPR, inferior_pid,
ef6f3a8b 186 (PTRACE_ARG3_TYPE) &registers[REGISTER_BYTE (FP0_REGNUM+ii)],
0c4b30ea
SS
187 FPR0+ii, 0);
188 if (errno)
189 {
190 perror ("ptrace write_fpr");
191 errno = 0;
192 }
193 }
ef6f3a8b
RP
194
195 /* write special registers. */
0c4b30ea
SS
196 for (ii=0; ii <= LAST_SP_REGNUM-FIRST_SP_REGNUM; ++ii)
197 {
198 ptrace (PT_WRITE_GPR, inferior_pid,
199 (PTRACE_ARG3_TYPE) special_regs[ii],
200 *(int*)&registers[REGISTER_BYTE (FIRST_SP_REGNUM+ii)], 0);
201 if (errno)
202 {
203 perror ("ptrace write_gpr");
204 errno = 0;
205 }
ef6f3a8b 206 }
0c4b30ea 207 }
ef6f3a8b
RP
208
209 /* else, a specific register number is given... */
210
0c4b30ea
SS
211 else if (regno < FP0_REGNUM) /* a GPR */
212 {
213 ptrace (PT_WRITE_GPR, inferior_pid, (PTRACE_ARG3_TYPE) regno,
214 *(int*)&registers[REGISTER_BYTE (regno)], 0);
215 }
ef6f3a8b 216
0c4b30ea
SS
217 else if (regno <= FPLAST_REGNUM) /* a FPR */
218 {
219 ptrace (PT_WRITE_FPR, inferior_pid,
220 (PTRACE_ARG3_TYPE) &registers[REGISTER_BYTE (regno)],
221 regno - FP0_REGNUM + FPR0, 0);
222 }
ef6f3a8b 223
0c4b30ea
SS
224 else if (regno <= LAST_SP_REGNUM) /* a special register */
225 {
226 ptrace (PT_WRITE_GPR, inferior_pid,
227 (PTRACE_ARG3_TYPE) special_regs [regno-FIRST_SP_REGNUM],
228 *(int*)&registers[REGISTER_BYTE (regno)], 0);
229 }
ef6f3a8b
RP
230
231 else
199b2450 232 fprintf_unfiltered (gdb_stderr, "Gdb error: register no %d not implemented.\n", regno);
ef6f3a8b 233
0c4b30ea
SS
234 if (errno)
235 {
236 perror ("ptrace write");
237 errno = 0;
238 }
ef6f3a8b
RP
239}
240
241/* Execute one dummy breakpoint instruction. This way we give the kernel
242 a chance to do some housekeeping and update inferior's internal data,
243 including u_area. */
0c4b30ea 244
ef6f3a8b
RP
245static void
246exec_one_dummy_insn ()
247{
248#define DUMMY_INSN_ADDR (TEXT_SEGMENT_BASE)+0x200
249
0c4b30ea 250 char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */
ef6f3a8b 251 unsigned int status, pid;
a466b86a 252 CORE_ADDR prev_pc;
ef6f3a8b
RP
253
254 /* We plant one dummy breakpoint into DUMMY_INSN_ADDR address. We assume that
255 this address will never be executed again by the real code. */
256
0c4b30ea 257 target_insert_breakpoint (DUMMY_INSN_ADDR, shadow_contents);
ef6f3a8b
RP
258
259 errno = 0;
a0d76829
JL
260
261 /* You might think this could be done with a single ptrace call, and
262 you'd be correct for just about every platform I've ever worked
263 on. However, rs6000-ibm-aix4.1.3 seems to have screwed this up --
264 the inferior never hits the breakpoint (it's also worth noting
265 powerpc-ibm-aix4.1.3 works correctly). */
a466b86a 266 prev_pc = read_pc ();
a0d76829
JL
267 write_pc (DUMMY_INSN_ADDR);
268 ptrace (PT_CONTINUE, inferior_pid, (PTRACE_ARG3_TYPE)1, 0, 0);
269
ef6f3a8b
RP
270 if (errno)
271 perror ("pt_continue");
272
273 do {
274 pid = wait (&status);
275 } while (pid != inferior_pid);
276
a466b86a 277 write_pc (prev_pc);
0c4b30ea 278 target_remove_breakpoint (DUMMY_INSN_ADDR, shadow_contents);
ef6f3a8b
RP
279}
280
a1df8e78 281static void
ef6f3a8b
RP
282fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr)
283 char *core_reg_sect;
284 unsigned core_reg_size;
285 int which;
948a9d92 286 CORE_ADDR reg_addr; /* Unused in this version */
ef6f3a8b
RP
287{
288 /* fetch GPRs and special registers from the first register section
289 in core bfd. */
0c4b30ea
SS
290 if (which == 0)
291 {
292 /* copy GPRs first. */
293 memcpy (registers, core_reg_sect, 32 * 4);
294
295 /* gdb's internal register template and bfd's register section layout
296 should share a common include file. FIXMEmgo */
297 /* then comes special registes. They are supposed to be in the same
298 order in gdb template and bfd `.reg' section. */
299 core_reg_sect += (32 * 4);
300 memcpy (&registers [REGISTER_BYTE (FIRST_SP_REGNUM)], core_reg_sect,
301 (LAST_SP_REGNUM - FIRST_SP_REGNUM + 1) * 4);
302 }
ef6f3a8b
RP
303
304 /* fetch floating point registers from register section 2 in core bfd. */
305 else if (which == 2)
ade40d31 306 memcpy (&registers [REGISTER_BYTE (FP0_REGNUM)], core_reg_sect, 32 * 8);
ef6f3a8b
RP
307
308 else
199b2450 309 fprintf_unfiltered (gdb_stderr, "Gdb error: unknown parameter to fetch_core_registers().\n");
ef6f3a8b 310}
d87d7b10 311\f
0c4b30ea 312/* handle symbol translation on vmapping */
d87d7b10
SG
313
314static void
315vmap_symtab (vp)
316 register struct vmap *vp;
317{
318 register struct objfile *objfile;
d87d7b10
SG
319 struct section_offsets *new_offsets;
320 int i;
321
322 objfile = vp->objfile;
323 if (objfile == NULL)
324 {
325 /* OK, it's not an objfile we opened ourselves.
326 Currently, that can only happen with the exec file, so
327 relocate the symbols for the symfile. */
328 if (symfile_objfile == NULL)
329 return;
330 objfile = symfile_objfile;
331 }
332
333 new_offsets = alloca
334 (sizeof (struct section_offsets)
335 + sizeof (new_offsets->offsets) * objfile->num_sections);
336
337 for (i = 0; i < objfile->num_sections; ++i)
338 ANOFFSET (new_offsets, i) = ANOFFSET (objfile->section_offsets, i);
339
211b564e
PS
340 /* The symbols in the object file are linked to the VMA of the section,
341 relocate them VMA relative. */
342 ANOFFSET (new_offsets, SECT_OFF_TEXT) = vp->tstart - vp->tvma;
343 ANOFFSET (new_offsets, SECT_OFF_DATA) = vp->dstart - vp->dvma;
344 ANOFFSET (new_offsets, SECT_OFF_BSS) = vp->dstart - vp->dvma;
d87d7b10
SG
345
346 objfile_relocate (objfile, new_offsets);
d87d7b10
SG
347}
348\f
349/* Add symbols for an objfile. */
0c4b30ea 350
d87d7b10
SG
351static int
352objfile_symbol_add (arg)
353 char *arg;
354{
355 struct objfile *obj = (struct objfile *) arg;
0c4b30ea 356
d87d7b10
SG
357 syms_from_objfile (obj, 0, 0, 0);
358 new_symfile_objfile (obj, 0, 0);
359 return 1;
360}
361
362/* Add a new vmap entry based on ldinfo() information.
363
364 If ldi->ldinfo_fd is not valid (e.g. this struct ld_info is from a
365 core file), the caller should set it to -1, and we will open the file.
366
367 Return the vmap new entry. */
0c4b30ea 368
d87d7b10 369static struct vmap *
0c4b30ea 370add_vmap (ldi)
d87d7b10
SG
371 register struct ld_info *ldi;
372{
0c4b30ea
SS
373 bfd *abfd, *last;
374 register char *mem, *objname;
375 struct objfile *obj;
376 struct vmap *vp;
377
378 /* This ldi structure was allocated using alloca() in
379 xcoff_relocate_symtab(). Now we need to have persistent object
380 and member names, so we should save them. */
381
382 mem = ldi->ldinfo_filename + strlen (ldi->ldinfo_filename) + 1;
383 mem = savestring (mem, strlen (mem));
384 objname = savestring (ldi->ldinfo_filename, strlen (ldi->ldinfo_filename));
385
386 if (ldi->ldinfo_fd < 0)
387 /* Note that this opens it once for every member; a possible
388 enhancement would be to only open it once for every object. */
389 abfd = bfd_openr (objname, gnutarget);
390 else
391 abfd = bfd_fdopenr (objname, gnutarget, ldi->ldinfo_fd);
392 if (!abfd)
393 error ("Could not open `%s' as an executable file: %s",
394 objname, bfd_errmsg (bfd_get_error ()));
395
396 /* make sure we have an object file */
397
398 if (bfd_check_format (abfd, bfd_object))
399 vp = map_vmap (abfd, 0);
400
401 else if (bfd_check_format (abfd, bfd_archive))
402 {
403 last = 0;
404 /* FIXME??? am I tossing BFDs? bfd? */
405 while ((last = bfd_openr_next_archived_file (abfd, last)))
406 if (STREQ (mem, last->filename))
407 break;
408
409 if (!last)
410 {
411 bfd_close (abfd);
412 /* FIXME -- should be error */
413 warning ("\"%s\": member \"%s\" missing.", abfd->filename, mem);
a95d92fa 414 return 0;
d87d7b10 415 }
0c4b30ea
SS
416
417 if (!bfd_check_format(last, bfd_object))
418 {
419 bfd_close (last); /* XXX??? */
420 goto obj_err;
d87d7b10 421 }
0c4b30ea
SS
422
423 vp = map_vmap (last, abfd);
424 }
425 else
426 {
427 obj_err:
428 bfd_close (abfd);
429 error ("\"%s\": not in executable format: %s.",
430 objname, bfd_errmsg (bfd_get_error ()));
431 /*NOTREACHED*/
432 }
433 obj = allocate_objfile (vp->bfd, 0);
434 vp->objfile = obj;
d87d7b10
SG
435
436#ifndef SOLIB_SYMBOLS_MANUAL
0c4b30ea
SS
437 if (catch_errors (objfile_symbol_add, (char *)obj,
438 "Error while reading shared library symbols:\n",
439 RETURN_MASK_ALL))
440 {
441 /* Note this is only done if symbol reading was successful. */
442 vmap_symtab (vp);
443 vp->loaded = 1;
444 }
d87d7b10 445#endif
0c4b30ea 446 return vp;
d87d7b10
SG
447}
448\f
0c4b30ea
SS
449/* update VMAP info with ldinfo() information
450 Input is ptr to ldinfo() results. */
d87d7b10
SG
451
452static void
0c4b30ea 453vmap_ldinfo (ldi)
d87d7b10
SG
454 register struct ld_info *ldi;
455{
456 struct stat ii, vi;
457 register struct vmap *vp;
88a5c3fc 458 int got_one, retried;
a95d92fa 459 int got_exec_file = 0;
d87d7b10 460
0c4b30ea
SS
461 /* For each *ldi, see if we have a corresponding *vp.
462 If so, update the mapping, and symbol table.
463 If not, add an entry and symbol table. */
d87d7b10 464
0c4b30ea
SS
465 do {
466 char *name = ldi->ldinfo_filename;
467 char *memb = name + strlen(name) + 1;
d87d7b10 468
0c4b30ea 469 retried = 0;
d87d7b10 470
0c4b30ea
SS
471 if (fstat (ldi->ldinfo_fd, &ii) < 0)
472 fatal ("cannot fstat(fd=%d) on %s", ldi->ldinfo_fd, name);
473 retry:
474 for (got_one = 0, vp = vmap; vp; vp = vp->nxt)
475 {
0c4b30ea
SS
476 /* First try to find a `vp', which is the same as in ldinfo.
477 If not the same, just continue and grep the next `vp'. If same,
478 relocate its tstart, tend, dstart, dend values. If no such `vp'
479 found, get out of this for loop, add this ldi entry as a new vmap
480 (add_vmap) and come back, fins its `vp' and so on... */
d87d7b10 481
0c4b30ea 482 /* The filenames are not always sufficient to match on. */
d87d7b10 483
0c4b30ea
SS
484 if ((name[0] == '/' && !STREQ(name, vp->name))
485 || (memb[0] && !STREQ(memb, vp->member)))
486 continue;
d87d7b10 487
0c4b30ea 488 /* See if we are referring to the same file. */
fb494327
JK
489 if (bfd_stat (vp->bfd, &vi) < 0)
490 /* An error here is innocuous, most likely meaning that
491 the file descriptor has become worthless.
492 FIXME: What does it mean for a file descriptor to become
493 "worthless"? What makes it happen? What error does it
494 produce (ENOENT? others?)? Should we at least provide
495 a warning? */
523ca9d0 496 continue;
d87d7b10 497
0c4b30ea
SS
498 if (ii.st_dev != vi.st_dev || ii.st_ino != vi.st_ino)
499 continue;
d87d7b10 500
0c4b30ea
SS
501 if (!retried)
502 close (ldi->ldinfo_fd);
d87d7b10 503
0c4b30ea 504 ++got_one;
d87d7b10 505
fb494327 506 /* Found a corresponding VMAP. Remap! */
d87d7b10 507
0c4b30ea
SS
508 /* We can assume pointer == CORE_ADDR, this code is native only. */
509 vp->tstart = (CORE_ADDR) ldi->ldinfo_textorg;
510 vp->tend = vp->tstart + ldi->ldinfo_textsize;
511 vp->dstart = (CORE_ADDR) ldi->ldinfo_dataorg;
512 vp->dend = vp->dstart + ldi->ldinfo_datasize;
d87d7b10 513
211b564e
PS
514 /* The run time loader maps the file header in addition to the text
515 section and returns a pointer to the header in ldinfo_textorg.
516 Adjust the text start address to point to the real start address
517 of the text section. */
518 vp->tstart += vp->toffs;
d87d7b10 519
88a5c3fc
JK
520 /* The objfile is only NULL for the exec file. */
521 if (vp->objfile == NULL)
522 got_exec_file = 1;
523
0c4b30ea
SS
524 /* relocate symbol table(s). */
525 vmap_symtab (vp);
d87d7b10 526
fb494327 527 /* There may be more, so we don't break out of the loop. */
0c4b30ea 528 }
d87d7b10 529
0c4b30ea
SS
530 /* if there was no matching *vp, we must perforce create the sucker(s) */
531 if (!got_one && !retried)
532 {
533 add_vmap (ldi);
534 ++retried;
535 goto retry;
536 }
d87d7b10
SG
537 } while (ldi->ldinfo_next
538 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
539
8989d4fc
JK
540 /* If we don't find the symfile_objfile anywhere in the ldinfo, it
541 is unlikely that the symbol file is relocated to the proper
542 address. And we might have attached to a process which is
543 running a different copy of the same executable. */
88a5c3fc 544 if (symfile_objfile != NULL && !got_exec_file)
8989d4fc
JK
545 {
546 warning_begin ();
547 fputs_unfiltered ("Symbol file ", gdb_stderr);
548 fputs_unfiltered (symfile_objfile->name, gdb_stderr);
549 fputs_unfiltered ("\nis not mapped; discarding it.\n\
550If in fact that file has symbols which the mapped files listed by\n\
551\"info files\" lack, you can load symbols with the \"symbol-file\" or\n\
552\"add-symbol-file\" commands (note that you must take care of relocating\n\
553symbols to the proper address).\n", gdb_stderr);
554 free_objfile (symfile_objfile);
555 symfile_objfile = NULL;
556 }
e2adc41a 557 breakpoint_re_set ();
d87d7b10
SG
558}
559\f
560/* As well as symbol tables, exec_sections need relocation. After
561 the inferior process' termination, there will be a relocated symbol
562 table exist with no corresponding inferior process. At that time, we
563 need to use `exec' bfd, rather than the inferior process's memory space
564 to look up symbols.
565
566 `exec_sections' need to be relocated only once, as long as the exec
567 file remains unchanged.
568*/
569
570static void
571vmap_exec ()
572{
573 static bfd *execbfd;
574 int i;
575
576 if (execbfd == exec_bfd)
577 return;
578
579 execbfd = exec_bfd;
580
581 if (!vmap || !exec_ops.to_sections)
582 error ("vmap_exec: vmap or exec_ops.to_sections == 0\n");
583
584 for (i=0; &exec_ops.to_sections[i] < exec_ops.to_sections_end; i++)
585 {
94d4b713 586 if (STREQ(".text", exec_ops.to_sections[i].the_bfd_section->name))
d87d7b10 587 {
211b564e
PS
588 exec_ops.to_sections[i].addr += vmap->tstart - vmap->tvma;
589 exec_ops.to_sections[i].endaddr += vmap->tstart - vmap->tvma;
d87d7b10 590 }
94d4b713 591 else if (STREQ(".data", exec_ops.to_sections[i].the_bfd_section->name))
d87d7b10 592 {
211b564e
PS
593 exec_ops.to_sections[i].addr += vmap->dstart - vmap->dvma;
594 exec_ops.to_sections[i].endaddr += vmap->dstart - vmap->dvma;
595 }
596 else if (STREQ(".bss", exec_ops.to_sections[i].the_bfd_section->name))
597 {
598 exec_ops.to_sections[i].addr += vmap->dstart - vmap->dvma;
599 exec_ops.to_sections[i].endaddr += vmap->dstart - vmap->dvma;
d87d7b10
SG
600 }
601 }
602}
603\f
604/* xcoff_relocate_symtab - hook for symbol table relocation.
605 also reads shared libraries.. */
606
0c4b30ea 607void
d87d7b10 608xcoff_relocate_symtab (pid)
0c4b30ea 609 unsigned int pid;
d87d7b10
SG
610{
611#define MAX_LOAD_SEGS 64 /* maximum number of load segments */
612
0c4b30ea 613 struct ld_info *ldi;
d87d7b10 614
0c4b30ea 615 ldi = (void *) alloca(MAX_LOAD_SEGS * sizeof (*ldi));
d87d7b10 616
0c4b30ea
SS
617 /* According to my humble theory, AIX has some timing problems and
618 when the user stack grows, kernel doesn't update stack info in time
619 and ptrace calls step on user stack. That is why we sleep here a little,
620 and give kernel to update its internals. */
d87d7b10 621
0c4b30ea 622 usleep (36000);
d87d7b10 623
0c4b30ea
SS
624 errno = 0;
625 ptrace (PT_LDINFO, pid, (PTRACE_ARG3_TYPE) ldi,
626 MAX_LOAD_SEGS * sizeof(*ldi), ldi);
627 if (errno)
628 perror_with_name ("ptrace ldinfo");
d87d7b10 629
0c4b30ea 630 vmap_ldinfo (ldi);
d87d7b10 631
0c4b30ea
SS
632 do {
633 /* We are allowed to assume CORE_ADDR == pointer. This code is
634 native only. */
635 add_text_to_loadinfo ((CORE_ADDR) ldi->ldinfo_textorg,
636 (CORE_ADDR) ldi->ldinfo_dataorg);
637 } while (ldi->ldinfo_next
638 && (ldi = (void *) (ldi->ldinfo_next + (char *) ldi)));
d87d7b10
SG
639
640#if 0
641 /* Now that we've jumbled things around, re-sort them. */
642 sort_minimal_symbols ();
643#endif
644
645 /* relocate the exec and core sections as well. */
646 vmap_exec ();
647}
648\f
649/* Core file stuff. */
650
651/* Relocate symtabs and read in shared library info, based on symbols
652 from the core file. */
0c4b30ea 653
d87d7b10 654void
9137a6f4
PS
655xcoff_relocate_core (target)
656 struct target_ops *target;
d87d7b10
SG
657{
658/* Offset of member MEMBER in a struct of type TYPE. */
659#ifndef offsetof
660#define offsetof(TYPE, MEMBER) ((int) &((TYPE *)0)->MEMBER)
661#endif
662
663/* Size of a struct ld_info except for the variable-length filename. */
664#define LDINFO_SIZE (offsetof (struct ld_info, ldinfo_filename))
665
666 sec_ptr ldinfo_sec;
667 int offset = 0;
668 struct ld_info *ldip;
669 struct vmap *vp;
670
671 /* Allocated size of buffer. */
672 int buffer_size = LDINFO_SIZE;
673 char *buffer = xmalloc (buffer_size);
674 struct cleanup *old = make_cleanup (free_current_contents, &buffer);
675
676 /* FIXME, this restriction should not exist. For now, though I'll
677 avoid coredumps with error() pending a real fix. */
678 if (vmap == NULL)
679 error
680 ("Can't debug a core file without an executable file (on the RS/6000)");
681
682 ldinfo_sec = bfd_get_section_by_name (core_bfd, ".ldinfo");
683 if (ldinfo_sec == NULL)
684 {
0c4b30ea 685 bfd_err:
d87d7b10 686 fprintf_filtered (gdb_stderr, "Couldn't get ldinfo from core file: %s\n",
c4a081e1 687 bfd_errmsg (bfd_get_error ()));
d87d7b10
SG
688 do_cleanups (old);
689 return;
690 }
691 do
692 {
693 int i;
694 int names_found = 0;
695
696 /* Read in everything but the name. */
697 if (bfd_get_section_contents (core_bfd, ldinfo_sec, buffer,
698 offset, LDINFO_SIZE) == 0)
699 goto bfd_err;
700
701 /* Now the name. */
702 i = LDINFO_SIZE;
703 do
704 {
705 if (i == buffer_size)
706 {
707 buffer_size *= 2;
708 buffer = xrealloc (buffer, buffer_size);
709 }
710 if (bfd_get_section_contents (core_bfd, ldinfo_sec, &buffer[i],
711 offset + i, 1) == 0)
712 goto bfd_err;
713 if (buffer[i++] == '\0')
714 ++names_found;
715 } while (names_found < 2);
716
0c4b30ea 717 ldip = (struct ld_info *) buffer;
d87d7b10
SG
718
719 /* Can't use a file descriptor from the core file; need to open it. */
720 ldip->ldinfo_fd = -1;
721
722 /* The first ldinfo is for the exec file, allocated elsewhere. */
723 if (offset == 0)
724 vp = vmap;
725 else
726 vp = add_vmap (ldip);
727
728 offset += ldip->ldinfo_next;
729
730 /* We can assume pointer == CORE_ADDR, this code is native only. */
731 vp->tstart = (CORE_ADDR) ldip->ldinfo_textorg;
732 vp->tend = vp->tstart + ldip->ldinfo_textsize;
733 vp->dstart = (CORE_ADDR) ldip->ldinfo_dataorg;
734 vp->dend = vp->dstart + ldip->ldinfo_datasize;
735
211b564e
PS
736 /* The run time loader maps the file header in addition to the text
737 section and returns a pointer to the header in ldinfo_textorg.
738 Adjust the text start address to point to the real start address
739 of the text section. */
740 vp->tstart += vp->toffs;
d87d7b10
SG
741
742 /* Unless this is the exec file,
743 add our sections to the section table for the core target. */
744 if (vp != vmap)
745 {
746 int count;
747 struct section_table *stp;
148070cc
JL
748 int update_coreops;
749
750 /* We must update the to_sections field in the core_ops structure
751 now to avoid dangling pointer dereferences. */
09af5868 752 update_coreops = core_ops.to_sections == target->to_sections;
d87d7b10 753
9137a6f4 754 count = target->to_sections_end - target->to_sections;
d87d7b10 755 count += 2;
9137a6f4
PS
756 target->to_sections = (struct section_table *)
757 xrealloc (target->to_sections,
d87d7b10 758 sizeof (struct section_table) * count);
9137a6f4 759 target->to_sections_end = target->to_sections + count;
148070cc
JL
760
761 /* Update the to_sections field in the core_ops structure
762 if needed. */
763 if (update_coreops)
764 {
765 core_ops.to_sections = target->to_sections;
766 core_ops.to_sections_end = target->to_sections_end;
767 }
9137a6f4 768 stp = target->to_sections_end - 2;
d87d7b10 769
d87d7b10 770 stp->bfd = vp->bfd;
94d4b713 771 stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".text");
211b564e
PS
772 stp->addr = vp->tstart;
773 stp->endaddr = vp->tend;
d87d7b10
SG
774 stp++;
775
776 stp->bfd = vp->bfd;
94d4b713 777 stp->the_bfd_section = bfd_get_section_by_name (stp->bfd, ".data");
211b564e
PS
778 stp->addr = vp->dstart;
779 stp->endaddr = vp->dend;
d87d7b10
SG
780 }
781
782 vmap_symtab (vp);
783
784 add_text_to_loadinfo ((CORE_ADDR)ldip->ldinfo_textorg,
785 (CORE_ADDR)ldip->ldinfo_dataorg);
786 } while (ldip->ldinfo_next != 0);
787 vmap_exec ();
e2adc41a 788 breakpoint_re_set ();
d87d7b10
SG
789 do_cleanups (old);
790}
7531f36e
FF
791
792int
793kernel_u_size ()
794{
795 return (sizeof (struct user));
796}
797
a1df8e78
FF
798\f
799/* Register that we are able to handle rs6000 core file formats. */
800
801static struct core_fns rs6000_core_fns =
802{
803 bfd_target_coff_flavour,
804 fetch_core_registers,
805 NULL
806};
807
808void
809_initialize_core_rs6000 ()
810{
062cb0d3
FF
811 /* For native configurations, where this module is included, inform
812 the xcoffsolib module where it can find the function for symbol table
813 relocation at runtime. */
814 xcoff_relocate_symtab_hook = &xcoff_relocate_symtab;
a1df8e78
FF
815 add_core_fns (&rs6000_core_fns);
816}
This page took 0.304577 seconds and 4 git commands to generate.