]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/core-aout.c
2004-07-21 Andrew Cagney <cagney@gnu.org>
[thirdparty/binutils-gdb.git] / gdb / core-aout.c
CommitLineData
c906108c 1/* Extract registers from a "standard" core file, for GDB.
b6ba6518
KB
2 Copyright 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
3 1999, 2000, 2001 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b
JM
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22/* Typically used on systems that have a.out format executables.
23 corefile.c is supposed to contain the more machine-independent
24 aspects of reading registers from core files, while this file is
25 more machine specific. */
26
27#include "defs.h"
28
29#ifdef HAVE_PTRACE_H
c5aa993b 30#include <ptrace.h>
c906108c 31#else
c5aa993b
JM
32#ifdef HAVE_SYS_PTRACE_H
33#include <sys/ptrace.h>
34#endif
c906108c
SS
35#endif
36
37#include <sys/types.h>
38#include <sys/param.h>
39#include "gdbcore.h"
23a6d369 40#include "value.h"
4e052eda 41#include "regcache.h"
c906108c
SS
42
43/* These are needed on various systems to expand REGISTER_U_ADDR. */
44#ifndef USG
4b14d3e4 45#include "gdb_dirent.h"
c906108c
SS
46#include <sys/file.h>
47#include "gdb_stat.h"
48#include <sys/user.h>
49#endif
50
51#ifndef CORE_REGISTER_ADDR
52#define CORE_REGISTER_ADDR(regno, regptr) register_addr(regno, regptr)
53#endif /* CORE_REGISTER_ADDR */
54
55#ifdef NEED_SYS_CORE_H
56#include <sys/core.h>
57#endif
58
a14ed312 59static void fetch_core_registers (char *, unsigned, int, CORE_ADDR);
c906108c 60
a14ed312 61void _initialize_core_aout (void);
c906108c
SS
62
63/* Extract the register values out of the core file and store
64 them where `read_register' will find them.
65
66 CORE_REG_SECT points to the register values themselves, read into memory.
67 CORE_REG_SIZE is the size of that area.
68 WHICH says which set of registers we are handling (0 = int, 2 = float
c5aa993b 69 on machines where they are discontiguous).
c906108c 70 REG_ADDR is the offset from u.u_ar0 to the register values relative to
c5aa993b
JM
71 core_reg_sect. This is used with old-fashioned core files to
72 locate the registers in a large upage-plus-stack ".reg" section.
73 Original upage address X is at location core_reg_sect+x+reg_addr.
c906108c
SS
74 */
75
76static void
fba45db2
KB
77fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
78 CORE_ADDR reg_addr)
c906108c
SS
79{
80 int regno;
81 CORE_ADDR addr;
82 int bad_reg = -1;
c5aa993b 83 CORE_ADDR reg_ptr = -reg_addr; /* Original u.u_ar0 is -reg_addr. */
a728f042 84 int numregs = NUM_REGS;
c906108c
SS
85
86 /* If u.u_ar0 was an absolute address in the core file, relativize it now,
87 so we can use it as an offset into core_reg_sect. When we're done,
88 "register 0" will be at core_reg_sect+reg_ptr, and we can use
89 CORE_REGISTER_ADDR to offset to the other registers. If this is a modern
90 core file without a upage, reg_ptr will be zero and this is all a big
91 NOP. */
92 if (reg_ptr > core_reg_size)
93 reg_ptr -= KERNEL_U_ADDR;
94
95 for (regno = 0; regno < numregs; regno++)
96 {
97 addr = CORE_REGISTER_ADDR (regno, reg_ptr);
98 if (addr >= core_reg_size
99 && bad_reg < 0)
100 bad_reg = regno;
c5aa993b 101 else
23a6d369 102 regcache_raw_supply (current_regcache, regno, core_reg_sect + addr);
c906108c
SS
103 }
104
105 if (bad_reg >= 0)
106 error ("Register %s not found in core file.", REGISTER_NAME (bad_reg));
107}
108
109
110#ifdef REGISTER_U_ADDR
111
112/* Return the address in the core dump or inferior of register REGNO.
113 BLOCKEND is the address of the end of the user structure. */
114
115CORE_ADDR
fba45db2 116register_addr (int regno, CORE_ADDR blockend)
c906108c
SS
117{
118 CORE_ADDR addr;
119
a728f042 120 if (regno < 0 || regno >= NUM_REGS)
c906108c
SS
121 error ("Invalid register number %d.", regno);
122
123 REGISTER_U_ADDR (addr, blockend, regno);
124
125 return addr;
126}
127
128#endif /* REGISTER_U_ADDR */
c906108c 129\f
c5aa993b 130
c906108c
SS
131/* Register that we are able to handle aout (trad-core) file formats. */
132
133static struct core_fns aout_core_fns =
134{
2acceee2
JM
135 bfd_target_unknown_flavour, /* core_flavour */
136 default_check_format, /* check_format */
137 default_core_sniffer, /* core_sniffer */
138 fetch_core_registers, /* core_read_registers */
139 NULL /* next */
c906108c
SS
140};
141
142void
fba45db2 143_initialize_core_aout (void)
c906108c 144{
00e32a35 145 deprecated_add_core_fns (&aout_core_fns);
c906108c 146}