* rs6000-aix-tdep.c: Include "regcache.h", "regset.h", and
[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
b02f9d57
UW
151/* Given a pointer to either a gregset_t or fpregset_t, return a
152 pointer to the first register. */
153#define ALPHA_REGSET_BASE(regsetp) ((regsetp)->regs)
154
98a8e1e5 155/* Locate the UNIQUE value within the gregset_t. */
98a8e1e5 156#define ALPHA_REGSET_UNIQUE(ptr) NULL
98a8e1e5 157
c906108c
SS
158/*
159 * See the comment in m68k-tdep.c regarding the utility of these functions.
160 */
161
c5aa993b 162void
ce589877 163supply_gregset (gdb_gregset_t *gregsetp)
c906108c 164{
52f0bd74 165 long *regp = ALPHA_REGSET_BASE (gregsetp);
98a8e1e5 166 void *unique = ALPHA_REGSET_UNIQUE (gregsetp);
c906108c 167
98a8e1e5
RH
168 /* PC is in slot 32. */
169 alpha_supply_int_regs (-1, regp, regp + 31, unique);
c906108c
SS
170}
171
172void
ce589877 173fill_gregset (gdb_gregset_t *gregsetp, int regno)
c906108c 174{
52f0bd74 175 long *regp = ALPHA_REGSET_BASE (gregsetp);
98a8e1e5 176 void *unique = ALPHA_REGSET_UNIQUE (gregsetp);
c906108c 177
98a8e1e5
RH
178 /* PC is in slot 32. */
179 alpha_fill_int_regs (regno, regp, regp + 31, unique);
c906108c
SS
180}
181
182/*
183 * Now we do the same thing for floating-point registers.
184 * Again, see the comments in m68k-tdep.c.
185 */
186
187void
ce589877 188supply_fpregset (gdb_fpregset_t *fpregsetp)
c906108c 189{
52f0bd74 190 long *regp = ALPHA_REGSET_BASE (fpregsetp);
c906108c 191
98a8e1e5
RH
192 /* FPCR is in slot 32. */
193 alpha_supply_fp_regs (-1, regp, regp + 31);
c906108c
SS
194}
195
196void
ce589877 197fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
c906108c 198{
52f0bd74 199 long *regp = ALPHA_REGSET_BASE (fpregsetp);
c906108c 200
98a8e1e5
RH
201 /* FPCR is in slot 32. */
202 alpha_fill_fp_regs (regno, regp, regp + 31);
c906108c
SS
203}
204#endif
c906108c 205\f
c5aa993b 206
c906108c
SS
207/* Register that we are able to handle alpha core file formats. */
208
209static struct core_fns alpha_osf_core_fns =
210{
211 /* This really is bfd_target_unknown_flavour. */
212
2acceee2
JM
213 bfd_target_unknown_flavour, /* core_flavour */
214 default_check_format, /* check_format */
215 default_core_sniffer, /* core_sniffer */
216 fetch_osf_core_registers, /* core_read_registers */
217 NULL /* next */
c906108c
SS
218};
219
c906108c 220void
fba45db2 221_initialize_core_alpha (void)
c906108c 222{
00e32a35 223 deprecated_add_core_fns (&alpha_osf_core_fns);
c906108c 224}
This page took 0.417264 seconds and 4 git commands to generate.