2011-01-07 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
CommitLineData
c906108c 1/* Low level Alpha interface, for GDB when running native.
0fb0cc75 2 Copyright (C) 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2007, 2008,
7b6bb8da 3 2009, 2010, 2011 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"
d1a7880c 25#include "procfs.h"
4e052eda 26#include "regcache.h"
dc129d82
JT
27
28#include "alpha-tdep.h"
29
c906108c 30#include <sys/ptrace.h>
f1e3ec29 31#include <alpha/coreregs.h>
c906108c
SS
32#include <sys/user.h>
33
c906108c 34
c906108c 35/* Extract the register values out of the core file and store
7157eed4 36 them into REGCACHE.
c906108c
SS
37
38 CORE_REG_SECT points to the register values themselves, read into memory.
39 CORE_REG_SIZE is the size of that area.
40 WHICH says which set of registers we are handling (0 = int, 2 = float
c5aa993b 41 on machines where they are discontiguous).
c906108c 42 REG_ADDR is the offset from u.u_ar0 to the register values relative to
c5aa993b
JM
43 core_reg_sect. This is used with old-fashioned core files to
44 locate the registers in a large upage-plus-stack ".reg" section.
0963b4bd 45 Original upage address X is at location core_reg_sect+x+reg_addr. */
c906108c
SS
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{
ec7cc0e8 52 struct gdbarch *gdbarch = get_regcache_arch (regcache);
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,
0963b4bd
MS
70 EFL + 0, EFL + 1, EFL + 2, EFL + 3,
71 EFL + 4, EFL + 5, EFL + 6, EFL + 7,
72 EFL + 8, EFL + 9, EFL + 10, EFL + 11,
73 EFL + 12, EFL + 13, EFL + 14, EFL + 15,
74 EFL + 16, EFL + 17, EFL + 18, EFL + 19,
75 EFL + 20, EFL + 21, EFL + 22, EFL + 23,
76 EFL + 24, EFL + 25, EFL + 26, EFL + 27,
77 EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 78 CF_PC, -1, -1
f1e3ec29 79#else
c906108c 80#define EFL (EF_SIZE / 8)
c5aa993b
JM
81 EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
82 EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6,
83 EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9,
84 EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1,
0963b4bd
MS
85 EFL + 0, EFL + 1, EFL + 2, EFL + 3,
86 EFL + 4, EFL + 5, EFL + 6, EFL + 7,
87 EFL + 8, EFL + 9, EFL + 10, EFL + 11,
88 EFL + 12, EFL + 13, EFL + 14, EFL + 15,
89 EFL + 16, EFL + 17, EFL + 18, EFL + 19,
90 EFL + 20, EFL + 21, EFL + 22, EFL + 23,
91 EFL + 24, EFL + 25, EFL + 26, EFL + 27,
92 EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 93 EF_PC, -1, -1
f1e3ec29 94#endif
c906108c 95 };
c906108c 96
98a8e1e5 97 for (regno = 0; regno < ALPHA_NUM_REGS; regno++)
c906108c 98 {
ec7cc0e8 99 if (gdbarch_cannot_fetch_register (gdbarch, regno))
c906108c 100 {
9eefc95f 101 regcache_raw_supply (regcache, regno, NULL);
c906108c
SS
102 continue;
103 }
104 addr = 8 * core_reg_mapping[regno];
105 if (addr < 0 || addr >= core_reg_size)
106 {
98a8e1e5
RH
107 /* ??? UNIQUE is a new addition. Don't generate an error. */
108 if (regno == ALPHA_UNIQUE_REGNUM)
109 {
9eefc95f 110 regcache_raw_supply (regcache, regno, NULL);
98a8e1e5
RH
111 continue;
112 }
c906108c
SS
113 if (bad_reg < 0)
114 bad_reg = regno;
115 }
116 else
117 {
9eefc95f 118 regcache_raw_supply (regcache, regno, core_reg_sect + addr);
c906108c
SS
119 }
120 }
121 if (bad_reg >= 0)
122 {
c9f4d572 123 error (_("Register %s not found in core file."),
ec7cc0e8 124 gdbarch_register_name (gdbarch, bad_reg));
c906108c
SS
125 }
126}
127
c906108c 128
c906108c 129#include <sys/procfs.h>
0963b4bd 130/* Prototypes for supply_gregset etc. */
c60c0f5f
MS
131#include "gregset.h"
132
0963b4bd
MS
133/* See the comment in m68k-tdep.c regarding the utility of these
134 functions. */
c906108c 135
c5aa993b 136void
7f7fe91e 137supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
c906108c 138{
7f7fe91e 139 const long *regp = gregsetp->regs;
c906108c 140
98a8e1e5 141 /* PC is in slot 32. */
7f7fe91e 142 alpha_supply_int_regs (regcache, -1, regp, regp + 31, NULL);
c906108c
SS
143}
144
145void
7f7fe91e
UW
146fill_gregset (const struct regcache *regcache,
147 gdb_gregset_t *gregsetp, int regno)
c906108c 148{
efc72ef5 149 long *regp = gregsetp->regs;
c906108c 150
98a8e1e5 151 /* PC is in slot 32. */
7f7fe91e 152 alpha_fill_int_regs (regcache, regno, regp, regp + 31, NULL);
c906108c
SS
153}
154
0963b4bd
MS
155/* Now we do the same thing for floating-point registers.
156 Again, see the comments in m68k-tdep.c. */
c906108c
SS
157
158void
7f7fe91e 159supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
c906108c 160{
7f7fe91e 161 const long *regp = fpregsetp->regs;
c906108c 162
98a8e1e5 163 /* FPCR is in slot 32. */
7f7fe91e 164 alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
c906108c
SS
165}
166
167void
7f7fe91e
UW
168fill_fpregset (const struct regcache *regcache,
169 gdb_fpregset_t *fpregsetp, int regno)
c906108c 170{
efc72ef5 171 long *regp = fpregsetp->regs;
c906108c 172
98a8e1e5 173 /* FPCR is in slot 32. */
7f7fe91e 174 alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
c906108c 175}
c906108c 176\f
c5aa993b 177
0963b4bd 178/* Register that we are able to handle alpha core file formats. */
c906108c
SS
179
180static struct core_fns alpha_osf_core_fns =
181{
182 /* This really is bfd_target_unknown_flavour. */
183
2acceee2
JM
184 bfd_target_unknown_flavour, /* core_flavour */
185 default_check_format, /* check_format */
186 default_core_sniffer, /* core_sniffer */
187 fetch_osf_core_registers, /* core_read_registers */
188 NULL /* next */
c906108c
SS
189};
190
d1a7880c
PA
191/* Provide a prototype to silence -Wmissing-prototypes. */
192extern initialize_file_ftype _initialize_alpha_nat;
193
c906108c 194void
d1a7880c 195_initialize_alpha_nat (void)
c906108c 196{
d1a7880c
PA
197 struct target_ops *t;
198
199 t = procfs_target ();
200 add_target (t);
201
00e32a35 202 deprecated_add_core_fns (&alpha_osf_core_fns);
c906108c 203}
This page took 0.749021 seconds and 4 git commands to generate.