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