]> Git Repo - binutils.git/blame - gdb/corelow.c
* bfd-target.c (target_bfd_reopen): Update.
[binutils.git] / gdb / corelow.c
CommitLineData
c906108c 1/* Core dump and executable file functions below target vector, for GDB.
4646aa9d 2
0b302171
JB
3 Copyright (C) 1986-1987, 1989, 1991-2001, 2003-2012 Free Software
4 Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
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
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
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.
c906108c 17
c5aa993b 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/>. */
c906108c
SS
20
21#include "defs.h"
0e24ac5d 22#include "arch-utils.h"
c906108c
SS
23#include "gdb_string.h"
24#include <errno.h>
25#include <signal.h>
26#include <fcntl.h>
fc24370e
MS
27#ifdef HAVE_SYS_FILE_H
28#include <sys/file.h> /* needed for F_OK and friends */
29#endif
c5aa993b 30#include "frame.h" /* required by inferior.h */
c906108c
SS
31#include "inferior.h"
32#include "symtab.h"
33#include "command.h"
34#include "bfd.h"
35#include "target.h"
36#include "gdbcore.h"
37#include "gdbthread.h"
4e052eda 38#include "regcache.h"
0e24ac5d 39#include "regset.h"
990f9fe3 40#include "symfile.h"
4646aa9d 41#include "exec.h"
dbda9972 42#include "readline/readline.h"
0e24ac5d 43#include "gdb_assert.h"
60250e8b 44#include "exceptions.h"
a77053c2 45#include "solib.h"
f90c07ac 46#include "filenames.h"
6c95b8df 47#include "progspace.h"
516ba659 48#include "objfiles.h"
cbb099e8 49#include "gdb_bfd.h"
8e860359 50
ee28ca0f
AC
51#ifndef O_LARGEFILE
52#define O_LARGEFILE 0
53#endif
54
00e32a35
AC
55/* List of all available core_fns. On gdb startup, each core file
56 register reader calls deprecated_add_core_fns() to register
57 information on each core format it is prepared to read. */
c906108c
SS
58
59static struct core_fns *core_file_fns = NULL;
60
aff410f1
MS
61/* The core_fns for a core file handler that is prepared to read the
62 core file currently open on core_bfd. */
2acceee2
JM
63
64static struct core_fns *core_vec = NULL;
65
0e24ac5d
MK
66/* FIXME: kettenis/20031023: Eventually this variable should
67 disappear. */
68
69struct gdbarch *core_gdbarch = NULL;
70
07b82ea5
PA
71/* Per-core data. Currently, only the section table. Note that these
72 target sections are *not* mapped in the current address spaces' set
73 of target sections --- those should come only from pure executable
74 or shared library bfds. The core bfd sections are an
75 implementation detail of the core target, just like ptrace is for
76 unix child targets. */
77static struct target_section_table *core_data;
78
a14ed312 79static void core_files_info (struct target_ops *);
c906108c 80
a14ed312 81static struct core_fns *sniff_core_bfd (bfd *);
2acceee2 82
020cc13c 83static int gdb_check_format (bfd *);
2acceee2 84
a14ed312 85static void core_open (char *, int);
c906108c 86
136d6dae 87static void core_detach (struct target_ops *ops, char *, int);
c906108c 88
a14ed312 89static void core_close (int);
c906108c 90
74b7792f
AC
91static void core_close_cleanup (void *ignore);
92
4efb68b1 93static void add_to_thread_list (bfd *, asection *, void *);
c906108c 94
a14ed312 95static void init_core_ops (void);
c906108c 96
a14ed312 97void _initialize_corelow (void);
c906108c 98
c0edd9ed 99static struct target_ops core_ops;
c906108c 100
7f9f62ba
PA
101/* An arbitrary identifier for the core inferior. */
102#define CORELOW_PID 1
103
aff410f1
MS
104/* Link a new core_fns into the global core_file_fns list. Called on
105 gdb startup by the _initialize routine in each core file register
b021a221 106 reader, to register information about each format the reader is
aff410f1 107 prepared to handle. */
c906108c
SS
108
109void
00e32a35 110deprecated_add_core_fns (struct core_fns *cf)
c906108c 111{
c5aa993b 112 cf->next = core_file_fns;
c906108c
SS
113 core_file_fns = cf;
114}
115
2acceee2
JM
116/* The default function that core file handlers can use to examine a
117 core file BFD and decide whether or not to accept the job of
aff410f1 118 reading the core file. */
2acceee2
JM
119
120int
fba45db2 121default_core_sniffer (struct core_fns *our_fns, bfd *abfd)
2acceee2
JM
122{
123 int result;
124
125 result = (bfd_get_flavour (abfd) == our_fns -> core_flavour);
126 return (result);
127}
128
129/* Walk through the list of core functions to find a set that can
06b9f45f 130 handle the core file open on ABFD. Returns pointer to set that is
aff410f1 131 selected. */
2acceee2
JM
132
133static struct core_fns *
fba45db2 134sniff_core_bfd (bfd *abfd)
2acceee2
JM
135{
136 struct core_fns *cf;
137 struct core_fns *yummy = NULL;
138 int matches = 0;;
139
aff410f1
MS
140 /* Don't sniff if we have support for register sets in
141 CORE_GDBARCH. */
0e24ac5d
MK
142 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
143 return NULL;
144
2acceee2
JM
145 for (cf = core_file_fns; cf != NULL; cf = cf->next)
146 {
147 if (cf->core_sniffer (cf, abfd))
148 {
149 yummy = cf;
150 matches++;
151 }
152 }
153 if (matches > 1)
154 {
8a3fe4f8 155 warning (_("\"%s\": ambiguous core format, %d handlers match"),
2acceee2
JM
156 bfd_get_filename (abfd), matches);
157 }
158 else if (matches == 0)
06b9f45f
JK
159 error (_("\"%s\": no core file handler recognizes format"),
160 bfd_get_filename (abfd));
161
2acceee2
JM
162 return (yummy);
163}
164
165/* The default is to reject every core file format we see. Either
166 BFD has to recognize it, or we have to provide a function in the
aff410f1 167 core file handler that recognizes it. */
2acceee2
JM
168
169int
fba45db2 170default_check_format (bfd *abfd)
2acceee2
JM
171{
172 return (0);
173}
174
aff410f1 175/* Attempt to recognize core file formats that BFD rejects. */
2acceee2 176
020cc13c 177static int
fba45db2 178gdb_check_format (bfd *abfd)
2acceee2
JM
179{
180 struct core_fns *cf;
181
182 for (cf = core_file_fns; cf != NULL; cf = cf->next)
183 {
184 if (cf->check_format (abfd))
185 {
81a9a963 186 return (1);
2acceee2
JM
187 }
188 }
81a9a963 189 return (0);
2acceee2 190}
c906108c 191
aff410f1
MS
192/* Discard all vestiges of any previous core file and mark data and
193 stack spaces as empty. */
c906108c 194
c906108c 195static void
fba45db2 196core_close (int quitting)
c906108c
SS
197{
198 char *name;
199
200 if (core_bfd)
201 {
959b8724 202 int pid = ptid_get_pid (inferior_ptid);
aff410f1
MS
203 inferior_ptid = null_ptid; /* Avoid confusion from thread
204 stuff. */
06b9f45f
JK
205 if (pid != 0)
206 exit_inferior_silent (pid);
c906108c 207
aff410f1
MS
208 /* Clear out solib state while the bfd is still open. See
209 comments in clear_solib in solib.c. */
a77053c2 210 clear_solib ();
7a292a7a 211
06b9f45f
JK
212 if (core_data)
213 {
214 xfree (core_data->sections);
215 xfree (core_data);
216 core_data = NULL;
217 }
07b82ea5 218
cbb099e8 219 gdb_bfd_unref (core_bfd);
c906108c 220 core_bfd = NULL;
c906108c 221 }
2acceee2 222 core_vec = NULL;
0e24ac5d 223 core_gdbarch = NULL;
c906108c
SS
224}
225
74b7792f
AC
226static void
227core_close_cleanup (void *ignore)
228{
229 core_close (0/*ignored*/);
230}
231
aff410f1
MS
232/* Look for sections whose names start with `.reg/' so that we can
233 extract the list of threads in a core file. */
c906108c
SS
234
235static void
4efb68b1 236add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg)
c906108c 237{
0de3b513 238 ptid_t ptid;
3cdd9356
PA
239 int core_tid;
240 int pid, lwpid;
c906108c 241 asection *reg_sect = (asection *) reg_sect_arg;
88f38a04
PA
242 int fake_pid_p = 0;
243 struct inferior *inf;
c906108c
SS
244
245 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
246 return;
247
3cdd9356 248 core_tid = atoi (bfd_section_name (abfd, asect) + 5);
c906108c 249
261b8d08
PA
250 pid = bfd_core_file_pid (core_bfd);
251 if (pid == 0)
3cdd9356 252 {
88f38a04 253 fake_pid_p = 1;
3cdd9356 254 pid = CORELOW_PID;
3cdd9356 255 }
0de3b513 256
261b8d08
PA
257 lwpid = core_tid;
258
88f38a04
PA
259 inf = current_inferior ();
260 if (inf->pid == 0)
261 {
262 inferior_appeared (inf, pid);
263 inf->fake_pid_p = fake_pid_p;
264 }
3cdd9356
PA
265
266 ptid = ptid_build (pid, lwpid, 0);
267
268 add_thread (ptid);
c906108c
SS
269
270/* Warning, Will Robinson, looking at BFD private data! */
271
272 if (reg_sect != NULL
aff410f1
MS
273 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
274 inferior_ptid = ptid; /* Yes, make it current. */
c906108c
SS
275}
276
277/* This routine opens and sets up the core file bfd. */
278
279static void
fba45db2 280core_open (char *filename, int from_tty)
c906108c
SS
281{
282 const char *p;
283 int siggy;
284 struct cleanup *old_chain;
285 char *temp;
286 bfd *temp_bfd;
c906108c 287 int scratch_chan;
ee28ca0f 288 int flags;
8e7b59a5 289 volatile struct gdb_exception except;
c906108c
SS
290
291 target_preopen (from_tty);
292 if (!filename)
293 {
8a3fe4f8 294 if (core_bfd)
3e43a32a
MS
295 error (_("No core file specified. (Use `detach' "
296 "to stop debugging a core file.)"));
8a3fe4f8
AC
297 else
298 error (_("No core file specified."));
c906108c
SS
299 }
300
301 filename = tilde_expand (filename);
aff410f1 302 if (!IS_ABSOLUTE_PATH (filename))
c906108c 303 {
aff410f1
MS
304 temp = concat (current_directory, "/",
305 filename, (char *) NULL);
b8c9b27d 306 xfree (filename);
c906108c
SS
307 filename = temp;
308 }
309
b8c9b27d 310 old_chain = make_cleanup (xfree, filename);
c906108c 311
ee28ca0f
AC
312 flags = O_BINARY | O_LARGEFILE;
313 if (write_files)
314 flags |= O_RDWR;
315 else
316 flags |= O_RDONLY;
317 scratch_chan = open (filename, flags, 0);
c906108c
SS
318 if (scratch_chan < 0)
319 perror_with_name (filename);
320
520b0001
TT
321 temp_bfd = bfd_fopen (filename, gnutarget,
322 write_files ? FOPEN_RUB : FOPEN_RB,
323 scratch_chan);
324 gdb_bfd_ref (temp_bfd);
c906108c
SS
325 if (temp_bfd == NULL)
326 perror_with_name (filename);
327
a4453b7e
TT
328 gdb_bfd_stash_filename (temp_bfd);
329
5aafa1cc
PM
330 if (!bfd_check_format (temp_bfd, bfd_core)
331 && !gdb_check_format (temp_bfd))
c906108c
SS
332 {
333 /* Do it after the err msg */
aff410f1
MS
334 /* FIXME: should be checking for errors from bfd_close (for one
335 thing, on error it does not free all the storage associated
336 with the bfd). */
f9a062ff 337 make_cleanup_bfd_unref (temp_bfd);
8a3fe4f8 338 error (_("\"%s\" is not a core dump: %s"),
c906108c
SS
339 filename, bfd_errmsg (bfd_get_error ()));
340 }
341
aff410f1
MS
342 /* Looks semi-reasonable. Toss the old core file and work on the
343 new. */
c906108c 344
a4453b7e 345 do_cleanups (old_chain);
c906108c
SS
346 unpush_target (&core_ops);
347 core_bfd = temp_bfd;
74b7792f 348 old_chain = make_cleanup (core_close_cleanup, 0 /*ignore*/);
c906108c 349
0e24ac5d
MK
350 /* FIXME: kettenis/20031023: This is very dangerous. The
351 CORE_GDBARCH that results from this call may very well be
352 different from CURRENT_GDBARCH. However, its methods may only
353 work if it is selected as the current architecture, because they
354 rely on swapped data (see gdbarch.c). We should get rid of that
355 swapped data. */
356 core_gdbarch = gdbarch_from_bfd (core_bfd);
357
2acceee2
JM
358 /* Find a suitable core file handler to munch on core_bfd */
359 core_vec = sniff_core_bfd (core_bfd);
360
c906108c
SS
361 validate_files ();
362
07b82ea5
PA
363 core_data = XZALLOC (struct target_section_table);
364
c906108c 365 /* Find the data section */
07b82ea5 366 if (build_section_table (core_bfd,
aff410f1
MS
367 &core_data->sections,
368 &core_data->sections_end))
8a3fe4f8 369 error (_("\"%s\": Can't find sections: %s"),
c906108c
SS
370 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
371
2f1b5984
MK
372 /* If we have no exec file, try to set the architecture from the
373 core file. We don't do this unconditionally since an exec file
374 typically contains more information that helps us determine the
375 architecture than a core file. */
376 if (!exec_bfd)
377 set_gdbarch_from_file (core_bfd);
cbda0a99 378
87ab71f0 379 push_target (&core_ops);
c906108c
SS
380 discard_cleanups (old_chain);
381
0de3b513
PA
382 /* Do this before acknowledging the inferior, so if
383 post_create_inferior throws (can happen easilly if you're loading
384 a core file with the wrong exec), we aren't left with threads
385 from the previous inferior. */
386 init_thread_list ();
387
3cdd9356 388 inferior_ptid = null_ptid;
0de3b513 389
739fc47a
PA
390 /* Need to flush the register cache (and the frame cache) from a
391 previous debug session. If inferior_ptid ends up the same as the
392 last debug session --- e.g., b foo; run; gcore core1; step; gcore
393 core2; core core1; core core2 --- then there's potential for
394 get_current_regcache to return the cached regcache of the
395 previous session, and the frame cache being stale. */
396 registers_changed ();
397
0de3b513
PA
398 /* Build up thread list from BFD sections, and possibly set the
399 current thread to the .reg/NN section matching the .reg
aff410f1 400 section. */
0de3b513
PA
401 bfd_map_over_sections (core_bfd, add_to_thread_list,
402 bfd_get_section_by_name (core_bfd, ".reg"));
403
3cdd9356
PA
404 if (ptid_equal (inferior_ptid, null_ptid))
405 {
406 /* Either we found no .reg/NN section, and hence we have a
407 non-threaded core (single-threaded, from gdb's perspective),
408 or for some reason add_to_thread_list couldn't determine
409 which was the "main" thread. The latter case shouldn't
410 usually happen, but we're dealing with input here, which can
411 always be broken in different ways. */
412 struct thread_info *thread = first_thread_of_process (-1);
c5504eaf 413
3cdd9356
PA
414 if (thread == NULL)
415 {
c45ceae0 416 inferior_appeared (current_inferior (), CORELOW_PID);
3cdd9356
PA
417 inferior_ptid = pid_to_ptid (CORELOW_PID);
418 add_thread_silent (inferior_ptid);
419 }
420 else
421 switch_to_thread (thread->ptid);
422 }
423
959b8724
PA
424 post_create_inferior (&core_ops, from_tty);
425
0de3b513
PA
426 /* Now go through the target stack looking for threads since there
427 may be a thread_stratum target loaded on top of target core by
428 now. The layer above should claim threads found in the BFD
429 sections. */
8e7b59a5
KS
430 TRY_CATCH (except, RETURN_MASK_ERROR)
431 {
432 target_find_new_threads ();
433 }
434
435 if (except.reason < 0)
436 exception_print (gdb_stderr, except);
0de3b513 437
c906108c
SS
438 p = bfd_core_file_failing_command (core_bfd);
439 if (p)
a3f17187 440 printf_filtered (_("Core was generated by `%s'.\n"), p);
c906108c
SS
441
442 siggy = bfd_core_file_failing_signal (core_bfd);
443 if (siggy > 0)
423ec54c 444 {
22203bbf 445 /* If we don't have a CORE_GDBARCH to work with, assume a native
1f8cf220
PA
446 core (map gdb_signal from host signals). If we do have
447 CORE_GDBARCH to work with, but no gdb_signal_from_target
448 implementation for that gdbarch, as a fallback measure,
449 assume the host signal mapping. It'll be correct for native
450 cores, but most likely incorrect for cross-cores. */
2ea28649 451 enum gdb_signal sig = (core_gdbarch != NULL
1f8cf220
PA
452 && gdbarch_gdb_signal_from_target_p (core_gdbarch)
453 ? gdbarch_gdb_signal_from_target (core_gdbarch,
454 siggy)
455 : gdb_signal_from_host (siggy));
423ec54c 456
aff410f1 457 printf_filtered (_("Program terminated with signal %d, %s.\n"),
2ea28649 458 siggy, gdb_signal_to_string (sig));
423ec54c 459 }
c906108c 460
87ab71f0
PA
461 /* Fetch all registers from core file. */
462 target_fetch_registers (get_current_regcache (), -1);
c906108c 463
87ab71f0
PA
464 /* Now, set up the frame cache, and print the top of stack. */
465 reinit_frame_cache ();
466 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC);
c906108c
SS
467}
468
469static void
136d6dae 470core_detach (struct target_ops *ops, char *args, int from_tty)
c906108c
SS
471{
472 if (args)
8a3fe4f8 473 error (_("Too many arguments"));
136d6dae 474 unpush_target (ops);
c906108c
SS
475 reinit_frame_cache ();
476 if (from_tty)
a3f17187 477 printf_filtered (_("No core file now.\n"));
c906108c
SS
478}
479
07b82ea5
PA
480#ifdef DEPRECATED_IBM6000_TARGET
481
482/* Resize the core memory's section table, by NUM_ADDED. Returns a
483 pointer into the first new slot. This will not be necessary when
484 the rs6000 target is converted to use the standard solib
485 framework. */
486
487struct target_section *
488deprecated_core_resize_section_table (int num_added)
489{
490 int old_count;
491
492 old_count = resize_section_table (core_data, num_added);
493 return core_data->sections + old_count;
494}
495
496#endif
de57eccd
JM
497
498/* Try to retrieve registers from a section in core_bfd, and supply
499 them to core_vec->core_read_registers, as the register set numbered
500 WHICH.
501
0de3b513
PA
502 If inferior_ptid's lwp member is zero, do the single-threaded
503 thing: look for a section named NAME. If inferior_ptid's lwp
504 member is non-zero, do the multi-threaded thing: look for a section
505 named "NAME/LWP", where LWP is the shortest ASCII decimal
506 representation of inferior_ptid's lwp member.
de57eccd
JM
507
508 HUMAN_NAME is a human-readable name for the kind of registers the
509 NAME section contains, for use in error messages.
510
511 If REQUIRED is non-zero, print an error if the core file doesn't
aff410f1
MS
512 have a section by the appropriate name. Otherwise, just do
513 nothing. */
de57eccd
JM
514
515static void
9eefc95f 516get_core_register_section (struct regcache *regcache,
1b1818e4 517 const char *name,
de57eccd 518 int which,
1b1818e4 519 const char *human_name,
de57eccd
JM
520 int required)
521{
3ecda457 522 static char *section_name = NULL;
7be0c536 523 struct bfd_section *section;
de57eccd
JM
524 bfd_size_type size;
525 char *contents;
526
3ecda457 527 xfree (section_name);
959b8724 528
261b8d08 529 if (ptid_get_lwp (inferior_ptid))
aff410f1
MS
530 section_name = xstrprintf ("%s/%ld", name,
531 ptid_get_lwp (inferior_ptid));
de57eccd 532 else
3ecda457 533 section_name = xstrdup (name);
de57eccd
JM
534
535 section = bfd_get_section_by_name (core_bfd, section_name);
536 if (! section)
537 {
538 if (required)
aff410f1
MS
539 warning (_("Couldn't find %s registers in core file."),
540 human_name);
de57eccd
JM
541 return;
542 }
543
544 size = bfd_section_size (core_bfd, section);
545 contents = alloca (size);
546 if (! bfd_get_section_contents (core_bfd, section, contents,
547 (file_ptr) 0, size))
548 {
8a3fe4f8 549 warning (_("Couldn't read %s registers from `%s' section in core file."),
de57eccd
JM
550 human_name, name);
551 return;
552 }
553
0e24ac5d
MK
554 if (core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
555 {
556 const struct regset *regset;
557
aff410f1
MS
558 regset = gdbarch_regset_from_core_section (core_gdbarch,
559 name, size);
0e24ac5d
MK
560 if (regset == NULL)
561 {
562 if (required)
8a3fe4f8 563 warning (_("Couldn't recognize %s registers in core file."),
0e24ac5d
MK
564 human_name);
565 return;
566 }
567
9eefc95f 568 regset->supply_regset (regset, regcache, -1, contents, size);
0e24ac5d
MK
569 return;
570 }
571
572 gdb_assert (core_vec);
9eefc95f 573 core_vec->core_read_registers (regcache, contents, size, which,
de57eccd
JM
574 ((CORE_ADDR)
575 bfd_section_vma (core_bfd, section)));
576}
577
578
c906108c
SS
579/* Get the registers out of a core file. This is the machine-
580 independent part. Fetch_core_registers is the machine-dependent
aff410f1
MS
581 part, typically implemented in the xm-file for each
582 architecture. */
c906108c
SS
583
584/* We just get all the registers, so we don't use regno. */
585
c906108c 586static void
28439f5e
PA
587get_core_registers (struct target_ops *ops,
588 struct regcache *regcache, int regno)
c906108c 589{
1b1818e4 590 struct core_regset_section *sect_list;
9c5ea4d9 591 int i;
c906108c 592
0e24ac5d
MK
593 if (!(core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch))
594 && (core_vec == NULL || core_vec->core_read_registers == NULL))
c906108c
SS
595 {
596 fprintf_filtered (gdb_stderr,
c5aa993b 597 "Can't fetch registers from this type of core file\n");
c906108c
SS
598 return;
599 }
600
1b1818e4
UW
601 sect_list = gdbarch_core_regset_sections (get_regcache_arch (regcache));
602 if (sect_list)
603 while (sect_list->sect_name != NULL)
604 {
605 if (strcmp (sect_list->sect_name, ".reg") == 0)
606 get_core_register_section (regcache, sect_list->sect_name,
607 0, sect_list->human_name, 1);
608 else if (strcmp (sect_list->sect_name, ".reg2") == 0)
609 get_core_register_section (regcache, sect_list->sect_name,
610 2, sect_list->human_name, 0);
611 else
612 get_core_register_section (regcache, sect_list->sect_name,
613 3, sect_list->human_name, 0);
614
615 sect_list++;
616 }
617
618 else
619 {
620 get_core_register_section (regcache,
621 ".reg", 0, "general-purpose", 1);
622 get_core_register_section (regcache,
623 ".reg2", 2, "floating-point", 0);
624 }
c906108c 625
ee99023e 626 /* Mark all registers not found in the core as unavailable. */
13b8769f 627 for (i = 0; i < gdbarch_num_regs (get_regcache_arch (regcache)); i++)
ee99023e 628 if (regcache_register_status (regcache, i) == REG_UNKNOWN)
9c5ea4d9 629 regcache_raw_supply (regcache, i, NULL);
c906108c
SS
630}
631
c906108c 632static void
fba45db2 633core_files_info (struct target_ops *t)
c906108c 634{
07b82ea5 635 print_section_info (core_data, core_bfd);
c906108c 636}
e2544d02 637\f
efcbbd14
UW
638struct spuid_list
639{
640 gdb_byte *buf;
641 ULONGEST offset;
642 LONGEST len;
643 ULONGEST pos;
644 ULONGEST written;
645};
646
647static void
648add_to_spuid_list (bfd *abfd, asection *asect, void *list_p)
649{
650 struct spuid_list *list = list_p;
651 enum bfd_endian byte_order
aff410f1 652 = bfd_big_endian (abfd) ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
efcbbd14
UW
653 int fd, pos = 0;
654
655 sscanf (bfd_section_name (abfd, asect), "SPU/%d/regs%n", &fd, &pos);
656 if (pos == 0)
657 return;
658
659 if (list->pos >= list->offset && list->pos + 4 <= list->offset + list->len)
660 {
661 store_unsigned_integer (list->buf + list->pos - list->offset,
662 4, byte_order, fd);
663 list->written += 4;
664 }
665 list->pos += 4;
666}
667
e2544d02
RM
668static LONGEST
669core_xfer_partial (struct target_ops *ops, enum target_object object,
961cb7b5 670 const char *annex, gdb_byte *readbuf,
aff410f1
MS
671 const gdb_byte *writebuf, ULONGEST offset,
672 LONGEST len)
e2544d02
RM
673{
674 switch (object)
675 {
676 case TARGET_OBJECT_MEMORY:
07b82ea5
PA
677 return section_table_xfer_memory_partial (readbuf, writebuf,
678 offset, len,
679 core_data->sections,
680 core_data->sections_end,
681 NULL);
e2544d02
RM
682
683 case TARGET_OBJECT_AUXV:
684 if (readbuf)
685 {
686 /* When the aux vector is stored in core file, BFD
687 represents this with a fake section called ".auxv". */
688
c4c5b7ba 689 struct bfd_section *section;
e2544d02 690 bfd_size_type size;
e2544d02
RM
691
692 section = bfd_get_section_by_name (core_bfd, ".auxv");
693 if (section == NULL)
694 return -1;
695
696 size = bfd_section_size (core_bfd, section);
697 if (offset >= size)
698 return 0;
699 size -= offset;
700 if (size > len)
701 size = len;
403e1656
MK
702 if (size > 0
703 && !bfd_get_section_contents (core_bfd, section, readbuf,
704 (file_ptr) offset, size))
e2544d02 705 {
8a3fe4f8 706 warning (_("Couldn't read NT_AUXV note in core file."));
e2544d02
RM
707 return -1;
708 }
709
710 return size;
711 }
712 return -1;
713
403e1656
MK
714 case TARGET_OBJECT_WCOOKIE:
715 if (readbuf)
716 {
717 /* When the StackGhost cookie is stored in core file, BFD
aff410f1
MS
718 represents this with a fake section called
719 ".wcookie". */
403e1656
MK
720
721 struct bfd_section *section;
722 bfd_size_type size;
403e1656
MK
723
724 section = bfd_get_section_by_name (core_bfd, ".wcookie");
725 if (section == NULL)
726 return -1;
727
728 size = bfd_section_size (core_bfd, section);
729 if (offset >= size)
730 return 0;
731 size -= offset;
732 if (size > len)
733 size = len;
734 if (size > 0
735 && !bfd_get_section_contents (core_bfd, section, readbuf,
736 (file_ptr) offset, size))
737 {
8a3fe4f8 738 warning (_("Couldn't read StackGhost cookie in core file."));
403e1656
MK
739 return -1;
740 }
741
742 return size;
743 }
744 return -1;
745
de584861
PA
746 case TARGET_OBJECT_LIBRARIES:
747 if (core_gdbarch
748 && gdbarch_core_xfer_shared_libraries_p (core_gdbarch))
749 {
750 if (writebuf)
751 return -1;
752 return
753 gdbarch_core_xfer_shared_libraries (core_gdbarch,
754 readbuf, offset, len);
755 }
756 /* FALL THROUGH */
757
efcbbd14
UW
758 case TARGET_OBJECT_SPU:
759 if (readbuf && annex)
760 {
761 /* When the SPU contexts are stored in a core file, BFD
aff410f1
MS
762 represents this with a fake section called
763 "SPU/<annex>". */
efcbbd14
UW
764
765 struct bfd_section *section;
766 bfd_size_type size;
efcbbd14 767 char sectionstr[100];
c5504eaf 768
efcbbd14
UW
769 xsnprintf (sectionstr, sizeof sectionstr, "SPU/%s", annex);
770
771 section = bfd_get_section_by_name (core_bfd, sectionstr);
772 if (section == NULL)
773 return -1;
774
775 size = bfd_section_size (core_bfd, section);
776 if (offset >= size)
777 return 0;
778 size -= offset;
779 if (size > len)
780 size = len;
781 if (size > 0
782 && !bfd_get_section_contents (core_bfd, section, readbuf,
783 (file_ptr) offset, size))
784 {
785 warning (_("Couldn't read SPU section in core file."));
786 return -1;
787 }
788
789 return size;
790 }
791 else if (readbuf)
792 {
793 /* NULL annex requests list of all present spuids. */
794 struct spuid_list list;
c5504eaf 795
efcbbd14
UW
796 list.buf = readbuf;
797 list.offset = offset;
798 list.len = len;
799 list.pos = 0;
800 list.written = 0;
801 bfd_map_over_sections (core_bfd, add_to_spuid_list, &list);
802 return list.written;
803 }
804 return -1;
805
e2544d02
RM
806 default:
807 if (ops->beneath != NULL)
aff410f1
MS
808 return ops->beneath->to_xfer_partial (ops->beneath, object,
809 annex, readbuf,
810 writebuf, offset, len);
e2544d02
RM
811 return -1;
812 }
813}
814
c906108c
SS
815\f
816/* If mourn is being called in all the right places, this could be say
aff410f1
MS
817 `gdb internal error' (since generic_mourn calls
818 breakpoint_init_inferior). */
c906108c
SS
819
820static int
a6d9a66e 821ignore (struct gdbarch *gdbarch, struct bp_target_info *bp_tgt)
c906108c
SS
822{
823 return 0;
824}
825
826
827/* Okay, let's be honest: threads gleaned from a core file aren't
828 exactly lively, are they? On the other hand, if we don't claim
829 that each & every one is alive, then we don't get any of them
830 to appear in an "info thread" command, which is quite a useful
831 behaviour.
c5aa993b 832 */
c906108c 833static int
28439f5e 834core_thread_alive (struct target_ops *ops, ptid_t ptid)
c906108c
SS
835{
836 return 1;
837}
838
4eb0ad19
DJ
839/* Ask the current architecture what it knows about this core file.
840 That will be used, in turn, to pick a better architecture. This
841 wrapper could be avoided if targets got a chance to specialize
842 core_ops. */
843
844static const struct target_desc *
845core_read_description (struct target_ops *target)
846{
a78c2d62 847 if (core_gdbarch && gdbarch_core_read_description_p (core_gdbarch))
aff410f1
MS
848 return gdbarch_core_read_description (core_gdbarch,
849 target, core_bfd);
4eb0ad19
DJ
850
851 return NULL;
852}
853
0de3b513 854static char *
117de6a9 855core_pid_to_str (struct target_ops *ops, ptid_t ptid)
0de3b513
PA
856{
857 static char buf[64];
88f38a04 858 struct inferior *inf;
a5ee0f0c 859 int pid;
0de3b513 860
a5ee0f0c
PA
861 /* The preferred way is to have a gdbarch/OS specific
862 implementation. */
28439f5e
PA
863 if (core_gdbarch
864 && gdbarch_core_pid_to_str_p (core_gdbarch))
a5ee0f0c 865 return gdbarch_core_pid_to_str (core_gdbarch, ptid);
c5504eaf 866
a5ee0f0c
PA
867 /* Otherwise, if we don't have one, we'll just fallback to
868 "process", with normal_pid_to_str. */
28439f5e 869
a5ee0f0c
PA
870 /* Try the LWPID field first. */
871 pid = ptid_get_lwp (ptid);
872 if (pid != 0)
873 return normal_pid_to_str (pid_to_ptid (pid));
874
875 /* Otherwise, this isn't a "threaded" core -- use the PID field, but
876 only if it isn't a fake PID. */
88f38a04
PA
877 inf = find_inferior_pid (ptid_get_pid (ptid));
878 if (inf != NULL && !inf->fake_pid_p)
a5ee0f0c 879 return normal_pid_to_str (ptid);
0de3b513 880
a5ee0f0c
PA
881 /* No luck. We simply don't have a valid PID to print. */
882 xsnprintf (buf, sizeof buf, "<main task>");
0de3b513
PA
883 return buf;
884}
885
c35b1492
PA
886static int
887core_has_memory (struct target_ops *ops)
888{
889 return (core_bfd != NULL);
890}
891
892static int
893core_has_stack (struct target_ops *ops)
894{
895 return (core_bfd != NULL);
896}
897
898static int
899core_has_registers (struct target_ops *ops)
900{
901 return (core_bfd != NULL);
902}
903
c906108c
SS
904/* Fill in core_ops with its defined operations and properties. */
905
906static void
fba45db2 907init_core_ops (void)
c906108c
SS
908{
909 core_ops.to_shortname = "core";
910 core_ops.to_longname = "Local core dump file";
911 core_ops.to_doc =
912 "Use a core file as a target. Specify the filename of the core file.";
913 core_ops.to_open = core_open;
914 core_ops.to_close = core_close;
915 core_ops.to_attach = find_default_attach;
c906108c 916 core_ops.to_detach = core_detach;
c906108c 917 core_ops.to_fetch_registers = get_core_registers;
e2544d02 918 core_ops.to_xfer_partial = core_xfer_partial;
c906108c
SS
919 core_ops.to_files_info = core_files_info;
920 core_ops.to_insert_breakpoint = ignore;
921 core_ops.to_remove_breakpoint = ignore;
922 core_ops.to_create_inferior = find_default_create_inferior;
28439f5e 923 core_ops.to_thread_alive = core_thread_alive;
4eb0ad19 924 core_ops.to_read_description = core_read_description;
0de3b513 925 core_ops.to_pid_to_str = core_pid_to_str;
c0edd9ed 926 core_ops.to_stratum = process_stratum;
c35b1492
PA
927 core_ops.to_has_memory = core_has_memory;
928 core_ops.to_has_stack = core_has_stack;
929 core_ops.to_has_registers = core_has_registers;
c5aa993b 930 core_ops.to_magic = OPS_MAGIC;
c0edd9ed
JK
931
932 if (core_target)
933 internal_error (__FILE__, __LINE__,
934 _("init_core_ops: core target already exists (\"%s\")."),
935 core_target->to_longname);
936 core_target = &core_ops;
c906108c
SS
937}
938
c906108c 939void
fba45db2 940_initialize_corelow (void)
c906108c
SS
941{
942 init_core_ops ();
943
28439f5e 944 add_target (&core_ops);
c906108c 945}
This page took 1.776931 seconds and 4 git commands to generate.