gas/
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
CommitLineData
c906108c 1/* Low level Alpha interface, for GDB when running native.
0fb0cc75
JB
2 Copyright (C) 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2003, 2007, 2008,
3 2009 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.
45 Original upage address X is at location core_reg_sect+x+reg_addr.
c906108c
SS
46 */
47
48static void
9eefc95f
UW
49fetch_osf_core_registers (struct regcache *regcache,
50 char *core_reg_sect, unsigned core_reg_size,
fba45db2 51 int which, CORE_ADDR reg_addr)
c906108c 52{
ec7cc0e8 53 struct gdbarch *gdbarch = get_regcache_arch (regcache);
52f0bd74
AC
54 int regno;
55 int addr;
c906108c
SS
56 int bad_reg = -1;
57
f1e3ec29
AC
58 /* Table to map a gdb regnum to an index in the core register
59 section. The floating point register values are garbage in
60 OSF/1.2 core files. OSF5 uses different names for the register
61 enum list, need to handle two cases. The actual values are the
62 same. */
98a8e1e5 63 static int const core_reg_mapping[ALPHA_NUM_REGS] =
c906108c 64 {
f1e3ec29
AC
65#ifdef NCF_REGS
66#define EFL NCF_REGS
67 CF_V0, CF_T0, CF_T1, CF_T2, CF_T3, CF_T4, CF_T5, CF_T6,
68 CF_T7, CF_S0, CF_S1, CF_S2, CF_S3, CF_S4, CF_S5, CF_S6,
69 CF_A0, CF_A1, CF_A2, CF_A3, CF_A4, CF_A5, CF_T8, CF_T9,
70 CF_T10, CF_T11, CF_RA, CF_T12, CF_AT, CF_GP, CF_SP, -1,
71 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
72 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
73 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
74 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 75 CF_PC, -1, -1
f1e3ec29 76#else
c906108c 77#define EFL (EF_SIZE / 8)
c5aa993b
JM
78 EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
79 EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6,
80 EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9,
81 EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1,
82 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
83 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
84 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
85 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
515921d7 86 EF_PC, -1, -1
f1e3ec29 87#endif
c906108c 88 };
c906108c 89
98a8e1e5 90 for (regno = 0; regno < ALPHA_NUM_REGS; regno++)
c906108c 91 {
ec7cc0e8 92 if (gdbarch_cannot_fetch_register (gdbarch, regno))
c906108c 93 {
9eefc95f 94 regcache_raw_supply (regcache, regno, NULL);
c906108c
SS
95 continue;
96 }
97 addr = 8 * core_reg_mapping[regno];
98 if (addr < 0 || addr >= core_reg_size)
99 {
98a8e1e5
RH
100 /* ??? UNIQUE is a new addition. Don't generate an error. */
101 if (regno == ALPHA_UNIQUE_REGNUM)
102 {
9eefc95f 103 regcache_raw_supply (regcache, regno, NULL);
98a8e1e5
RH
104 continue;
105 }
c906108c
SS
106 if (bad_reg < 0)
107 bad_reg = regno;
108 }
109 else
110 {
9eefc95f 111 regcache_raw_supply (regcache, regno, core_reg_sect + addr);
c906108c
SS
112 }
113 }
114 if (bad_reg >= 0)
115 {
c9f4d572 116 error (_("Register %s not found in core file."),
ec7cc0e8 117 gdbarch_register_name (gdbarch, bad_reg));
c906108c
SS
118 }
119}
120
c906108c 121
c906108c 122#include <sys/procfs.h>
c60c0f5f
MS
123/* Prototypes for supply_gregset etc. */
124#include "gregset.h"
125
c906108c
SS
126/*
127 * See the comment in m68k-tdep.c regarding the utility of these functions.
128 */
129
c5aa993b 130void
7f7fe91e 131supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
c906108c 132{
7f7fe91e 133 const long *regp = gregsetp->regs;
c906108c 134
98a8e1e5 135 /* PC is in slot 32. */
7f7fe91e 136 alpha_supply_int_regs (regcache, -1, regp, regp + 31, NULL);
c906108c
SS
137}
138
139void
7f7fe91e
UW
140fill_gregset (const struct regcache *regcache,
141 gdb_gregset_t *gregsetp, int regno)
c906108c 142{
efc72ef5 143 long *regp = gregsetp->regs;
c906108c 144
98a8e1e5 145 /* PC is in slot 32. */
7f7fe91e 146 alpha_fill_int_regs (regcache, regno, regp, regp + 31, NULL);
c906108c
SS
147}
148
149/*
150 * Now we do the same thing for floating-point registers.
151 * Again, see the comments in m68k-tdep.c.
152 */
153
154void
7f7fe91e 155supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp)
c906108c 156{
7f7fe91e 157 const long *regp = fpregsetp->regs;
c906108c 158
98a8e1e5 159 /* FPCR is in slot 32. */
7f7fe91e 160 alpha_supply_fp_regs (regcache, -1, regp, regp + 31);
c906108c
SS
161}
162
163void
7f7fe91e
UW
164fill_fpregset (const struct regcache *regcache,
165 gdb_fpregset_t *fpregsetp, int regno)
c906108c 166{
efc72ef5 167 long *regp = fpregsetp->regs;
c906108c 168
98a8e1e5 169 /* FPCR is in slot 32. */
7f7fe91e 170 alpha_fill_fp_regs (regcache, regno, regp, regp + 31);
c906108c 171}
c906108c 172\f
c5aa993b 173
c906108c
SS
174/* Register that we are able to handle alpha core file formats. */
175
176static struct core_fns alpha_osf_core_fns =
177{
178 /* This really is bfd_target_unknown_flavour. */
179
2acceee2
JM
180 bfd_target_unknown_flavour, /* core_flavour */
181 default_check_format, /* check_format */
182 default_core_sniffer, /* core_sniffer */
183 fetch_osf_core_registers, /* core_read_registers */
184 NULL /* next */
c906108c
SS
185};
186
d1a7880c
PA
187/* Provide a prototype to silence -Wmissing-prototypes. */
188extern initialize_file_ftype _initialize_alpha_nat;
189
c906108c 190void
d1a7880c 191_initialize_alpha_nat (void)
c906108c 192{
d1a7880c
PA
193 struct target_ops *t;
194
195 t = procfs_target ();
196 add_target (t);
197
00e32a35 198 deprecated_add_core_fns (&alpha_osf_core_fns);
c906108c 199}
This page took 0.539959 seconds and 4 git commands to generate.