* symfile.h (struct sym_fns): Add new field sym_read_linetable.
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
CommitLineData
c906108c 1/* Low level Alpha interface, for GDB when running native.
6aba47ca 2 Copyright (C) 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2007
b6ba6518 3 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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 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 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
19
20#include "defs.h"
e162d11b 21#include "gdb_string.h"
c906108c
SS
22#include "inferior.h"
23#include "gdbcore.h"
24#include "target.h"
4e052eda 25#include "regcache.h"
dc129d82
JT
26
27#include "alpha-tdep.h"
28
c906108c 29#include <sys/ptrace.h>
f1e3ec29 30#include <alpha/coreregs.h>
c906108c
SS
31#include <sys/user.h>
32
c906108c 33
c906108c 34/* Extract the register values out of the core file and store
7157eed4 35 them into REGCACHE.
c906108c
SS
36
37 CORE_REG_SECT points to the register values themselves, read into memory.
38 CORE_REG_SIZE is the size of that area.
39 WHICH says which set of registers we are handling (0 = int, 2 = float
c5aa993b 40 on machines where they are discontiguous).
c906108c 41 REG_ADDR is the offset from u.u_ar0 to the register values relative to
c5aa993b
JM
42 core_reg_sect. This is used with old-fashioned core files to
43 locate the registers in a large upage-plus-stack ".reg" section.
44 Original upage address X is at location core_reg_sect+x+reg_addr.
c906108c
SS
45 */
46
47static void
9eefc95f
UW
48fetch_osf_core_registers (struct regcache *regcache,
49 char *core_reg_sect, unsigned core_reg_size,
fba45db2 50 int which, CORE_ADDR reg_addr)
c906108c 51{
52f0bd74
AC
52 int regno;
53 int addr;
c906108c
SS
54 int bad_reg = -1;
55
f1e3ec29
AC
56 /* Table to map a gdb regnum to an index in the core register
57 section. The floating point register values are garbage in
58 OSF/1.2 core files. OSF5 uses different names for the register
59 enum list, need to handle two cases. The actual values are the
60 same. */
98a8e1e5 61 static int const core_reg_mapping[ALPHA_NUM_REGS] =
c906108c 62 {
f1e3ec29
AC
63#ifdef NCF_REGS
64#define EFL NCF_REGS
65 CF_V0, CF_T0, CF_T1, CF_T2, CF_T3, CF_T4, CF_T5, CF_T6,
66 CF_T7, CF_S0, CF_S1, CF_S2, CF_S3, CF_S4, CF_S5, CF_S6,
67 CF_A0, CF_A1, CF_A2, CF_A3, CF_A4, CF_A5, CF_T8, CF_T9,
68 CF_T10, CF_T11, CF_RA, CF_T12, CF_AT, CF_GP, CF_SP, -1,
69 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
70 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
71 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
72 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 73 CF_PC, -1, -1
f1e3ec29 74#else
c906108c 75#define EFL (EF_SIZE / 8)
c5aa993b
JM
76 EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
77 EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6,
78 EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9,
79 EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1,
80 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
81 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
82 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
83 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 84 EF_PC, -1, -1
f1e3ec29 85#endif
c906108c 86 };
c906108c 87
98a8e1e5 88 for (regno = 0; regno < ALPHA_NUM_REGS; regno++)
c906108c 89 {
8d4c1ba3 90 if (gdbarch_cannot_fetch_register (current_gdbarch, regno))
c906108c 91 {
9eefc95f 92 regcache_raw_supply (regcache, regno, NULL);
c906108c
SS
93 continue;
94 }
95 addr = 8 * core_reg_mapping[regno];
96 if (addr < 0 || addr >= core_reg_size)
97 {
98a8e1e5
RH
98 /* ??? UNIQUE is a new addition. Don't generate an error. */
99 if (regno == ALPHA_UNIQUE_REGNUM)
100 {
9eefc95f 101 regcache_raw_supply (regcache, regno, NULL);
98a8e1e5
RH
102 continue;
103 }
c906108c
SS
104 if (bad_reg < 0)
105 bad_reg = regno;
106 }
107 else
108 {
9eefc95f 109 regcache_raw_supply (regcache, regno, core_reg_sect + addr);
c906108c
SS
110 }
111 }
112 if (bad_reg >= 0)
113 {
c9f4d572
UW
114 error (_("Register %s not found in core file."),
115 gdbarch_register_name (current_gdbarch, bad_reg));
c906108c
SS
116 }
117}
118
c906108c 119
c906108c 120#include <sys/procfs.h>
c60c0f5f
MS
121/* Prototypes for supply_gregset etc. */
122#include "gregset.h"
123
c906108c
SS
124/*
125 * See the comment in m68k-tdep.c regarding the utility of these functions.
126 */
127
c5aa993b 128void
7f7fe91e 129supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
c906108c 130{
7f7fe91e 131 const long *regp = gregsetp->regs;
c906108c 132
98a8e1e5 133 /* PC is in slot 32. */
7f7fe91e 134 alpha_supply_int_regs (regcache, -1, regp, regp + 31, NULL);
c906108c
SS
135}
136
137void
7f7fe91e
UW
138fill_gregset (const struct regcache *regcache,
139 gdb_gregset_t *gregsetp, int regno)
c906108c 140{
efc72ef5 141 long *regp = gregsetp->regs;
c906108c 142
98a8e1e5 143 /* PC is in slot 32. */
7f7fe91e 144 alpha_fill_int_regs (regcache, regno, regp, regp + 31, NULL);
c906108c
SS
145}
146
147/*
148 * Now we do the same thing for floating-point registers.
149 * Again, see the comments in m68k-tdep.c.
150 */
151
152void
7f7fe91e 153supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
c906108c 154{
7f7fe91e 155 const long *regp = fpregsetp->regs;
c906108c 156
98a8e1e5 157 /* FPCR is in slot 32. */
7f7fe91e 158 alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
c906108c
SS
159}
160
161void
7f7fe91e
UW
162fill_fpregset (const struct regcache *regcache,
163 gdb_fpregset_t *fpregsetp, int regno)
c906108c 164{
efc72ef5 165 long *regp = fpregsetp->regs;
c906108c 166
98a8e1e5 167 /* FPCR is in slot 32. */
7f7fe91e 168 alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
c906108c 169}
c906108c 170\f
c5aa993b 171
c906108c
SS
172/* Register that we are able to handle alpha core file formats. */
173
174static struct core_fns alpha_osf_core_fns =
175{
176 /* This really is bfd_target_unknown_flavour. */
177
2acceee2
JM
178 bfd_target_unknown_flavour, /* core_flavour */
179 default_check_format, /* check_format */
180 default_core_sniffer, /* core_sniffer */
181 fetch_osf_core_registers, /* core_read_registers */
182 NULL /* next */
c906108c
SS
183};
184
c906108c 185void
fba45db2 186_initialize_core_alpha (void)
c906108c 187{
00e32a35 188 deprecated_add_core_fns (&alpha_osf_core_fns);
c906108c 189}
This page took 0.43794 seconds and 4 git commands to generate.