2012-03-08 Luis Machado <lgustavo@codesourcery.com>
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
CommitLineData
c906108c 1/* Low level Alpha interface, for GDB when running native.
0b302171
JB
2 Copyright (C) 1993, 1995-1996, 1998-2001, 2003, 2007-2012 Free
3 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 }
4a1be8d2
PA
104
105 if (regno == ALPHA_ZERO_REGNUM)
106 {
107 const gdb_byte zero[8] = { 0 };
108
109 regcache_raw_supply (regcache, regno, zero);
110 continue;
111 }
112
c906108c
SS
113 addr = 8 * core_reg_mapping[regno];
114 if (addr < 0 || addr >= core_reg_size)
115 {
98a8e1e5
RH
116 /* ??? UNIQUE is a new addition. Don't generate an error. */
117 if (regno == ALPHA_UNIQUE_REGNUM)
118 {
9eefc95f 119 regcache_raw_supply (regcache, regno, NULL);
98a8e1e5
RH
120 continue;
121 }
c906108c
SS
122 if (bad_reg < 0)
123 bad_reg = regno;
124 }
125 else
126 {
9eefc95f 127 regcache_raw_supply (regcache, regno, core_reg_sect + addr);
c906108c
SS
128 }
129 }
130 if (bad_reg >= 0)
131 {
c9f4d572 132 error (_("Register %s not found in core file."),
ec7cc0e8 133 gdbarch_register_name (gdbarch, bad_reg));
c906108c
SS
134 }
135}
136
c906108c 137
c906108c 138#include <sys/procfs.h>
0963b4bd 139/* Prototypes for supply_gregset etc. */
c60c0f5f
MS
140#include "gregset.h"
141
0963b4bd
MS
142/* See the comment in m68k-tdep.c regarding the utility of these
143 functions. */
c906108c 144
c5aa993b 145void
7f7fe91e 146supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
c906108c 147{
7f7fe91e 148 const long *regp = gregsetp->regs;
c906108c 149
98a8e1e5 150 /* PC is in slot 32. */
7f7fe91e 151 alpha_supply_int_regs (regcache, -1, regp, regp + 31, NULL);
c906108c
SS
152}
153
154void
7f7fe91e
UW
155fill_gregset (const struct regcache *regcache,
156 gdb_gregset_t *gregsetp, int regno)
c906108c 157{
efc72ef5 158 long *regp = gregsetp->regs;
c906108c 159
98a8e1e5 160 /* PC is in slot 32. */
7f7fe91e 161 alpha_fill_int_regs (regcache, regno, regp, regp + 31, NULL);
c906108c
SS
162}
163
0963b4bd
MS
164/* Now we do the same thing for floating-point registers.
165 Again, see the comments in m68k-tdep.c. */
c906108c
SS
166
167void
7f7fe91e 168supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
c906108c 169{
7f7fe91e 170 const long *regp = fpregsetp->regs;
c906108c 171
98a8e1e5 172 /* FPCR is in slot 32. */
7f7fe91e 173 alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
c906108c
SS
174}
175
176void
7f7fe91e
UW
177fill_fpregset (const struct regcache *regcache,
178 gdb_fpregset_t *fpregsetp, int regno)
c906108c 179{
efc72ef5 180 long *regp = fpregsetp->regs;
c906108c 181
98a8e1e5 182 /* FPCR is in slot 32. */
7f7fe91e 183 alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
c906108c 184}
c906108c 185\f
c5aa993b 186
0963b4bd 187/* Register that we are able to handle alpha core file formats. */
c906108c
SS
188
189static struct core_fns alpha_osf_core_fns =
190{
191 /* This really is bfd_target_unknown_flavour. */
192
2acceee2
JM
193 bfd_target_unknown_flavour, /* core_flavour */
194 default_check_format, /* check_format */
195 default_core_sniffer, /* core_sniffer */
196 fetch_osf_core_registers, /* core_read_registers */
197 NULL /* next */
c906108c
SS
198};
199
d1a7880c
PA
200/* Provide a prototype to silence -Wmissing-prototypes. */
201extern initialize_file_ftype _initialize_alpha_nat;
202
c906108c 203void
d1a7880c 204_initialize_alpha_nat (void)
c906108c 205{
d1a7880c
PA
206 struct target_ops *t;
207
208 t = procfs_target ();
209 add_target (t);
210
00e32a35 211 deprecated_add_core_fns (&alpha_osf_core_fns);
c906108c 212}
This page took 0.737414 seconds and 4 git commands to generate.