* frame.c (find_saved_register): Delete #ifdef
[deliverable/binutils-gdb.git] / gdb / alpha-nat.c
CommitLineData
c906108c 1/* Low level Alpha interface, for GDB when running native.
b6ba6518
KB
2 Copyright 1993, 1995, 1996, 1998, 1999, 2000, 2001
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
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22#include "defs.h"
23#include "inferior.h"
24#include "gdbcore.h"
25#include "target.h"
4e052eda 26#include "regcache.h"
c906108c
SS
27#include <sys/ptrace.h>
28#ifdef __linux__
c5aa993b
JM
29#include <asm/reg.h>
30#include <alpha/ptrace.h>
c906108c 31#else
f1e3ec29 32#include <alpha/coreregs.h>
c906108c
SS
33#endif
34#include <sys/user.h>
35
36/* Prototypes for local functions. */
37
a14ed312
KB
38static void fetch_osf_core_registers (char *, unsigned, int, CORE_ADDR);
39static void fetch_elf_core_registers (char *, unsigned, int, CORE_ADDR);
c906108c
SS
40
41/* Size of elements in jmpbuf */
42
43#define JB_ELEMENT_SIZE 8
44
45/* The definition for JB_PC in machine/reg.h is wrong.
46 And we can't get at the correct definition in setjmp.h as it is
47 not always available (eg. if _POSIX_SOURCE is defined which is the
48 default). As the defintion is unlikely to change (see comment
49 in <setjmp.h>, define the correct value here. */
50
51#undef JB_PC
52#define JB_PC 2
53
54/* Figure out where the longjmp will land.
55 We expect the first arg to be a pointer to the jmp_buf structure from which
56 we extract the pc (JB_PC) that we will land at. The pc is copied into PC.
57 This routine returns true on success. */
58
59int
fba45db2 60get_longjmp_target (CORE_ADDR *pc)
c906108c
SS
61{
62 CORE_ADDR jb_addr;
63 char raw_buffer[MAX_REGISTER_RAW_SIZE];
64
c5aa993b 65 jb_addr = read_register (A0_REGNUM);
c906108c 66
c5aa993b
JM
67 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, raw_buffer,
68 sizeof (CORE_ADDR)))
c906108c
SS
69 return 0;
70
c5aa993b 71 *pc = extract_address (raw_buffer, sizeof (CORE_ADDR));
c906108c
SS
72 return 1;
73}
74
75/* Extract the register values out of the core file and store
76 them where `read_register' will find them.
77
78 CORE_REG_SECT points to the register values themselves, read into memory.
79 CORE_REG_SIZE is the size of that area.
80 WHICH says which set of registers we are handling (0 = int, 2 = float
c5aa993b 81 on machines where they are discontiguous).
c906108c 82 REG_ADDR is the offset from u.u_ar0 to the register values relative to
c5aa993b
JM
83 core_reg_sect. This is used with old-fashioned core files to
84 locate the registers in a large upage-plus-stack ".reg" section.
85 Original upage address X is at location core_reg_sect+x+reg_addr.
c906108c
SS
86 */
87
88static void
fba45db2
KB
89fetch_osf_core_registers (char *core_reg_sect, unsigned core_reg_size,
90 int which, CORE_ADDR reg_addr)
c906108c
SS
91{
92 register int regno;
93 register int addr;
94 int bad_reg = -1;
95
f1e3ec29
AC
96 /* Table to map a gdb regnum to an index in the core register
97 section. The floating point register values are garbage in
98 OSF/1.2 core files. OSF5 uses different names for the register
99 enum list, need to handle two cases. The actual values are the
100 same. */
c906108c
SS
101 static int core_reg_mapping[NUM_REGS] =
102 {
f1e3ec29
AC
103#ifdef NCF_REGS
104#define EFL NCF_REGS
105 CF_V0, CF_T0, CF_T1, CF_T2, CF_T3, CF_T4, CF_T5, CF_T6,
106 CF_T7, CF_S0, CF_S1, CF_S2, CF_S3, CF_S4, CF_S5, CF_S6,
107 CF_A0, CF_A1, CF_A2, CF_A3, CF_A4, CF_A5, CF_T8, CF_T9,
108 CF_T10, CF_T11, CF_RA, CF_T12, CF_AT, CF_GP, CF_SP, -1,
109 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
110 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
111 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
112 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
113 CF_PC, -1
114#else
c906108c 115#define EFL (EF_SIZE / 8)
c5aa993b
JM
116 EF_V0, EF_T0, EF_T1, EF_T2, EF_T3, EF_T4, EF_T5, EF_T6,
117 EF_T7, EF_S0, EF_S1, EF_S2, EF_S3, EF_S4, EF_S5, EF_S6,
118 EF_A0, EF_A1, EF_A2, EF_A3, EF_A4, EF_A5, EF_T8, EF_T9,
119 EF_T10, EF_T11, EF_RA, EF_T12, EF_AT, EF_GP, EF_SP, -1,
120 EFL + 0, EFL + 1, EFL + 2, EFL + 3, EFL + 4, EFL + 5, EFL + 6, EFL + 7,
121 EFL + 8, EFL + 9, EFL + 10, EFL + 11, EFL + 12, EFL + 13, EFL + 14, EFL + 15,
122 EFL + 16, EFL + 17, EFL + 18, EFL + 19, EFL + 20, EFL + 21, EFL + 22, EFL + 23,
123 EFL + 24, EFL + 25, EFL + 26, EFL + 27, EFL + 28, EFL + 29, EFL + 30, EFL + 31,
124 EF_PC, -1
f1e3ec29 125#endif
c906108c 126 };
c5aa993b
JM
127 static char zerobuf[MAX_REGISTER_RAW_SIZE] =
128 {0};
c906108c
SS
129
130 for (regno = 0; regno < NUM_REGS; regno++)
131 {
132 if (CANNOT_FETCH_REGISTER (regno))
133 {
134 supply_register (regno, zerobuf);
135 continue;
136 }
137 addr = 8 * core_reg_mapping[regno];
138 if (addr < 0 || addr >= core_reg_size)
139 {
140 if (bad_reg < 0)
141 bad_reg = regno;
142 }
143 else
144 {
145 supply_register (regno, core_reg_sect + addr);
146 }
147 }
148 if (bad_reg >= 0)
149 {
150 error ("Register %s not found in core file.", REGISTER_NAME (bad_reg));
151 }
152}
153
154static void
fba45db2
KB
155fetch_elf_core_registers (char *core_reg_sect, unsigned core_reg_size,
156 int which, CORE_ADDR reg_addr)
c906108c 157{
c5aa993b 158 if (core_reg_size < 32 * 8)
c906108c
SS
159 {
160 error ("Core file register section too small (%u bytes).", core_reg_size);
161 return;
162 }
163
164 if (which == 2)
165 {
166 /* The FPU Registers. */
c5aa993b
JM
167 memcpy (&registers[REGISTER_BYTE (FP0_REGNUM)], core_reg_sect, 31 * 8);
168 memset (&registers[REGISTER_BYTE (FP0_REGNUM + 31)], 0, 8);
c906108c
SS
169 memset (&register_valid[FP0_REGNUM], 1, 32);
170 }
171 else
172 {
173 /* The General Registers. */
c5aa993b
JM
174 memcpy (&registers[REGISTER_BYTE (V0_REGNUM)], core_reg_sect, 31 * 8);
175 memcpy (&registers[REGISTER_BYTE (PC_REGNUM)], core_reg_sect + 31 * 8, 8);
c906108c
SS
176 memset (&registers[REGISTER_BYTE (ZERO_REGNUM)], 0, 8);
177 memset (&register_valid[V0_REGNUM], 1, 32);
178 register_valid[PC_REGNUM] = 1;
179 }
180}
181
182
183/* Map gdb internal register number to a ptrace ``address''.
184 These ``addresses'' are defined in <sys/ptrace.h> */
185
186#define REGISTER_PTRACE_ADDR(regno) \
187 (regno < FP0_REGNUM ? GPR_BASE + (regno) \
188 : regno == PC_REGNUM ? PC \
189 : regno >= FP0_REGNUM ? FPR_BASE + ((regno) - FP0_REGNUM) \
190 : 0)
191
192/* Return the ptrace ``address'' of register REGNO. */
193
194CORE_ADDR
fba45db2 195register_addr (int regno, CORE_ADDR blockend)
c906108c
SS
196{
197 return REGISTER_PTRACE_ADDR (regno);
198}
199
200int
fba45db2 201kernel_u_size (void)
c906108c
SS
202{
203 return (sizeof (struct user));
204}
205
206#if defined(USE_PROC_FS) || defined(HAVE_GREGSET_T)
207#include <sys/procfs.h>
208
c60c0f5f
MS
209/* Prototypes for supply_gregset etc. */
210#include "gregset.h"
211
c906108c
SS
212/*
213 * See the comment in m68k-tdep.c regarding the utility of these functions.
214 */
215
c5aa993b 216void
ce589877 217supply_gregset (gdb_gregset_t *gregsetp)
c906108c
SS
218{
219 register int regi;
220 register long *regp = ALPHA_REGSET_BASE (gregsetp);
c5aa993b
JM
221 static char zerobuf[MAX_REGISTER_RAW_SIZE] =
222 {0};
c906108c
SS
223
224 for (regi = 0; regi < 31; regi++)
c5aa993b 225 supply_register (regi, (char *) (regp + regi));
c906108c 226
c5aa993b 227 supply_register (PC_REGNUM, (char *) (regp + 31));
c906108c
SS
228
229 /* Fill inaccessible registers with zero. */
230 supply_register (ZERO_REGNUM, zerobuf);
231 supply_register (FP_REGNUM, zerobuf);
232}
233
234void
ce589877 235fill_gregset (gdb_gregset_t *gregsetp, int regno)
c906108c
SS
236{
237 int regi;
238 register long *regp = ALPHA_REGSET_BASE (gregsetp);
239
240 for (regi = 0; regi < 31; regi++)
241 if ((regno == -1) || (regno == regi))
242 *(regp + regi) = *(long *) &registers[REGISTER_BYTE (regi)];
243
244 if ((regno == -1) || (regno == PC_REGNUM))
245 *(regp + 31) = *(long *) &registers[REGISTER_BYTE (PC_REGNUM)];
246}
247
248/*
249 * Now we do the same thing for floating-point registers.
250 * Again, see the comments in m68k-tdep.c.
251 */
252
253void
ce589877 254supply_fpregset (gdb_fpregset_t *fpregsetp)
c906108c
SS
255{
256 register int regi;
257 register long *regp = ALPHA_REGSET_BASE (fpregsetp);
258
259 for (regi = 0; regi < 32; regi++)
c5aa993b 260 supply_register (regi + FP0_REGNUM, (char *) (regp + regi));
c906108c
SS
261}
262
263void
ce589877 264fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
c906108c
SS
265{
266 int regi;
267 register long *regp = ALPHA_REGSET_BASE (fpregsetp);
268
269 for (regi = FP0_REGNUM; regi < FP0_REGNUM + 32; regi++)
270 {
271 if ((regno == -1) || (regno == regi))
272 {
273 *(regp + regi - FP0_REGNUM) =
274 *(long *) &registers[REGISTER_BYTE (regi)];
275 }
276 }
277}
278#endif
c906108c 279\f
c5aa993b 280
c906108c
SS
281/* Register that we are able to handle alpha core file formats. */
282
283static struct core_fns alpha_osf_core_fns =
284{
285 /* This really is bfd_target_unknown_flavour. */
286
2acceee2
JM
287 bfd_target_unknown_flavour, /* core_flavour */
288 default_check_format, /* check_format */
289 default_core_sniffer, /* core_sniffer */
290 fetch_osf_core_registers, /* core_read_registers */
291 NULL /* next */
c906108c
SS
292};
293
294static struct core_fns alpha_elf_core_fns =
295{
2acceee2
JM
296 bfd_target_elf_flavour, /* core_flavour */
297 default_check_format, /* check_format */
298 default_core_sniffer, /* core_sniffer */
299 fetch_elf_core_registers, /* core_read_registers */
300 NULL /* next */
c906108c
SS
301};
302
303void
fba45db2 304_initialize_core_alpha (void)
c906108c
SS
305{
306 add_core_fns (&alpha_osf_core_fns);
307 add_core_fns (&alpha_elf_core_fns);
308}
This page took 0.158964 seconds and 4 git commands to generate.