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