]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/core-aout.c
Copyright updates for 2007.
[thirdparty/binutils-gdb.git] / gdb / core-aout.c
CommitLineData
c906108c 1/* Extract registers from a "standard" core file, for GDB.
197e01b6 2 Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998,
6aba47ca 3 1999, 2000, 2001, 2007 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
197e01b6
EZ
19 Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 Boston, MA 02110-1301, 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. */
4b14d3e4 44#include "gdb_dirent.h"
c906108c
SS
45#include <sys/file.h>
46#include "gdb_stat.h"
47#include <sys/user.h>
c906108c
SS
48
49#ifndef CORE_REGISTER_ADDR
50#define CORE_REGISTER_ADDR(regno, regptr) register_addr(regno, regptr)
51#endif /* CORE_REGISTER_ADDR */
52
53#ifdef NEED_SYS_CORE_H
54#include <sys/core.h>
55#endif
56
a14ed312 57static void fetch_core_registers (char *, unsigned, int, CORE_ADDR);
c906108c 58
a14ed312 59void _initialize_core_aout (void);
c906108c
SS
60
61/* Extract the register values out of the core file and store
62 them where `read_register' will find them.
63
64 CORE_REG_SECT points to the register values themselves, read into memory.
65 CORE_REG_SIZE is the size of that area.
66 WHICH says which set of registers we are handling (0 = int, 2 = float
c5aa993b 67 on machines where they are discontiguous).
c906108c 68 REG_ADDR is the offset from u.u_ar0 to the register values relative to
c5aa993b
JM
69 core_reg_sect. This is used with old-fashioned core files to
70 locate the registers in a large upage-plus-stack ".reg" section.
71 Original upage address X is at location core_reg_sect+x+reg_addr.
c906108c
SS
72 */
73
74static void
fba45db2
KB
75fetch_core_registers (char *core_reg_sect, unsigned core_reg_size, int which,
76 CORE_ADDR reg_addr)
c906108c
SS
77{
78 int regno;
79 CORE_ADDR addr;
80 int bad_reg = -1;
c5aa993b 81 CORE_ADDR reg_ptr = -reg_addr; /* Original u.u_ar0 is -reg_addr. */
a728f042 82 int numregs = NUM_REGS;
c906108c
SS
83
84 /* If u.u_ar0 was an absolute address in the core file, relativize it now,
85 so we can use it as an offset into core_reg_sect. When we're done,
86 "register 0" will be at core_reg_sect+reg_ptr, and we can use
87 CORE_REGISTER_ADDR to offset to the other registers. If this is a modern
88 core file without a upage, reg_ptr will be zero and this is all a big
89 NOP. */
90 if (reg_ptr > core_reg_size)
91 reg_ptr -= KERNEL_U_ADDR;
92
93 for (regno = 0; regno < numregs; regno++)
94 {
95 addr = CORE_REGISTER_ADDR (regno, reg_ptr);
96 if (addr >= core_reg_size
97 && bad_reg < 0)
98 bad_reg = regno;
c5aa993b 99 else
23a6d369 100 regcache_raw_supply (current_regcache, regno, core_reg_sect + addr);
c906108c
SS
101 }
102
103 if (bad_reg >= 0)
8a3fe4f8 104 error (_("Register %s not found in core file."), REGISTER_NAME (bad_reg));
c906108c
SS
105}
106
107
108#ifdef REGISTER_U_ADDR
109
110/* Return the address in the core dump or inferior of register REGNO.
111 BLOCKEND is the address of the end of the user structure. */
112
113CORE_ADDR
fba45db2 114register_addr (int regno, CORE_ADDR blockend)
c906108c
SS
115{
116 CORE_ADDR addr;
117
a728f042 118 if (regno < 0 || regno >= NUM_REGS)
8a3fe4f8 119 error (_("Invalid register number %d."), regno);
c906108c
SS
120
121 REGISTER_U_ADDR (addr, blockend, regno);
122
123 return addr;
124}
125
126#endif /* REGISTER_U_ADDR */
c906108c 127\f
c5aa993b 128
c906108c
SS
129/* Register that we are able to handle aout (trad-core) file formats. */
130
131static struct core_fns aout_core_fns =
132{
2acceee2
JM
133 bfd_target_unknown_flavour, /* core_flavour */
134 default_check_format, /* check_format */
135 default_core_sniffer, /* core_sniffer */
136 fetch_core_registers, /* core_read_registers */
137 NULL /* next */
c906108c
SS
138};
139
140void
fba45db2 141_initialize_core_aout (void)
c906108c 142{
00e32a35 143 deprecated_add_core_fns (&aout_core_fns);
c906108c 144}