xref: /openbsd-src/gnu/usr.bin/binutils/gdb/core-regset.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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 (&regset_core_fns);
119e93f7393Sniklas }
120