]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/sparc-nat.c
* sparc-nat.c (fetch_inferior_registers): Correct
[thirdparty/binutils-gdb.git] / gdb / sparc-nat.c
1 /* Functions specific to running gdb native on a SPARC running SunOS4.
2
3 Copyright 1989, 1992, 1993, 1994, 1996, 1997, 1998, 1999, 2000,
4 2001, 2002, 2003 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 Boston, MA 02111-1307, USA. */
22
23 #include "defs.h"
24 #include "inferior.h"
25 #include "target.h"
26 #include "gdbcore.h"
27 #include "regcache.h"
28
29 #ifdef HAVE_SYS_PARAM_H
30 #include <sys/param.h>
31 #endif
32 #include <signal.h>
33 #include <sys/ptrace.h>
34 #include "gdb_wait.h"
35 #ifdef __linux__
36 #include <asm/reg.h>
37 #else
38 #include <machine/reg.h>
39 #endif
40 #include <sys/user.h>
41
42 /* We don't store all registers immediately when requested, since they
43 get sent over in large chunks anyway. Instead, we accumulate most
44 of the changes and send them over once. "deferred_stores" keeps
45 track of which sets of registers we have locally-changed copies of,
46 so we only need send the groups that have changed. */
47
48 #define INT_REGS 1
49 #define STACK_REGS 2
50 #define FP_REGS 4
51
52 /* Fetch one or more registers from the inferior. REGNO == -1 to get
53 them all. We actually fetch more than requested, when convenient,
54 marking them as valid so we won't fetch them again. */
55
56 void
57 fetch_inferior_registers (int regno)
58 {
59 struct regs inferior_registers;
60 struct fp_status inferior_fp_registers;
61 int i;
62 int fetch_pid;
63
64 /* NOTE: cagney/2002-12-03: This code assumes that the currently
65 selected light weight processes' registers can be written
66 directly into the selected thread's register cache. This works
67 fine when given an 1:1 LWP:thread model (such as found on
68 GNU/Linux) but will, likely, have problems when used on an N:1
69 (userland threads) or N:M (userland multiple LWP) model. In the
70 case of the latter two, the LWP's registers do not necessarily
71 belong to the selected thread (the LWP could be in the middle of
72 executing the thread switch code).
73
74 These functions should instead be paramaterized with an explicit
75 object (struct regcache, struct thread_info?) into which the LWPs
76 registers can be written. */
77
78 fetch_pid = TIDGET (inferior_ptid);
79 if (fetch_pid == 0)
80 fetch_pid = PIDGET (inferior_ptid);
81
82 /* We should never be called with deferred stores, because a prerequisite
83 for writing regs is to have fetched them all (PREPARE_TO_STORE), sigh. */
84 if (deferred_stores)
85 internal_error (__FILE__, __LINE__, "failed internal consistency check");
86
87 DO_DEFERRED_STORES;
88
89 /* Global and Out regs are fetched directly, as well as the control
90 registers. If we're getting one of the in or local regs,
91 and the stack pointer has not yet been fetched,
92 we have to do that first, since they're found in memory relative
93 to the stack pointer. */
94 if (regno < O7_REGNUM /* including -1 */
95 || regno >= Y_REGNUM
96 || (!deprecated_register_valid[SP_REGNUM] && regno < I7_REGNUM))
97 {
98 if (0 != ptrace (PTRACE_GETREGS, fetch_pid,
99 (PTRACE_ARG3_TYPE) & inferior_registers, 0))
100 perror ("ptrace_getregs");
101
102 deprecated_registers[REGISTER_BYTE (0)] = 0;
103 memcpy (&deprecated_registers[REGISTER_BYTE (1)],
104 &inferior_registers.r_g1, 15 * REGISTER_RAW_SIZE (G0_REGNUM));
105 *(int *) &deprecated_registers[REGISTER_BYTE (PS_REGNUM)]
106 = inferior_registers.r_ps;
107 *(int *) &deprecated_registers[REGISTER_BYTE (PC_REGNUM)]
108 = inferior_registers.r_pc;
109 *(int *) &deprecated_registers[REGISTER_BYTE (NPC_REGNUM)]
110 = inferior_registers.r_npc;
111 *(int *) &deprecated_registers[REGISTER_BYTE (Y_REGNUM)] = inferior_registers.r_y;
112
113 for (i = G0_REGNUM; i <= O7_REGNUM; i++)
114 deprecated_register_valid[i] = 1;
115 deprecated_register_valid[Y_REGNUM] = 1;
116 deprecated_register_valid[PS_REGNUM] = 1;
117 deprecated_register_valid[PC_REGNUM] = 1;
118 deprecated_register_valid[NPC_REGNUM] = 1;
119 /* If we don't set these valid, read_register_bytes() rereads
120 all the regs every time it is called! FIXME. */
121 deprecated_register_valid[WIM_REGNUM] = 1; /* Not true yet, FIXME */
122 deprecated_register_valid[TBR_REGNUM] = 1; /* Not true yet, FIXME */
123 deprecated_register_valid[CPS_REGNUM] = 1; /* Not true yet, FIXME */
124 }
125
126 /* Floating point registers */
127 if (regno == -1 ||
128 regno == FPS_REGNUM ||
129 (regno >= FP0_REGNUM && regno <= FP0_REGNUM + 31))
130 {
131 if (0 != ptrace (PTRACE_GETFPREGS, fetch_pid,
132 (PTRACE_ARG3_TYPE) & inferior_fp_registers,
133 0))
134 perror ("ptrace_getfpregs");
135 memcpy (&deprecated_registers[REGISTER_BYTE (FP0_REGNUM)],
136 &inferior_fp_registers, sizeof inferior_fp_registers.fpu_fr);
137 memcpy (&deprecated_registers[REGISTER_BYTE (FPS_REGNUM)],
138 &inferior_fp_registers.Fpu_fsr, sizeof (FPU_FSR_TYPE));
139 for (i = FP0_REGNUM; i <= FP0_REGNUM + 31; i++)
140 deprecated_register_valid[i] = 1;
141 deprecated_register_valid[FPS_REGNUM] = 1;
142 }
143
144 /* These regs are saved on the stack by the kernel. Only read them
145 all (16 ptrace calls!) if we really need them. */
146 if (regno == -1)
147 {
148 CORE_ADDR sp = *(unsigned int *) & deprecated_registers[REGISTER_BYTE (SP_REGNUM)];
149 target_read_memory (sp, &deprecated_registers[REGISTER_BYTE (L0_REGNUM)],
150 16 * REGISTER_RAW_SIZE (L0_REGNUM));
151 for (i = L0_REGNUM; i <= I7_REGNUM; i++)
152 deprecated_register_valid[i] = 1;
153 }
154 else if (regno >= L0_REGNUM && regno <= I7_REGNUM)
155 {
156 CORE_ADDR sp = *(unsigned int *) & deprecated_registers[REGISTER_BYTE (SP_REGNUM)];
157 i = REGISTER_BYTE (regno);
158 if (deprecated_register_valid[regno])
159 printf_unfiltered ("register %d valid and read\n", regno);
160 target_read_memory (sp + i - REGISTER_BYTE (L0_REGNUM),
161 &deprecated_registers[i], REGISTER_RAW_SIZE (regno));
162 deprecated_register_valid[regno] = 1;
163 }
164 }
165
166 /* Store our register values back into the inferior.
167 If REGNO is -1, do this for all registers.
168 Otherwise, REGNO specifies which register (so we can save time). */
169
170 void
171 store_inferior_registers (int regno)
172 {
173 struct regs inferior_registers;
174 struct fp_status inferior_fp_registers;
175 int wanna_store = INT_REGS + STACK_REGS + FP_REGS;
176 int store_pid;
177
178 /* NOTE: cagney/2002-12-02: See comment in fetch_inferior_registers
179 about threaded assumptions. */
180 store_pid = TIDGET (inferior_ptid);
181 if (store_pid == 0)
182 store_pid = PIDGET (inferior_ptid);
183
184 /* First decide which pieces of machine-state we need to modify.
185 Default for regno == -1 case is all pieces. */
186 if (regno >= 0)
187 {
188 if (FP0_REGNUM <= regno && regno < FP0_REGNUM + 32)
189 {
190 wanna_store = FP_REGS;
191 }
192 else
193 {
194 if (regno == SP_REGNUM)
195 wanna_store = INT_REGS + STACK_REGS;
196 else if (regno < L0_REGNUM || regno > I7_REGNUM)
197 wanna_store = INT_REGS;
198 else if (regno == FPS_REGNUM)
199 wanna_store = FP_REGS;
200 else
201 wanna_store = STACK_REGS;
202 }
203 }
204
205 /* See if we're forcing the stores to happen now, or deferring. */
206 if (regno == -2)
207 {
208 wanna_store = deferred_stores;
209 deferred_stores = 0;
210 }
211 else
212 {
213 if (wanna_store == STACK_REGS)
214 {
215 /* Fall through and just store one stack reg. If we deferred
216 it, we'd have to store them all, or remember more info. */
217 }
218 else
219 {
220 deferred_stores |= wanna_store;
221 return;
222 }
223 }
224
225 if (wanna_store & STACK_REGS)
226 {
227 CORE_ADDR sp = *(unsigned int *) & deprecated_registers[REGISTER_BYTE (SP_REGNUM)];
228
229 if (regno < 0 || regno == SP_REGNUM)
230 {
231 if (!deprecated_register_valid[L0_REGNUM + 5])
232 internal_error (__FILE__, __LINE__, "failed internal consistency check");
233 target_write_memory (sp,
234 &deprecated_registers[REGISTER_BYTE (L0_REGNUM)],
235 16 * REGISTER_RAW_SIZE (L0_REGNUM));
236 }
237 else
238 {
239 if (!deprecated_register_valid[regno])
240 internal_error (__FILE__, __LINE__, "failed internal consistency check");
241 target_write_memory (sp + REGISTER_BYTE (regno) - REGISTER_BYTE (L0_REGNUM),
242 &deprecated_registers[REGISTER_BYTE (regno)],
243 REGISTER_RAW_SIZE (regno));
244 }
245
246 }
247
248 if (wanna_store & INT_REGS)
249 {
250 if (!deprecated_register_valid[G1_REGNUM])
251 internal_error (__FILE__, __LINE__, "failed internal consistency check");
252
253 memcpy (&inferior_registers.r_g1,
254 &deprecated_registers[REGISTER_BYTE (G1_REGNUM)],
255 15 * REGISTER_RAW_SIZE (G1_REGNUM));
256
257 inferior_registers.r_ps =
258 *(int *) &deprecated_registers[REGISTER_BYTE (PS_REGNUM)];
259 inferior_registers.r_pc =
260 *(int *) &deprecated_registers[REGISTER_BYTE (PC_REGNUM)];
261 inferior_registers.r_npc =
262 *(int *) &deprecated_registers[REGISTER_BYTE (NPC_REGNUM)];
263 inferior_registers.r_y =
264 *(int *) &deprecated_registers[REGISTER_BYTE (Y_REGNUM)];
265
266 if (0 != ptrace (PTRACE_SETREGS, store_pid,
267 (PTRACE_ARG3_TYPE) & inferior_registers, 0))
268 perror ("ptrace_setregs");
269 }
270
271 if (wanna_store & FP_REGS)
272 {
273 if (!deprecated_register_valid[FP0_REGNUM + 9])
274 internal_error (__FILE__, __LINE__, "failed internal consistency check");
275 memcpy (&inferior_fp_registers,
276 &deprecated_registers[REGISTER_BYTE (FP0_REGNUM)],
277 sizeof inferior_fp_registers.fpu_fr);
278 memcpy (&inferior_fp_registers.Fpu_fsr,
279 &deprecated_registers[REGISTER_BYTE (FPS_REGNUM)],
280 sizeof (FPU_FSR_TYPE));
281 if (0 !=
282 ptrace (PTRACE_SETFPREGS, store_pid,
283 (PTRACE_ARG3_TYPE) & inferior_fp_registers, 0))
284 perror ("ptrace_setfpregs");
285 }
286 }
287
288 /* Provide registers to GDB from a core file.
289
290 CORE_REG_SECT points to an array of bytes, which are the contents
291 of a `note' from a core file which BFD thinks might contain
292 register contents. CORE_REG_SIZE is its size.
293
294 WHICH says which register set corelow suspects this is:
295 0 --- the general-purpose register set
296 2 --- the floating-point register set
297
298 IGNORE is unused. */
299
300 static void
301 fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
302 int which, CORE_ADDR ignore)
303 {
304
305 if (which == 0)
306 {
307
308 /* Integer registers */
309
310 #define gregs ((struct regs *)core_reg_sect)
311 /* G0 *always* holds 0. */
312 *(int *) &deprecated_registers[REGISTER_BYTE (0)] = 0;
313
314 /* The globals and output registers. */
315 memcpy (&deprecated_registers[REGISTER_BYTE (G1_REGNUM)], &gregs->r_g1,
316 15 * REGISTER_RAW_SIZE (G1_REGNUM));
317 *(int *) &deprecated_registers[REGISTER_BYTE (PS_REGNUM)] = gregs->r_ps;
318 *(int *) &deprecated_registers[REGISTER_BYTE (PC_REGNUM)] = gregs->r_pc;
319 *(int *) &deprecated_registers[REGISTER_BYTE (NPC_REGNUM)] = gregs->r_npc;
320 *(int *) &deprecated_registers[REGISTER_BYTE (Y_REGNUM)] = gregs->r_y;
321
322 /* My best guess at where to get the locals and input
323 registers is exactly where they usually are, right above
324 the stack pointer. If the core dump was caused by a bus error
325 from blowing away the stack pointer (as is possible) then this
326 won't work, but it's worth the try. */
327 {
328 int sp;
329
330 sp = *(int *) &deprecated_registers[REGISTER_BYTE (SP_REGNUM)];
331 if (0 != target_read_memory (sp,
332 &deprecated_registers[REGISTER_BYTE (L0_REGNUM)],
333 16 * REGISTER_RAW_SIZE (L0_REGNUM)))
334 {
335 /* fprintf_unfiltered so user can still use gdb */
336 fprintf_unfiltered (gdb_stderr,
337 "Couldn't read input and local registers from core file\n");
338 }
339 }
340 }
341 else if (which == 2)
342 {
343
344 /* Floating point registers */
345
346 #define fpuregs ((struct fpu *) core_reg_sect)
347 if (core_reg_size >= sizeof (struct fpu))
348 {
349 memcpy (&deprecated_registers[REGISTER_BYTE (FP0_REGNUM)],
350 fpuregs->fpu_regs, sizeof (fpuregs->fpu_regs));
351 memcpy (&deprecated_registers[REGISTER_BYTE (FPS_REGNUM)],
352 &fpuregs->fpu_fsr, sizeof (FPU_FSR_TYPE));
353 }
354 else
355 fprintf_unfiltered (gdb_stderr, "Couldn't read float regs from core file\n");
356 }
357 }
358
359 int
360 kernel_u_size (void)
361 {
362 return (sizeof (struct user));
363 }
364 \f
365
366 /* Register that we are able to handle sparc core file formats.
367 FIXME: is this really bfd_target_unknown_flavour? */
368
369 static struct core_fns sparc_core_fns =
370 {
371 bfd_target_unknown_flavour, /* core_flavour */
372 default_check_format, /* check_format */
373 default_core_sniffer, /* core_sniffer */
374 fetch_core_registers, /* core_read_registers */
375 NULL /* next */
376 };
377
378 void
379 _initialize_core_sparc (void)
380 {
381 add_core_fns (&sparc_core_fns);
382 }