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