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