1e93f7393Sniklas /* Machine independent GDB support for core files on systems using "regsets".
2b725ae77Skettenis
3b725ae77Skettenis Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2003
4b725ae77Skettenis Free Software Foundation, Inc.
5e93f7393Sniklas
6e93f7393Sniklas This file is part of GDB.
7e93f7393Sniklas
8e93f7393Sniklas This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas it under the terms of the GNU General Public License as published by
10e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas (at your option) any later version.
12e93f7393Sniklas
13e93f7393Sniklas This program is distributed in the hope that it will be useful,
14e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16e93f7393Sniklas GNU General Public License for more details.
17e93f7393Sniklas
18e93f7393Sniklas You should have received a copy of the GNU General Public License
19e93f7393Sniklas along with this program; if not, write to the Free Software
20b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis Boston, MA 02111-1307, USA. */
22e93f7393Sniklas
23b725ae77Skettenis /* This file is used by most systems that use ELF for their core
24b725ae77Skettenis dumps. This includes most systems that have SVR4-ish variant of
25b725ae77Skettenis /proc. For these systems, the registers are laid out the same way
26b725ae77Skettenis in core files as in the gregset_t and fpregset_t structures that
27b725ae77Skettenis are used in the interaction with /proc (Irix 4 is an exception and
28b725ae77Skettenis therefore doesn't use this file). Quite a few systems without a
29b725ae77Skettenis SVR4-ish /proc define these structures too, and can make use of
30b725ae77Skettenis this code too. */
31e93f7393Sniklas
32e93f7393Sniklas #include "defs.h"
33b725ae77Skettenis #include "command.h"
34b725ae77Skettenis #include "gdbcore.h"
35b725ae77Skettenis #include "inferior.h"
36b725ae77Skettenis #include "target.h"
37e93f7393Sniklas
38b725ae77Skettenis #include <fcntl.h>
39b725ae77Skettenis #include <errno.h>
40b725ae77Skettenis #include "gdb_string.h"
41e93f7393Sniklas #include <time.h>
42e93f7393Sniklas #ifdef HAVE_SYS_PROCFS_H
43e93f7393Sniklas #include <sys/procfs.h>
44e93f7393Sniklas #endif
45e93f7393Sniklas
46b725ae77Skettenis /* Prototypes for supply_gregset etc. */
47b725ae77Skettenis #include "gregset.h"
48e93f7393Sniklas
49b725ae77Skettenis /* Provide registers to GDB from a core file.
50e93f7393Sniklas
51b725ae77Skettenis CORE_REG_SECT points to an array of bytes, which are the contents
52b725ae77Skettenis of a `note' from a core file which BFD thinks might contain
53b725ae77Skettenis register contents. CORE_REG_SIZE is its size.
54e93f7393Sniklas
55b725ae77Skettenis WHICH says which register set corelow suspects this is:
56b725ae77Skettenis 0 --- the general-purpose register set, in gregset_t format
57b725ae77Skettenis 2 --- the floating-point register set, in fpregset_t format
58e93f7393Sniklas
59b725ae77Skettenis REG_ADDR is ignored. */
60e93f7393Sniklas
61e93f7393Sniklas static void
fetch_core_registers(char * core_reg_sect,unsigned core_reg_size,int which,CORE_ADDR reg_addr)62b725ae77Skettenis fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
63b725ae77Skettenis CORE_ADDR reg_addr)
64e93f7393Sniklas {
65b725ae77Skettenis gdb_gregset_t gregset;
66b725ae77Skettenis gdb_fpregset_t fpregset;
67e93f7393Sniklas
68b725ae77Skettenis switch (which)
69e93f7393Sniklas {
70b725ae77Skettenis case 0:
71e93f7393Sniklas if (core_reg_size != sizeof (gregset))
72b725ae77Skettenis warning ("Wrong size gregset in core file.");
73e93f7393Sniklas else
74e93f7393Sniklas {
75b725ae77Skettenis memcpy (&gregset, core_reg_sect, sizeof (gregset));
76e93f7393Sniklas supply_gregset (&gregset);
77e93f7393Sniklas }
78b725ae77Skettenis break;
79b725ae77Skettenis
80b725ae77Skettenis case 2:
81e93f7393Sniklas if (core_reg_size != sizeof (fpregset))
82b725ae77Skettenis warning ("Wrong size fpregset in core file.");
83e93f7393Sniklas else
84e93f7393Sniklas {
85b725ae77Skettenis memcpy (&fpregset, core_reg_sect, sizeof (fpregset));
86b725ae77Skettenis if (FP0_REGNUM >= 0)
87e93f7393Sniklas supply_fpregset (&fpregset);
88e93f7393Sniklas }
89b725ae77Skettenis break;
90e93f7393Sniklas
91b725ae77Skettenis default:
92b725ae77Skettenis /* We've covered all the kinds of registers we know about here,
93b725ae77Skettenis so this must be something we wouldn't know what to do with
94b725ae77Skettenis anyway. Just ignore it. */
95b725ae77Skettenis break;
96b725ae77Skettenis }
97b725ae77Skettenis }
98e93f7393Sniklas
99b725ae77Skettenis
100b725ae77Skettenis /* Register that we are able to handle ELF core file formats using
101b725ae77Skettenis standard procfs "regset" structures. */
102e93f7393Sniklas
103e93f7393Sniklas static struct core_fns regset_core_fns =
104e93f7393Sniklas {
105b725ae77Skettenis bfd_target_elf_flavour, /* core_flavour */
106b725ae77Skettenis default_check_format, /* check_format */
107b725ae77Skettenis default_core_sniffer, /* core_sniffer */
108b725ae77Skettenis fetch_core_registers, /* core_read_registers */
109b725ae77Skettenis NULL /* next */
110e93f7393Sniklas };
111e93f7393Sniklas
112b725ae77Skettenis /* Provide a prototype to silence -Wmissing-prototypes. */
113b725ae77Skettenis extern void _initialize_core_regset (void);
114b725ae77Skettenis
115e93f7393Sniklas void
_initialize_core_regset(void)116b725ae77Skettenis _initialize_core_regset (void)
117e93f7393Sniklas {
118*63addd46Skettenis deprecated_add_core_fns (®set_core_fns);
119e93f7393Sniklas }
120