* cli/cli-interp.c (cli_interpreter_resume): Update the
[deliverable/binutils-gdb.git] / gdb / sparc-tdep.c
CommitLineData
c906108c 1/* Target-dependent code for the SPARC for GDB, the GNU debugger.
cda5a58a
AC
2
3 Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
1e698235 4 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation,
cda5a58a 5 Inc.
c906108c 6
c5aa993b 7 This file is part of GDB.
c906108c 8
c5aa993b
JM
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
c906108c 13
c5aa993b
JM
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
c906108c 18
c5aa993b
JM
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330,
22 Boston, MA 02111-1307, USA. */
c906108c
SS
23
24/* ??? Support for calling functions from gdb in sparc64 is unfinished. */
25
26#include "defs.h"
5af923b0 27#include "arch-utils.h"
c906108c
SS
28#include "frame.h"
29#include "inferior.h"
c906108c
SS
30#include "target.h"
31#include "value.h"
32#include "bfd.h"
33#include "gdb_string.h"
4e052eda 34#include "regcache.h"
ef3cf062 35#include "osabi.h"
c906108c
SS
36
37#ifdef USE_PROC_FS
38#include <sys/procfs.h>
13437d4b
KB
39/* Prototypes for supply_gregset etc. */
40#include "gregset.h"
c906108c
SS
41#endif
42
43#include "gdbcore.h"
43bd9a9e 44#include "gdb_assert.h"
c906108c 45
5af923b0
MS
46#include "symfile.h" /* for 'entry_point_address' */
47
4eb8c7fc
DM
48/*
49 * Some local macros that have multi-arch and non-multi-arch versions:
50 */
51
52#if (GDB_MULTI_ARCH > 0)
53
07020390
AC
54#if 0
55// OBSOLETE /* Does the target have Floating Point registers? */
56// OBSOLETE #define SPARC_HAS_FPU (gdbarch_tdep (current_gdbarch)->has_fpu)
57#endif
58#define SPARC_HAS_FPU 1
4eb8c7fc
DM
59/* Number of bytes devoted to Floating Point registers: */
60#define FP_REGISTER_BYTES (gdbarch_tdep (current_gdbarch)->fp_register_bytes)
61/* Highest numbered Floating Point register. */
62#define FP_MAX_REGNUM (gdbarch_tdep (current_gdbarch)->fp_max_regnum)
63/* Size of a general (integer) register: */
64#define SPARC_INTREG_SIZE (gdbarch_tdep (current_gdbarch)->intreg_size)
65/* Offset within the call dummy stack of the saved registers. */
66#define DUMMY_REG_SAVE_OFFSET (gdbarch_tdep (current_gdbarch)->reg_save_offset)
67
68#else /* non-multi-arch */
69
70
71/* Does the target have Floating Point registers? */
f81824a9
AC
72#if 0
73// OBSOLETE #if defined(TARGET_SPARCLET) || defined(TARGET_SPARCLITE)
74// OBSOLETE #define SPARC_HAS_FPU 0
75// OBSOLETE #else
76// OBSOLETE #define SPARC_HAS_FPU 1
77// OBSOLETE #endif
4eb8c7fc 78#endif
f81824a9 79#define SPARC_HAS_FPU 1
4eb8c7fc
DM
80
81/* Number of bytes devoted to Floating Point registers: */
82#if (GDB_TARGET_IS_SPARC64)
83#define FP_REGISTER_BYTES (64 * 4)
84#else
85#if (SPARC_HAS_FPU)
86#define FP_REGISTER_BYTES (32 * 4)
87#else
88#define FP_REGISTER_BYTES 0
89#endif
90#endif
91
92/* Highest numbered Floating Point register. */
93#if (GDB_TARGET_IS_SPARC64)
94#define FP_MAX_REGNUM (FP0_REGNUM + 48)
95#else
96#define FP_MAX_REGNUM (FP0_REGNUM + 32)
97#endif
98
99/* Size of a general (integer) register: */
100#define SPARC_INTREG_SIZE (REGISTER_RAW_SIZE (G0_REGNUM))
101
102/* Offset within the call dummy stack of the saved registers. */
103#if (GDB_TARGET_IS_SPARC64)
104#define DUMMY_REG_SAVE_OFFSET (128 + 16)
105#else
106#define DUMMY_REG_SAVE_OFFSET 0x60
107#endif
108
109#endif /* GDB_MULTI_ARCH */
110
111struct gdbarch_tdep
112 {
f81824a9
AC
113#if 0
114 // OBSOLETE int has_fpu;
115#endif
4eb8c7fc
DM
116 int fp_register_bytes;
117 int y_regnum;
118 int fp_max_regnum;
119 int intreg_size;
120 int reg_save_offset;
121 int call_dummy_call_offset;
122 int print_insn_mach;
123 };
5af923b0
MS
124
125/* Now make GDB_TARGET_IS_SPARC64 a runtime test. */
126/* FIXME MVS: or try testing bfd_arch_info.arch and bfd_arch_info.mach ...
127 * define GDB_TARGET_IS_SPARC64 \
128 * (TARGET_ARCHITECTURE->arch == bfd_arch_sparc && \
129 * (TARGET_ARCHITECTURE->mach == bfd_mach_sparc_v9 || \
130 * TARGET_ARCHITECTURE->mach == bfd_mach_sparc_v9a))
131 */
132
c906108c
SS
133/* We don't store all registers immediately when requested, since they
134 get sent over in large chunks anyway. Instead, we accumulate most
135 of the changes and send them over once. "deferred_stores" keeps
136 track of which sets of registers we have locally-changed copies of,
137 so we only need send the groups that have changed. */
138
5af923b0 139int deferred_stores = 0; /* Accumulated stores we want to do eventually. */
c906108c
SS
140
141
f81824a9
AC
142#if 0
143// OBSOLETE /* Some machines, such as Fujitsu SPARClite 86x, have a bi-endian mode
144// OBSOLETE where instructions are big-endian and data are little-endian.
145// OBSOLETE This flag is set when we detect that the target is of this type. */
146// OBSOLETE
147// OBSOLETE int bi_endian = 0;
148#endif
c906108c
SS
149
150
aaab4dba
AC
151const unsigned char *
152sparc_breakpoint_from_pc (CORE_ADDR *pc, int *len)
153{
154 static const char breakpoint[] = {0x91, 0xd0, 0x20, 0x01};
155 (*len) = sizeof (breakpoint);
156 return breakpoint;
157}
158
c906108c
SS
159/* Fetch a single instruction. Even on bi-endian machines
160 such as sparc86x, instructions are always big-endian. */
161
162static unsigned long
fba45db2 163fetch_instruction (CORE_ADDR pc)
c906108c
SS
164{
165 unsigned long retval;
166 int i;
167 unsigned char buf[4];
168
169 read_memory (pc, buf, sizeof (buf));
170
171 /* Start at the most significant end of the integer, and work towards
172 the least significant. */
173 retval = 0;
174 for (i = 0; i < sizeof (buf); ++i)
175 retval = (retval << 8) | buf[i];
176 return retval;
177}
178
179
180/* Branches with prediction are treated like their non-predicting cousins. */
181/* FIXME: What about floating point branches? */
182
183/* Macros to extract fields from sparc instructions. */
184#define X_OP(i) (((i) >> 30) & 0x3)
185#define X_RD(i) (((i) >> 25) & 0x1f)
186#define X_A(i) (((i) >> 29) & 1)
187#define X_COND(i) (((i) >> 25) & 0xf)
188#define X_OP2(i) (((i) >> 22) & 0x7)
189#define X_IMM22(i) ((i) & 0x3fffff)
190#define X_OP3(i) (((i) >> 19) & 0x3f)
191#define X_RS1(i) (((i) >> 14) & 0x1f)
192#define X_I(i) (((i) >> 13) & 1)
193#define X_IMM13(i) ((i) & 0x1fff)
194/* Sign extension macros. */
195#define X_SIMM13(i) ((X_IMM13 (i) ^ 0x1000) - 0x1000)
196#define X_DISP22(i) ((X_IMM22 (i) ^ 0x200000) - 0x200000)
197#define X_CC(i) (((i) >> 20) & 3)
198#define X_P(i) (((i) >> 19) & 1)
199#define X_DISP19(i) ((((i) & 0x7ffff) ^ 0x40000) - 0x40000)
200#define X_RCOND(i) (((i) >> 25) & 7)
201#define X_DISP16(i) ((((((i) >> 6) && 0xc000) | ((i) & 0x3fff)) ^ 0x8000) - 0x8000)
202#define X_FCN(i) (((i) >> 25) & 31)
203
204typedef enum
205{
5af923b0
MS
206 Error, not_branch, bicc, bicca, ba, baa, ticc, ta, done_retry
207} branch_type;
c906108c
SS
208
209/* Simulate single-step ptrace call for sun4. Code written by Gary
210 Beihl (beihl@mcc.com). */
211
212/* npc4 and next_pc describe the situation at the time that the
213 step-breakpoint was set, not necessary the current value of NPC_REGNUM. */
214static CORE_ADDR next_pc, npc4, target;
215static int brknpc4, brktrg;
216typedef char binsn_quantum[BREAKPOINT_MAX];
217static binsn_quantum break_mem[3];
218
5af923b0 219static branch_type isbranch (long, CORE_ADDR, CORE_ADDR *);
c906108c
SS
220
221/* single_step() is called just before we want to resume the inferior,
222 if we want to single-step it but there is no hardware or kernel single-step
223 support (as on all SPARCs). We find all the possible targets of the
224 coming instruction and breakpoint them.
225
226 single_step is also called just after the inferior stops. If we had
227 set up a simulated single-step, we undo our damage. */
228
229void
fba45db2
KB
230sparc_software_single_step (enum target_signal ignore, /* pid, but we don't need it */
231 int insert_breakpoints_p)
c906108c
SS
232{
233 branch_type br;
234 CORE_ADDR pc;
235 long pc_instruction;
236
237 if (insert_breakpoints_p)
238 {
239 /* Always set breakpoint for NPC. */
240 next_pc = read_register (NPC_REGNUM);
c5aa993b 241 npc4 = next_pc + 4; /* branch not taken */
c906108c
SS
242
243 target_insert_breakpoint (next_pc, break_mem[0]);
244 /* printf_unfiltered ("set break at %x\n",next_pc); */
245
246 pc = read_register (PC_REGNUM);
247 pc_instruction = fetch_instruction (pc);
248 br = isbranch (pc_instruction, pc, &target);
249 brknpc4 = brktrg = 0;
250
251 if (br == bicca)
252 {
253 /* Conditional annulled branch will either end up at
254 npc (if taken) or at npc+4 (if not taken).
255 Trap npc+4. */
256 brknpc4 = 1;
257 target_insert_breakpoint (npc4, break_mem[1]);
258 }
259 else if (br == baa && target != next_pc)
260 {
261 /* Unconditional annulled branch will always end up at
262 the target. */
263 brktrg = 1;
264 target_insert_breakpoint (target, break_mem[2]);
265 }
5af923b0 266 else if (GDB_TARGET_IS_SPARC64 && br == done_retry)
c906108c
SS
267 {
268 brktrg = 1;
269 target_insert_breakpoint (target, break_mem[2]);
270 }
c906108c
SS
271 }
272 else
273 {
274 /* Remove breakpoints */
275 target_remove_breakpoint (next_pc, break_mem[0]);
276
277 if (brknpc4)
278 target_remove_breakpoint (npc4, break_mem[1]);
279
280 if (brktrg)
281 target_remove_breakpoint (target, break_mem[2]);
282 }
283}
284\f
5af923b0
MS
285struct frame_extra_info
286{
287 CORE_ADDR bottom;
288 int in_prologue;
289 int flat;
290 /* Following fields only relevant for flat frames. */
291 CORE_ADDR pc_addr;
292 CORE_ADDR fp_addr;
293 /* Add this to ->frame to get the value of the stack pointer at the
294 time of the register saves. */
295 int sp_offset;
296};
297
298/* Call this for each newly created frame. For SPARC, we need to
299 calculate the bottom of the frame, and do some extra work if the
300 prologue has been generated via the -mflat option to GCC. In
301 particular, we need to know where the previous fp and the pc have
302 been stashed, since their exact position within the frame may vary. */
c906108c
SS
303
304void
fba45db2 305sparc_init_extra_frame_info (int fromleaf, struct frame_info *fi)
c906108c
SS
306{
307 char *name;
308 CORE_ADDR prologue_start, prologue_end;
309 int insn;
310
a00a19e9 311 frame_extra_info_zalloc (fi, sizeof (struct frame_extra_info));
5af923b0
MS
312 frame_saved_regs_zalloc (fi);
313
da50a4b7 314 get_frame_extra_info (fi)->bottom =
11c02a10
AC
315 (get_next_frame (fi)
316 ? (get_frame_base (fi) == get_frame_base (get_next_frame (fi))
da50a4b7 317 ? get_frame_extra_info (get_next_frame (fi))->bottom
11c02a10
AC
318 : get_frame_base (get_next_frame (fi)))
319 : read_sp ());
c906108c 320
0ba6dca9
AC
321 /* If fi->next is NULL, then we already set ->frame by passing
322 deprecated_read_fp() to create_new_frame. */
11c02a10 323 if (get_next_frame (fi))
c906108c 324 {
d9d9c31f 325 char buf[MAX_REGISTER_SIZE];
c906108c
SS
326
327 /* Compute ->frame as if not flat. If it is flat, we'll change
c5aa993b 328 it later. */
11c02a10
AC
329 if (get_next_frame (get_next_frame (fi)) != NULL
330 && ((get_frame_type (get_next_frame (get_next_frame (fi))) == SIGTRAMP_FRAME)
331 || deprecated_frame_in_dummy (get_next_frame (get_next_frame (fi))))
332 && frameless_look_for_prologue (get_next_frame (fi)))
c906108c
SS
333 {
334 /* A frameless function interrupted by a signal did not change
335 the frame pointer, fix up frame pointer accordingly. */
11c02a10 336 deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
da50a4b7
AC
337 get_frame_extra_info (fi)->bottom =
338 get_frame_extra_info (get_next_frame (fi))->bottom;
c906108c
SS
339 }
340 else
341 {
342 /* Should we adjust for stack bias here? */
ac2adee5 343 ULONGEST tmp;
0ba6dca9 344 frame_read_unsigned_register (fi, DEPRECATED_FP_REGNUM, &tmp);
ac2adee5 345 deprecated_update_frame_base_hack (fi, tmp);
1e2330ba
AC
346 if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
347 deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
c906108c
SS
348 }
349 }
350
351 /* Decide whether this is a function with a ``flat register window''
352 frame. For such functions, the frame pointer is actually in %i7. */
da50a4b7
AC
353 get_frame_extra_info (fi)->flat = 0;
354 get_frame_extra_info (fi)->in_prologue = 0;
50abf9e5 355 if (find_pc_partial_function (get_frame_pc (fi), &name, &prologue_start, &prologue_end))
c906108c
SS
356 {
357 /* See if the function starts with an add (which will be of a
c5aa993b
JM
358 negative number if a flat frame) to the sp. FIXME: Does not
359 handle large frames which will need more than one instruction
360 to adjust the sp. */
d0901120 361 insn = fetch_instruction (prologue_start);
c906108c
SS
362 if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0
363 && X_I (insn) && X_SIMM13 (insn) < 0)
364 {
365 int offset = X_SIMM13 (insn);
366
367 /* Then look for a save of %i7 into the frame. */
368 insn = fetch_instruction (prologue_start + 4);
369 if (X_OP (insn) == 3
370 && X_RD (insn) == 31
371 && X_OP3 (insn) == 4
372 && X_RS1 (insn) == 14)
373 {
d9d9c31f 374 char buf[MAX_REGISTER_SIZE];
c906108c
SS
375
376 /* We definitely have a flat frame now. */
da50a4b7 377 get_frame_extra_info (fi)->flat = 1;
c906108c 378
da50a4b7 379 get_frame_extra_info (fi)->sp_offset = offset;
c906108c
SS
380
381 /* Overwrite the frame's address with the value in %i7. */
ac2adee5
AC
382 {
383 ULONGEST tmp;
384 frame_read_unsigned_register (fi, I7_REGNUM, &tmp);
385 deprecated_update_frame_base_hack (fi, tmp);
386 }
5af923b0 387
1e2330ba
AC
388 if (GDB_TARGET_IS_SPARC64 && (get_frame_base (fi) & 1))
389 deprecated_update_frame_base_hack (fi, get_frame_base (fi) + 2047);
5af923b0 390
c906108c 391 /* Record where the fp got saved. */
da50a4b7
AC
392 get_frame_extra_info (fi)->fp_addr =
393 get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
c906108c
SS
394
395 /* Also try to collect where the pc got saved to. */
da50a4b7 396 get_frame_extra_info (fi)->pc_addr = 0;
c906108c
SS
397 insn = fetch_instruction (prologue_start + 12);
398 if (X_OP (insn) == 3
399 && X_RD (insn) == 15
400 && X_OP3 (insn) == 4
401 && X_RS1 (insn) == 14)
da50a4b7
AC
402 get_frame_extra_info (fi)->pc_addr =
403 get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
c906108c
SS
404 }
405 }
c5aa993b
JM
406 else
407 {
408 /* Check if the PC is in the function prologue before a SAVE
409 instruction has been executed yet. If so, set the frame
410 to the current value of the stack pointer and set
411 the in_prologue flag. */
412 CORE_ADDR addr;
413 struct symtab_and_line sal;
414
415 sal = find_pc_line (prologue_start, 0);
416 if (sal.line == 0) /* no line info, use PC */
50abf9e5 417 prologue_end = get_frame_pc (fi);
c5aa993b
JM
418 else if (sal.end < prologue_end)
419 prologue_end = sal.end;
50abf9e5 420 if (get_frame_pc (fi) < prologue_end)
c5aa993b 421 {
50abf9e5 422 for (addr = prologue_start; addr < get_frame_pc (fi); addr += 4)
c5aa993b
JM
423 {
424 insn = read_memory_integer (addr, 4);
425 if (X_OP (insn) == 2 && X_OP3 (insn) == 0x3c)
426 break; /* SAVE seen, stop searching */
427 }
50abf9e5 428 if (addr >= get_frame_pc (fi))
c5aa993b 429 {
da50a4b7 430 get_frame_extra_info (fi)->in_prologue = 1;
8ccd593b 431 deprecated_update_frame_base_hack (fi, read_register (SP_REGNUM));
c5aa993b
JM
432 }
433 }
434 }
c906108c 435 }
11c02a10 436 if (get_next_frame (fi) && get_frame_base (fi) == 0)
c906108c
SS
437 {
438 /* Kludge to cause init_prev_frame_info to destroy the new frame. */
11c02a10
AC
439 deprecated_update_frame_base_hack (fi, get_frame_base (get_next_frame (fi)));
440 deprecated_update_frame_pc_hack (fi, get_frame_pc (get_next_frame (fi)));
c906108c
SS
441 }
442}
443
444CORE_ADDR
fba45db2 445sparc_frame_chain (struct frame_info *frame)
c906108c 446{
618ce49f
AC
447 /* Value that will cause DEPRECATED_FRAME_CHAIN_VALID to not worry
448 about the chain value. If it really is zero, we detect it later
449 in sparc_init_prev_frame.
881324eb 450
e6ba3bc9
AC
451 Note: kevinb/2003-02-18: The constant 1 used to be returned here,
452 but, after some recent changes to legacy_frame_chain_valid(),
453 this value is no longer suitable for causing
454 legacy_frame_chain_valid() to "not worry about the chain value."
455 The constant ~0 (i.e, 0xfff...) causes the failing test in
456 legacy_frame_chain_valid() to succeed thus preserving the "not
457 worry" property. I had considered using something like
458 ``get_frame_base (frame) + 1''. However, I think a constant
459 value is better, because when debugging this problem, I knew that
460 something funny was going on as soon as I saw the constant 1
461 being used as the frame chain elsewhere in GDB. */
881324eb
KB
462
463 return ~ (CORE_ADDR) 0;
c906108c
SS
464}
465
c906108c
SS
466/* Find the pc saved in frame FRAME. */
467
468CORE_ADDR
fba45db2 469sparc_frame_saved_pc (struct frame_info *frame)
c906108c 470{
d9d9c31f 471 char buf[MAX_REGISTER_SIZE];
c906108c
SS
472 CORE_ADDR addr;
473
5a203e44 474 if ((get_frame_type (frame) == SIGTRAMP_FRAME))
c906108c
SS
475 {
476 /* This is the signal trampoline frame.
c5aa993b 477 Get the saved PC from the sigcontext structure. */
c906108c
SS
478
479#ifndef SIGCONTEXT_PC_OFFSET
480#define SIGCONTEXT_PC_OFFSET 12
481#endif
482
483 CORE_ADDR sigcontext_addr;
5af923b0 484 char *scbuf;
c906108c
SS
485 int saved_pc_offset = SIGCONTEXT_PC_OFFSET;
486 char *name = NULL;
487
5af923b0
MS
488 scbuf = alloca (TARGET_PTR_BIT / HOST_CHAR_BIT);
489
c906108c 490 /* Solaris2 ucbsigvechandler passes a pointer to a sigcontext
c5aa993b 491 as the third parameter. The offset to the saved pc is 12. */
50abf9e5 492 find_pc_partial_function (get_frame_pc (frame), &name,
c5aa993b 493 (CORE_ADDR *) NULL, (CORE_ADDR *) NULL);
c906108c
SS
494 if (name && STREQ (name, "ucbsigvechandler"))
495 saved_pc_offset = 12;
496
497 /* The sigcontext address is contained in register O2. */
ac2adee5
AC
498 {
499 ULONGEST tmp;
500 frame_read_unsigned_register (frame, O0_REGNUM + 2, &tmp);
501 sigcontext_addr = tmp;
502 }
c906108c
SS
503
504 /* Don't cause a memory_error when accessing sigcontext in case the
c5aa993b 505 stack layout has changed or the stack is corrupt. */
c906108c
SS
506 target_read_memory (sigcontext_addr + saved_pc_offset,
507 scbuf, sizeof (scbuf));
7c0b4a20 508 return extract_unsigned_integer (scbuf, sizeof (scbuf));
c906108c 509 }
da50a4b7 510 else if (get_frame_extra_info (frame)->in_prologue ||
11c02a10
AC
511 (get_next_frame (frame) != NULL &&
512 ((get_frame_type (get_next_frame (frame)) == SIGTRAMP_FRAME) ||
513 deprecated_frame_in_dummy (get_next_frame (frame))) &&
5af923b0 514 frameless_look_for_prologue (frame)))
c906108c
SS
515 {
516 /* A frameless function interrupted by a signal did not save
c5aa993b 517 the PC, it is still in %o7. */
ac2adee5
AC
518 ULONGEST tmp;
519 frame_read_unsigned_register (frame, O7_REGNUM, &tmp);
520 return PC_ADJUST (tmp);
c906108c 521 }
da50a4b7
AC
522 if (get_frame_extra_info (frame)->flat)
523 addr = get_frame_extra_info (frame)->pc_addr;
c906108c 524 else
da50a4b7 525 addr = get_frame_extra_info (frame)->bottom + FRAME_SAVED_I0 +
c906108c
SS
526 SPARC_INTREG_SIZE * (I7_REGNUM - I0_REGNUM);
527
528 if (addr == 0)
529 /* A flat frame leaf function might not save the PC anywhere,
530 just leave it in %o7. */
531 return PC_ADJUST (read_register (O7_REGNUM));
532
533 read_memory (addr, buf, SPARC_INTREG_SIZE);
7c0b4a20 534 return PC_ADJUST (extract_unsigned_integer (buf, SPARC_INTREG_SIZE));
c906108c
SS
535}
536
537/* Since an individual frame in the frame cache is defined by two
538 arguments (a frame pointer and a stack pointer), we need two
539 arguments to get info for an arbitrary stack frame. This routine
540 takes two arguments and makes the cached frames look as if these
541 two arguments defined a frame on the cache. This allows the rest
542 of info frame to extract the important arguments without
543 difficulty. */
544
545struct frame_info *
fba45db2 546setup_arbitrary_frame (int argc, CORE_ADDR *argv)
c906108c
SS
547{
548 struct frame_info *frame;
549
550 if (argc != 2)
551 error ("Sparc frame specifications require two arguments: fp and sp");
552
553 frame = create_new_frame (argv[0], 0);
554
555 if (!frame)
8e65ff28
AC
556 internal_error (__FILE__, __LINE__,
557 "create_new_frame returned invalid frame");
c5aa993b 558
da50a4b7 559 get_frame_extra_info (frame)->bottom = argv[1];
8bedc050 560 deprecated_update_frame_pc_hack (frame, DEPRECATED_FRAME_SAVED_PC (frame));
c906108c
SS
561 return frame;
562}
563
564/* Given a pc value, skip it forward past the function prologue by
565 disassembling instructions that appear to be a prologue.
566
567 If FRAMELESS_P is set, we are only testing to see if the function
568 is frameless. This allows a quicker answer.
569
570 This routine should be more specific in its actions; making sure
571 that it uses the same register in the initial prologue section. */
572
5af923b0
MS
573static CORE_ADDR examine_prologue (CORE_ADDR, int, struct frame_info *,
574 CORE_ADDR *);
c906108c 575
c5aa993b 576static CORE_ADDR
fba45db2
KB
577examine_prologue (CORE_ADDR start_pc, int frameless_p, struct frame_info *fi,
578 CORE_ADDR *saved_regs)
c906108c
SS
579{
580 int insn;
581 int dest = -1;
582 CORE_ADDR pc = start_pc;
583 int is_flat = 0;
584
585 insn = fetch_instruction (pc);
586
587 /* Recognize the `sethi' insn and record its destination. */
588 if (X_OP (insn) == 0 && X_OP2 (insn) == 4)
589 {
590 dest = X_RD (insn);
591 pc += 4;
592 insn = fetch_instruction (pc);
593 }
594
595 /* Recognize an add immediate value to register to either %g1 or
596 the destination register recorded above. Actually, this might
597 well recognize several different arithmetic operations.
598 It doesn't check that rs1 == rd because in theory "sub %g0, 5, %g1"
599 followed by "save %sp, %g1, %sp" is a valid prologue (Not that
600 I imagine any compiler really does that, however). */
601 if (X_OP (insn) == 2
602 && X_I (insn)
603 && (X_RD (insn) == 1 || X_RD (insn) == dest))
604 {
605 pc += 4;
606 insn = fetch_instruction (pc);
607 }
608
609 /* Recognize any SAVE insn. */
610 if (X_OP (insn) == 2 && X_OP3 (insn) == 60)
611 {
612 pc += 4;
c5aa993b
JM
613 if (frameless_p) /* If the save is all we care about, */
614 return pc; /* return before doing more work */
c906108c
SS
615 insn = fetch_instruction (pc);
616 }
617 /* Recognize add to %sp. */
618 else if (X_OP (insn) == 2 && X_RD (insn) == 14 && X_OP3 (insn) == 0)
619 {
620 pc += 4;
c5aa993b
JM
621 if (frameless_p) /* If the add is all we care about, */
622 return pc; /* return before doing more work */
c906108c
SS
623 is_flat = 1;
624 insn = fetch_instruction (pc);
625 /* Recognize store of frame pointer (i7). */
626 if (X_OP (insn) == 3
627 && X_RD (insn) == 31
628 && X_OP3 (insn) == 4
629 && X_RS1 (insn) == 14)
630 {
631 pc += 4;
632 insn = fetch_instruction (pc);
633
634 /* Recognize sub %sp, <anything>, %i7. */
c5aa993b 635 if (X_OP (insn) == 2
c906108c
SS
636 && X_OP3 (insn) == 4
637 && X_RS1 (insn) == 14
638 && X_RD (insn) == 31)
639 {
640 pc += 4;
641 insn = fetch_instruction (pc);
642 }
643 else
644 return pc;
645 }
646 else
647 return pc;
648 }
649 else
650 /* Without a save or add instruction, it's not a prologue. */
651 return start_pc;
652
653 while (1)
654 {
655 /* Recognize stores into the frame from the input registers.
5af923b0
MS
656 This recognizes all non alternate stores of an input register,
657 into a location offset from the frame pointer between
658 +68 and +92. */
659
660 /* The above will fail for arguments that are promoted
661 (eg. shorts to ints or floats to doubles), because the compiler
662 will pass them in positive-offset frame space, but the prologue
663 will save them (after conversion) in negative frame space at an
664 unpredictable offset. Therefore I am going to remove the
665 restriction on the target-address of the save, on the theory
666 that any unbroken sequence of saves from input registers must
667 be part of the prologue. In un-optimized code (at least), I'm
668 fairly sure that the compiler would emit SOME other instruction
669 (eg. a move or add) before emitting another save that is actually
670 a part of the function body.
671
672 Besides, the reserved stack space is different for SPARC64 anyway.
673
674 MVS 4/23/2000 */
675
676 if (X_OP (insn) == 3
677 && (X_OP3 (insn) & 0x3c) == 4 /* Store, non-alternate. */
678 && (X_RD (insn) & 0x18) == 0x18 /* Input register. */
679 && X_I (insn) /* Immediate mode. */
680 && X_RS1 (insn) == 30) /* Off of frame pointer. */
681 ; /* empty statement -- fall thru to end of loop */
682 else if (GDB_TARGET_IS_SPARC64
683 && X_OP (insn) == 3
684 && (X_OP3 (insn) & 0x3c) == 12 /* store, extended (64-bit) */
685 && (X_RD (insn) & 0x18) == 0x18 /* input register */
686 && X_I (insn) /* immediate mode */
687 && X_RS1 (insn) == 30) /* off of frame pointer */
688 ; /* empty statement -- fall thru to end of loop */
689 else if (X_OP (insn) == 3
690 && (X_OP3 (insn) & 0x3c) == 36 /* store, floating-point */
691 && X_I (insn) /* immediate mode */
692 && X_RS1 (insn) == 30) /* off of frame pointer */
693 ; /* empty statement -- fall thru to end of loop */
c906108c
SS
694 else if (is_flat
695 && X_OP (insn) == 3
5af923b0
MS
696 && X_OP3 (insn) == 4 /* store? */
697 && X_RS1 (insn) == 14) /* off of frame pointer */
c906108c
SS
698 {
699 if (saved_regs && X_I (insn))
5af923b0 700 saved_regs[X_RD (insn)] =
da50a4b7 701 get_frame_base (fi) + get_frame_extra_info (fi)->sp_offset + X_SIMM13 (insn);
c906108c
SS
702 }
703 else
704 break;
705 pc += 4;
706 insn = fetch_instruction (pc);
707 }
708
709 return pc;
710}
711
f510d44e
DM
712/* Advance PC across any function entry prologue instructions to reach
713 some "real" code. */
714
c5aa993b 715CORE_ADDR
f510d44e 716sparc_skip_prologue (CORE_ADDR start_pc)
c906108c 717{
f510d44e
DM
718 struct symtab_and_line sal;
719 CORE_ADDR func_start, func_end;
720
721 /* This is the preferred method, find the end of the prologue by
722 using the debugging information. */
723 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
724 {
725 sal = find_pc_line (func_start, 0);
726
727 if (sal.end < func_end
728 && start_pc <= sal.end)
729 return sal.end;
730 }
731
732 /* Oh well, examine the code by hand. */
733 return examine_prologue (start_pc, 0, NULL, NULL);
c906108c
SS
734}
735
9319a2fe
DM
736/* Is the prologue at IP frameless? */
737
738int
739sparc_prologue_frameless_p (CORE_ADDR ip)
740{
f510d44e 741 return ip == examine_prologue (ip, 1, NULL, NULL);
9319a2fe
DM
742}
743
c906108c
SS
744/* Check instruction at ADDR to see if it is a branch.
745 All non-annulled instructions will go to NPC or will trap.
746 Set *TARGET if we find a candidate branch; set to zero if not.
747
748 This isn't static as it's used by remote-sa.sparc.c. */
749
750static branch_type
fba45db2 751isbranch (long instruction, CORE_ADDR addr, CORE_ADDR *target)
c906108c
SS
752{
753 branch_type val = not_branch;
754 long int offset = 0; /* Must be signed for sign-extend. */
755
756 *target = 0;
757
758 if (X_OP (instruction) == 0
759 && (X_OP2 (instruction) == 2
760 || X_OP2 (instruction) == 6
761 || X_OP2 (instruction) == 1
762 || X_OP2 (instruction) == 3
763 || X_OP2 (instruction) == 5
5af923b0 764 || (GDB_TARGET_IS_SPARC64 && X_OP2 (instruction) == 7)))
c906108c
SS
765 {
766 if (X_COND (instruction) == 8)
767 val = X_A (instruction) ? baa : ba;
768 else
769 val = X_A (instruction) ? bicca : bicc;
770 switch (X_OP2 (instruction))
771 {
5af923b0
MS
772 case 7:
773 if (!GDB_TARGET_IS_SPARC64)
774 break;
775 /* else fall thru */
c906108c
SS
776 case 2:
777 case 6:
c906108c
SS
778 offset = 4 * X_DISP22 (instruction);
779 break;
780 case 1:
781 case 5:
782 offset = 4 * X_DISP19 (instruction);
783 break;
784 case 3:
785 offset = 4 * X_DISP16 (instruction);
786 break;
787 }
788 *target = addr + offset;
789 }
5af923b0
MS
790 else if (GDB_TARGET_IS_SPARC64
791 && X_OP (instruction) == 2
c906108c
SS
792 && X_OP3 (instruction) == 62)
793 {
794 if (X_FCN (instruction) == 0)
795 {
796 /* done */
797 *target = read_register (TNPC_REGNUM);
798 val = done_retry;
799 }
800 else if (X_FCN (instruction) == 1)
801 {
802 /* retry */
803 *target = read_register (TPC_REGNUM);
804 val = done_retry;
805 }
806 }
c906108c
SS
807
808 return val;
809}
810\f
811/* Find register number REGNUM relative to FRAME and put its
812 (raw) contents in *RAW_BUFFER. Set *OPTIMIZED if the variable
813 was optimized out (and thus can't be fetched). If the variable
814 was fetched from memory, set *ADDRP to where it was fetched from,
815 otherwise it was fetched from a register.
816
817 The argument RAW_BUFFER must point to aligned memory. */
818
819void
fba45db2
KB
820sparc_get_saved_register (char *raw_buffer, int *optimized, CORE_ADDR *addrp,
821 struct frame_info *frame, int regnum,
822 enum lval_type *lval)
c906108c
SS
823{
824 struct frame_info *frame1;
825 CORE_ADDR addr;
826
827 if (!target_has_registers)
828 error ("No registers.");
829
830 if (optimized)
831 *optimized = 0;
832
833 addr = 0;
834
835 /* FIXME This code extracted from infcmd.c; should put elsewhere! */
836 if (frame == NULL)
837 {
838 /* error ("No selected frame."); */
839 if (!target_has_registers)
c5aa993b 840 error ("The program has no registers now.");
6e7f8b9c 841 if (deprecated_selected_frame == NULL)
c5aa993b 842 error ("No selected frame.");
c906108c 843 /* Try to use selected frame */
6e7f8b9c 844 frame = get_prev_frame (deprecated_selected_frame);
c906108c 845 if (frame == 0)
c5aa993b 846 error ("Cmd not meaningful in the outermost frame.");
c906108c
SS
847 }
848
849
11c02a10 850 frame1 = get_next_frame (frame);
c906108c
SS
851
852 /* Get saved PC from the frame info if not in innermost frame. */
853 if (regnum == PC_REGNUM && frame1 != NULL)
854 {
855 if (lval != NULL)
856 *lval = not_lval;
857 if (raw_buffer != NULL)
858 {
859 /* Put it back in target format. */
fbd9dcd3 860 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), get_frame_pc (frame));
c906108c
SS
861 }
862 if (addrp != NULL)
863 *addrp = 0;
864 return;
865 }
866
867 while (frame1 != NULL)
868 {
5af923b0
MS
869 /* FIXME MVS: wrong test for dummy frame at entry. */
870
da50a4b7
AC
871 if (get_frame_pc (frame1) >= (get_frame_extra_info (frame1)->bottom
872 ? get_frame_extra_info (frame1)->bottom
873 : read_sp ())
50abf9e5 874 && get_frame_pc (frame1) <= get_frame_base (frame1))
c906108c
SS
875 {
876 /* Dummy frame. All but the window regs are in there somewhere.
877 The window registers are saved on the stack, just like in a
878 normal frame. */
879 if (regnum >= G1_REGNUM && regnum < G1_REGNUM + 7)
1e2330ba 880 addr = get_frame_base (frame1) + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
c906108c
SS
881 - (FP_REGISTER_BYTES + 8 * SPARC_INTREG_SIZE);
882 else if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
f621c63e
AC
883 /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
884 is safe/cheap - there will always be a prev frame.
885 This is because frame1 is initialized to frame->next
886 (frame1->prev == frame) and is then advanced towards
887 the innermost (next) frame. */
da50a4b7 888 addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
c906108c
SS
889 + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
890 + FRAME_SAVED_I0);
891 else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
f621c63e
AC
892 /* NOTE: cagney/2002-05-04: The call to get_prev_frame()
893 is safe/cheap - there will always be a prev frame.
894 This is because frame1 is initialized to frame->next
895 (frame1->prev == frame) and is then advanced towards
896 the innermost (next) frame. */
da50a4b7 897 addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
c906108c
SS
898 + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
899 + FRAME_SAVED_L0);
900 else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
1e2330ba 901 addr = get_frame_base (frame1) + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
c906108c 902 - (FP_REGISTER_BYTES + 16 * SPARC_INTREG_SIZE);
5af923b0 903 else if (SPARC_HAS_FPU &&
60054393 904 regnum >= FP0_REGNUM && regnum < FP0_REGNUM + 32)
1e2330ba 905 addr = get_frame_base (frame1) + (regnum - FP0_REGNUM) * 4
c906108c 906 - (FP_REGISTER_BYTES);
5af923b0 907 else if (GDB_TARGET_IS_SPARC64 && SPARC_HAS_FPU &&
60054393 908 regnum >= FP0_REGNUM + 32 && regnum < FP_MAX_REGNUM)
1e2330ba 909 addr = get_frame_base (frame1) + 32 * 4 + (regnum - FP0_REGNUM - 32) * 8
c906108c 910 - (FP_REGISTER_BYTES);
c906108c 911 else if (regnum >= Y_REGNUM && regnum < NUM_REGS)
1e2330ba 912 addr = get_frame_base (frame1) + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
c906108c
SS
913 - (FP_REGISTER_BYTES + 24 * SPARC_INTREG_SIZE);
914 }
da50a4b7 915 else if (get_frame_extra_info (frame1)->flat)
c906108c
SS
916 {
917
918 if (regnum == RP_REGNUM)
da50a4b7 919 addr = get_frame_extra_info (frame1)->pc_addr;
c906108c 920 else if (regnum == I7_REGNUM)
da50a4b7 921 addr = get_frame_extra_info (frame1)->fp_addr;
c906108c
SS
922 else
923 {
924 CORE_ADDR func_start;
5af923b0
MS
925 CORE_ADDR *regs;
926
927 regs = alloca (NUM_REGS * sizeof (CORE_ADDR));
928 memset (regs, 0, NUM_REGS * sizeof (CORE_ADDR));
c906108c 929
50abf9e5 930 find_pc_partial_function (get_frame_pc (frame1), NULL, &func_start, NULL);
5af923b0
MS
931 examine_prologue (func_start, 0, frame1, regs);
932 addr = regs[regnum];
c906108c
SS
933 }
934 }
935 else
936 {
937 /* Normal frame. Local and In registers are saved on stack. */
938 if (regnum >= I0_REGNUM && regnum < I0_REGNUM + 8)
da50a4b7 939 addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
c906108c
SS
940 + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
941 + FRAME_SAVED_I0);
942 else if (regnum >= L0_REGNUM && regnum < L0_REGNUM + 8)
da50a4b7 943 addr = (get_frame_extra_info (get_prev_frame (frame1))->bottom
c906108c
SS
944 + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
945 + FRAME_SAVED_L0);
946 else if (regnum >= O0_REGNUM && regnum < O0_REGNUM + 8)
947 {
948 /* Outs become ins. */
ac2adee5
AC
949 int realnum;
950 frame_register (frame1, (regnum - O0_REGNUM + I0_REGNUM),
951 optimized, lval, addrp, &realnum, raw_buffer);
c906108c
SS
952 return;
953 }
954 }
955 if (addr != 0)
956 break;
11c02a10 957 frame1 = get_next_frame (frame1);
c906108c
SS
958 }
959 if (addr != 0)
960 {
961 if (lval != NULL)
962 *lval = lval_memory;
963 if (regnum == SP_REGNUM)
964 {
965 if (raw_buffer != NULL)
966 {
967 /* Put it back in target format. */
fbd9dcd3 968 store_unsigned_integer (raw_buffer, REGISTER_RAW_SIZE (regnum), addr);
c906108c
SS
969 }
970 if (addrp != NULL)
971 *addrp = 0;
972 return;
973 }
974 if (raw_buffer != NULL)
975 read_memory (addr, raw_buffer, REGISTER_RAW_SIZE (regnum));
976 }
977 else
978 {
979 if (lval != NULL)
980 *lval = lval_register;
981 addr = REGISTER_BYTE (regnum);
982 if (raw_buffer != NULL)
4caf0990 983 deprecated_read_register_gen (regnum, raw_buffer);
c906108c
SS
984 }
985 if (addrp != NULL)
986 *addrp = addr;
987}
988
989/* Push an empty stack frame, and record in it the current PC, regs, etc.
990
991 We save the non-windowed registers and the ins. The locals and outs
992 are new; they don't need to be saved. The i's and l's of
993 the last frame were already saved on the stack. */
994
995/* Definitely see tm-sparc.h for more doc of the frame format here. */
996
c906108c 997/* See tm-sparc.h for how this is calculated. */
5af923b0 998
c906108c 999#define DUMMY_STACK_REG_BUF_SIZE \
60054393 1000 (((8+8+8) * SPARC_INTREG_SIZE) + FP_REGISTER_BYTES)
5af923b0
MS
1001#define DUMMY_STACK_SIZE \
1002 (DUMMY_STACK_REG_BUF_SIZE + DUMMY_REG_SAVE_OFFSET)
c906108c
SS
1003
1004void
fba45db2 1005sparc_push_dummy_frame (void)
c906108c
SS
1006{
1007 CORE_ADDR sp, old_sp;
5af923b0
MS
1008 char *register_temp;
1009
1010 register_temp = alloca (DUMMY_STACK_SIZE);
c906108c
SS
1011
1012 old_sp = sp = read_sp ();
1013
5af923b0
MS
1014 if (GDB_TARGET_IS_SPARC64)
1015 {
1016 /* PC, NPC, CCR, FSR, FPRS, Y, ASI */
73937e03
AC
1017 deprecated_read_register_bytes (REGISTER_BYTE (PC_REGNUM),
1018 &register_temp[0],
1019 REGISTER_RAW_SIZE (PC_REGNUM) * 7);
1020 deprecated_read_register_bytes (REGISTER_BYTE (PSTATE_REGNUM),
1021 &register_temp[7 * SPARC_INTREG_SIZE],
1022 REGISTER_RAW_SIZE (PSTATE_REGNUM));
5af923b0
MS
1023 /* FIXME: not sure what needs to be saved here. */
1024 }
1025 else
1026 {
1027 /* Y, PS, WIM, TBR, PC, NPC, FPS, CPS regs */
73937e03
AC
1028 deprecated_read_register_bytes (REGISTER_BYTE (Y_REGNUM),
1029 &register_temp[0],
1030 REGISTER_RAW_SIZE (Y_REGNUM) * 8);
5af923b0 1031 }
c906108c 1032
73937e03
AC
1033 deprecated_read_register_bytes (REGISTER_BYTE (O0_REGNUM),
1034 &register_temp[8 * SPARC_INTREG_SIZE],
1035 SPARC_INTREG_SIZE * 8);
c906108c 1036
73937e03
AC
1037 deprecated_read_register_bytes (REGISTER_BYTE (G0_REGNUM),
1038 &register_temp[16 * SPARC_INTREG_SIZE],
1039 SPARC_INTREG_SIZE * 8);
c906108c 1040
5af923b0 1041 if (SPARC_HAS_FPU)
73937e03
AC
1042 deprecated_read_register_bytes (REGISTER_BYTE (FP0_REGNUM),
1043 &register_temp[24 * SPARC_INTREG_SIZE],
1044 FP_REGISTER_BYTES);
c906108c
SS
1045
1046 sp -= DUMMY_STACK_SIZE;
1047
6c0e89ed 1048 DEPRECATED_DUMMY_WRITE_SP (sp);
c906108c
SS
1049
1050 write_memory (sp + DUMMY_REG_SAVE_OFFSET, &register_temp[0],
1051 DUMMY_STACK_REG_BUF_SIZE);
1052
1053 if (strcmp (target_shortname, "sim") != 0)
1054 {
2757dd86
AC
1055 /* NOTE: cagney/2002-04-04: The code below originally contained
1056 GDB's _only_ call to write_fp(). That call was eliminated by
1057 inlining the corresponding code. For the 64 bit case, the
1058 old function (sparc64_write_fp) did the below although I'm
1059 not clear why. The same goes for why this is only done when
1060 the underlying target is a simulator. */
f32e7a74 1061 if (GDB_TARGET_IS_SPARC64)
2757dd86
AC
1062 {
1063 /* Target is a 64 bit SPARC. */
0ba6dca9 1064 CORE_ADDR oldfp = read_register (DEPRECATED_FP_REGNUM);
2757dd86 1065 if (oldfp & 1)
0ba6dca9 1066 write_register (DEPRECATED_FP_REGNUM, old_sp - 2047);
2757dd86 1067 else
0ba6dca9 1068 write_register (DEPRECATED_FP_REGNUM, old_sp);
2757dd86
AC
1069 }
1070 else
1071 {
1072 /* Target is a 32 bit SPARC. */
0ba6dca9 1073 write_register (DEPRECATED_FP_REGNUM, old_sp);
2757dd86 1074 }
c906108c 1075 /* Set return address register for the call dummy to the current PC. */
c5aa993b 1076 write_register (I7_REGNUM, read_pc () - 8);
c906108c
SS
1077 }
1078 else
1079 {
1080 /* The call dummy will write this value to FP before executing
1081 the 'save'. This ensures that register window flushes work
c5aa993b 1082 correctly in the simulator. */
0ba6dca9 1083 write_register (G0_REGNUM + 1, read_register (DEPRECATED_FP_REGNUM));
c5aa993b 1084
c906108c
SS
1085 /* The call dummy will write this value to FP after executing
1086 the 'save'. */
c5aa993b
JM
1087 write_register (G0_REGNUM + 2, old_sp);
1088
c906108c 1089 /* The call dummy will write this value to the return address (%i7) after
c5aa993b
JM
1090 executing the 'save'. */
1091 write_register (G0_REGNUM + 3, read_pc () - 8);
1092
c906108c 1093 /* Set the FP that the call dummy will be using after the 'save'.
c5aa993b 1094 This makes backtraces from an inferior function call work properly. */
0ba6dca9 1095 write_register (DEPRECATED_FP_REGNUM, old_sp);
c906108c
SS
1096 }
1097}
1098
1099/* sparc_frame_find_saved_regs (). This function is here only because
1100 pop_frame uses it. Note there is an interesting corner case which
1101 I think few ports of GDB get right--if you are popping a frame
1102 which does not save some register that *is* saved by a more inner
1103 frame (such a frame will never be a dummy frame because dummy
ac2adee5
AC
1104 frames save all registers).
1105
1106 NOTE: cagney/2003-03-12: Since pop_frame has been rewritten to use
1107 frame_unwind_register() the need for this function is questionable.
c906108c 1108
5af923b0 1109 Stores, into an array of CORE_ADDR,
c906108c
SS
1110 the addresses of the saved registers of frame described by FRAME_INFO.
1111 This includes special registers such as pc and fp saved in special
1112 ways in the stack frame. sp is even more special:
1113 the address we return for it IS the sp for the next frame.
1114
1115 Note that on register window machines, we are currently making the
1116 assumption that window registers are being saved somewhere in the
1117 frame in which they are being used. If they are stored in an
1118 inferior frame, find_saved_register will break.
1119
1120 On the Sun 4, the only time all registers are saved is when
1121 a dummy frame is involved. Otherwise, the only saved registers
1122 are the LOCAL and IN registers which are saved as a result
1123 of the "save/restore" opcodes. This condition is determined
1124 by address rather than by value.
1125
1126 The "pc" is not stored in a frame on the SPARC. (What is stored
1127 is a return address minus 8.) sparc_pop_frame knows how to
1128 deal with that. Other routines might or might not.
1129
1130 See tm-sparc.h (PUSH_DUMMY_FRAME and friends) for CRITICAL information
1131 about how this works. */
1132
5af923b0 1133static void sparc_frame_find_saved_regs (struct frame_info *, CORE_ADDR *);
c906108c
SS
1134
1135static void
fba45db2 1136sparc_frame_find_saved_regs (struct frame_info *fi, CORE_ADDR *saved_regs_addr)
c906108c
SS
1137{
1138 register int regnum;
c193f6ac 1139 CORE_ADDR frame_addr = get_frame_base (fi);
c906108c 1140
43bd9a9e 1141 gdb_assert (fi != NULL);
c906108c 1142
5af923b0 1143 memset (saved_regs_addr, 0, NUM_REGS * sizeof (CORE_ADDR));
c906108c 1144
da50a4b7
AC
1145 if (get_frame_pc (fi) >= (get_frame_extra_info (fi)->bottom
1146 ? get_frame_extra_info (fi)->bottom
1147 : read_sp ())
50abf9e5 1148 && get_frame_pc (fi) <= get_frame_base (fi))
c906108c
SS
1149 {
1150 /* Dummy frame. All but the window regs are in there somewhere. */
c5aa993b 1151 for (regnum = G1_REGNUM; regnum < G1_REGNUM + 7; regnum++)
5af923b0 1152 saved_regs_addr[regnum] =
c906108c 1153 frame_addr + (regnum - G0_REGNUM) * SPARC_INTREG_SIZE
c5aa993b 1154 - DUMMY_STACK_REG_BUF_SIZE + 16 * SPARC_INTREG_SIZE;
5af923b0 1155
c5aa993b 1156 for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; regnum++)
5af923b0 1157 saved_regs_addr[regnum] =
c906108c 1158 frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
c5aa993b 1159 - DUMMY_STACK_REG_BUF_SIZE + 8 * SPARC_INTREG_SIZE;
60054393 1160
5af923b0
MS
1161 if (SPARC_HAS_FPU)
1162 for (regnum = FP0_REGNUM; regnum < FP_MAX_REGNUM; regnum++)
1163 saved_regs_addr[regnum] = frame_addr + (regnum - FP0_REGNUM) * 4
1164 - DUMMY_STACK_REG_BUF_SIZE + 24 * SPARC_INTREG_SIZE;
1165
1166 if (GDB_TARGET_IS_SPARC64)
c906108c 1167 {
5af923b0
MS
1168 for (regnum = PC_REGNUM; regnum < PC_REGNUM + 7; regnum++)
1169 {
1170 saved_regs_addr[regnum] =
1171 frame_addr + (regnum - PC_REGNUM) * SPARC_INTREG_SIZE
1172 - DUMMY_STACK_REG_BUF_SIZE;
1173 }
1174 saved_regs_addr[PSTATE_REGNUM] =
1175 frame_addr + 8 * SPARC_INTREG_SIZE - DUMMY_STACK_REG_BUF_SIZE;
c906108c 1176 }
5af923b0
MS
1177 else
1178 for (regnum = Y_REGNUM; regnum < NUM_REGS; regnum++)
1179 saved_regs_addr[regnum] =
1180 frame_addr + (regnum - Y_REGNUM) * SPARC_INTREG_SIZE
1181 - DUMMY_STACK_REG_BUF_SIZE;
1182
da50a4b7
AC
1183 frame_addr = (get_frame_extra_info (fi)->bottom
1184 ? get_frame_extra_info (fi)->bottom
1185 : read_sp ());
c906108c 1186 }
da50a4b7 1187 else if (get_frame_extra_info (fi)->flat)
c906108c
SS
1188 {
1189 CORE_ADDR func_start;
50abf9e5 1190 find_pc_partial_function (get_frame_pc (fi), NULL, &func_start, NULL);
c906108c
SS
1191 examine_prologue (func_start, 0, fi, saved_regs_addr);
1192
1193 /* Flat register window frame. */
da50a4b7
AC
1194 saved_regs_addr[RP_REGNUM] = get_frame_extra_info (fi)->pc_addr;
1195 saved_regs_addr[I7_REGNUM] = get_frame_extra_info (fi)->fp_addr;
c906108c
SS
1196 }
1197 else
1198 {
1199 /* Normal frame. Just Local and In registers */
da50a4b7
AC
1200 frame_addr = (get_frame_extra_info (fi)->bottom
1201 ? get_frame_extra_info (fi)->bottom
1202 : read_sp ());
c5aa993b 1203 for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; regnum++)
5af923b0 1204 saved_regs_addr[regnum] =
c906108c
SS
1205 (frame_addr + (regnum - L0_REGNUM) * SPARC_INTREG_SIZE
1206 + FRAME_SAVED_L0);
c5aa993b 1207 for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; regnum++)
5af923b0 1208 saved_regs_addr[regnum] =
c906108c
SS
1209 (frame_addr + (regnum - I0_REGNUM) * SPARC_INTREG_SIZE
1210 + FRAME_SAVED_I0);
1211 }
11c02a10 1212 if (get_next_frame (fi))
c906108c 1213 {
da50a4b7 1214 if (get_frame_extra_info (fi)->flat)
c906108c 1215 {
da50a4b7 1216 saved_regs_addr[O7_REGNUM] = get_frame_extra_info (fi)->pc_addr;
c906108c
SS
1217 }
1218 else
1219 {
1220 /* Pull off either the next frame pointer or the stack pointer */
1221 CORE_ADDR next_next_frame_addr =
da50a4b7
AC
1222 (get_frame_extra_info (get_next_frame (fi))->bottom
1223 ? get_frame_extra_info (get_next_frame (fi))->bottom
1224 : read_sp ());
c5aa993b 1225 for (regnum = O0_REGNUM; regnum < O0_REGNUM + 8; regnum++)
5af923b0 1226 saved_regs_addr[regnum] =
c906108c
SS
1227 (next_next_frame_addr
1228 + (regnum - O0_REGNUM) * SPARC_INTREG_SIZE
1229 + FRAME_SAVED_I0);
1230 }
1231 }
1232 /* Otherwise, whatever we would get from ptrace(GETREGS) is accurate */
1233 /* FIXME -- should this adjust for the sparc64 offset? */
c193f6ac 1234 saved_regs_addr[SP_REGNUM] = get_frame_base (fi);
c906108c
SS
1235}
1236
1237/* Discard from the stack the innermost frame, restoring all saved registers.
1238
95486978
AC
1239 Note that the values stored in fsr by
1240 deprecated_get_frame_saved_regs are *in the context of the called
1241 frame*. What this means is that the i regs of fsr must be restored
1242 into the o regs of the (calling) frame that we pop into. We don't
1243 care about the output regs of the calling frame, since unless it's
1244 a dummy frame, it won't have any output regs in it.
c906108c
SS
1245
1246 We never have to bother with %l (local) regs, since the called routine's
1247 locals get tossed, and the calling routine's locals are already saved
1248 on its stack. */
1249
1250/* Definitely see tm-sparc.h for more doc of the frame format here. */
1251
1252void
fba45db2 1253sparc_pop_frame (void)
c906108c
SS
1254{
1255 register struct frame_info *frame = get_current_frame ();
1256 register CORE_ADDR pc;
5af923b0
MS
1257 CORE_ADDR *fsr;
1258 char *raw_buffer;
c906108c
SS
1259 int regnum;
1260
5af923b0 1261 fsr = alloca (NUM_REGS * sizeof (CORE_ADDR));
b8b527c5 1262 raw_buffer = alloca (DEPRECATED_REGISTER_BYTES);
5af923b0
MS
1263 sparc_frame_find_saved_regs (frame, &fsr[0]);
1264 if (SPARC_HAS_FPU)
c906108c 1265 {
5af923b0 1266 if (fsr[FP0_REGNUM])
60054393 1267 {
5af923b0 1268 read_memory (fsr[FP0_REGNUM], raw_buffer, FP_REGISTER_BYTES);
73937e03
AC
1269 deprecated_write_register_bytes (REGISTER_BYTE (FP0_REGNUM),
1270 raw_buffer, FP_REGISTER_BYTES);
60054393 1271 }
5af923b0 1272 if (!(GDB_TARGET_IS_SPARC64))
60054393 1273 {
5af923b0
MS
1274 if (fsr[FPS_REGNUM])
1275 {
1276 read_memory (fsr[FPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
4caf0990 1277 deprecated_write_register_gen (FPS_REGNUM, raw_buffer);
5af923b0
MS
1278 }
1279 if (fsr[CPS_REGNUM])
1280 {
1281 read_memory (fsr[CPS_REGNUM], raw_buffer, SPARC_INTREG_SIZE);
4caf0990 1282 deprecated_write_register_gen (CPS_REGNUM, raw_buffer);
5af923b0 1283 }
60054393 1284 }
60054393 1285 }
5af923b0 1286 if (fsr[G1_REGNUM])
c906108c 1287 {
5af923b0 1288 read_memory (fsr[G1_REGNUM], raw_buffer, 7 * SPARC_INTREG_SIZE);
73937e03
AC
1289 deprecated_write_register_bytes (REGISTER_BYTE (G1_REGNUM), raw_buffer,
1290 7 * SPARC_INTREG_SIZE);
c906108c
SS
1291 }
1292
da50a4b7 1293 if (get_frame_extra_info (frame)->flat)
c906108c
SS
1294 {
1295 /* Each register might or might not have been saved, need to test
c5aa993b 1296 individually. */
c906108c 1297 for (regnum = L0_REGNUM; regnum < L0_REGNUM + 8; ++regnum)
5af923b0
MS
1298 if (fsr[regnum])
1299 write_register (regnum, read_memory_integer (fsr[regnum],
c906108c
SS
1300 SPARC_INTREG_SIZE));
1301 for (regnum = I0_REGNUM; regnum < I0_REGNUM + 8; ++regnum)
5af923b0
MS
1302 if (fsr[regnum])
1303 write_register (regnum, read_memory_integer (fsr[regnum],
c906108c
SS
1304 SPARC_INTREG_SIZE));
1305
1306 /* Handle all outs except stack pointer (o0-o5; o7). */
1307 for (regnum = O0_REGNUM; regnum < O0_REGNUM + 6; ++regnum)
5af923b0
MS
1308 if (fsr[regnum])
1309 write_register (regnum, read_memory_integer (fsr[regnum],
c906108c 1310 SPARC_INTREG_SIZE));
5af923b0 1311 if (fsr[O0_REGNUM + 7])
c906108c 1312 write_register (O0_REGNUM + 7,
5af923b0 1313 read_memory_integer (fsr[O0_REGNUM + 7],
c906108c
SS
1314 SPARC_INTREG_SIZE));
1315
6c0e89ed 1316 DEPRECATED_DUMMY_WRITE_SP (get_frame_base (frame));
c906108c 1317 }
5af923b0 1318 else if (fsr[I0_REGNUM])
c906108c
SS
1319 {
1320 CORE_ADDR sp;
1321
5af923b0
MS
1322 char *reg_temp;
1323
69cdf6a2 1324 reg_temp = alloca (SPARC_INTREG_SIZE * 16);
c906108c 1325
5af923b0 1326 read_memory (fsr[I0_REGNUM], raw_buffer, 8 * SPARC_INTREG_SIZE);
c906108c
SS
1327
1328 /* Get the ins and locals which we are about to restore. Just
c5aa993b
JM
1329 moving the stack pointer is all that is really needed, except
1330 store_inferior_registers is then going to write the ins and
1331 locals from the registers array, so we need to muck with the
1332 registers array. */
5af923b0
MS
1333 sp = fsr[SP_REGNUM];
1334
1335 if (GDB_TARGET_IS_SPARC64 && (sp & 1))
c906108c 1336 sp += 2047;
5af923b0 1337
c906108c
SS
1338 read_memory (sp, reg_temp, SPARC_INTREG_SIZE * 16);
1339
1340 /* Restore the out registers.
c5aa993b 1341 Among other things this writes the new stack pointer. */
73937e03
AC
1342 deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), raw_buffer,
1343 SPARC_INTREG_SIZE * 8);
c906108c 1344
73937e03
AC
1345 deprecated_write_register_bytes (REGISTER_BYTE (L0_REGNUM), reg_temp,
1346 SPARC_INTREG_SIZE * 16);
c906108c 1347 }
5af923b0
MS
1348
1349 if (!(GDB_TARGET_IS_SPARC64))
1350 if (fsr[PS_REGNUM])
1351 write_register (PS_REGNUM,
1352 read_memory_integer (fsr[PS_REGNUM],
1353 REGISTER_RAW_SIZE (PS_REGNUM)));
1354
1355 if (fsr[Y_REGNUM])
1356 write_register (Y_REGNUM,
1357 read_memory_integer (fsr[Y_REGNUM],
1358 REGISTER_RAW_SIZE (Y_REGNUM)));
1359 if (fsr[PC_REGNUM])
c906108c
SS
1360 {
1361 /* Explicitly specified PC (and maybe NPC) -- just restore them. */
5af923b0
MS
1362 write_register (PC_REGNUM,
1363 read_memory_integer (fsr[PC_REGNUM],
1364 REGISTER_RAW_SIZE (PC_REGNUM)));
1365 if (fsr[NPC_REGNUM])
c906108c 1366 write_register (NPC_REGNUM,
5af923b0
MS
1367 read_memory_integer (fsr[NPC_REGNUM],
1368 REGISTER_RAW_SIZE (NPC_REGNUM)));
c906108c 1369 }
da50a4b7 1370 else if (get_frame_extra_info (frame)->flat)
c906108c 1371 {
da50a4b7 1372 if (get_frame_extra_info (frame)->pc_addr)
c906108c 1373 pc = PC_ADJUST ((CORE_ADDR)
da50a4b7 1374 read_memory_integer (get_frame_extra_info (frame)->pc_addr,
c906108c
SS
1375 REGISTER_RAW_SIZE (PC_REGNUM)));
1376 else
1377 {
1378 /* I think this happens only in the innermost frame, if so then
1379 it is a complicated way of saying
1380 "pc = read_register (O7_REGNUM);". */
ac2adee5
AC
1381 ULONGEST tmp;
1382 frame_read_unsigned_register (frame, O7_REGNUM, &tmp);
1383 pc = PC_ADJUST (tmp);
c906108c
SS
1384 }
1385
c5aa993b 1386 write_register (PC_REGNUM, pc);
c906108c
SS
1387 write_register (NPC_REGNUM, pc + 4);
1388 }
5af923b0 1389 else if (fsr[I7_REGNUM])
c906108c
SS
1390 {
1391 /* Return address in %i7 -- adjust it, then restore PC and NPC from it */
5af923b0 1392 pc = PC_ADJUST ((CORE_ADDR) read_memory_integer (fsr[I7_REGNUM],
c906108c 1393 SPARC_INTREG_SIZE));
c5aa993b 1394 write_register (PC_REGNUM, pc);
c906108c
SS
1395 write_register (NPC_REGNUM, pc + 4);
1396 }
1397 flush_cached_frames ();
1398}
1399
1400/* On the Sun 4 under SunOS, the compile will leave a fake insn which
1401 encodes the structure size being returned. If we detect such
1402 a fake insn, step past it. */
1403
1404CORE_ADDR
fba45db2 1405sparc_pc_adjust (CORE_ADDR pc)
c906108c
SS
1406{
1407 unsigned long insn;
1408 char buf[4];
1409 int err;
1410
1411 err = target_read_memory (pc + 8, buf, 4);
1412 insn = extract_unsigned_integer (buf, 4);
1413 if ((err == 0) && (insn & 0xffc00000) == 0)
c5aa993b 1414 return pc + 12;
c906108c 1415 else
c5aa993b 1416 return pc + 8;
c906108c
SS
1417}
1418
1419/* If pc is in a shared library trampoline, return its target.
1420 The SunOs 4.x linker rewrites the jump table entries for PIC
1421 compiled modules in the main executable to bypass the dynamic linker
1422 with jumps of the form
c5aa993b
JM
1423 sethi %hi(addr),%g1
1424 jmp %g1+%lo(addr)
c906108c
SS
1425 and removes the corresponding jump table relocation entry in the
1426 dynamic relocations.
1427 find_solib_trampoline_target relies on the presence of the jump
1428 table relocation entry, so we have to detect these jump instructions
1429 by hand. */
1430
1431CORE_ADDR
fba45db2 1432sunos4_skip_trampoline_code (CORE_ADDR pc)
c906108c
SS
1433{
1434 unsigned long insn1;
1435 char buf[4];
1436 int err;
1437
1438 err = target_read_memory (pc, buf, 4);
1439 insn1 = extract_unsigned_integer (buf, 4);
1440 if (err == 0 && (insn1 & 0xffc00000) == 0x03000000)
1441 {
1442 unsigned long insn2;
1443
1444 err = target_read_memory (pc + 4, buf, 4);
1445 insn2 = extract_unsigned_integer (buf, 4);
1446 if (err == 0 && (insn2 & 0xffffe000) == 0x81c06000)
1447 {
1448 CORE_ADDR target_pc = (insn1 & 0x3fffff) << 10;
1449 int delta = insn2 & 0x1fff;
1450
1451 /* Sign extend the displacement. */
1452 if (delta & 0x1000)
1453 delta |= ~0x1fff;
1454 return target_pc + delta;
1455 }
1456 }
1457 return find_solib_trampoline_target (pc);
1458}
1459\f
c5aa993b 1460#ifdef USE_PROC_FS /* Target dependent support for /proc */
9846de1b 1461/* *INDENT-OFF* */
c906108c
SS
1462/* The /proc interface divides the target machine's register set up into
1463 two different sets, the general register set (gregset) and the floating
1464 point register set (fpregset). For each set, there is an ioctl to get
1465 the current register set and another ioctl to set the current values.
1466
1467 The actual structure passed through the ioctl interface is, of course,
1468 naturally machine dependent, and is different for each set of registers.
1469 For the sparc for example, the general register set is typically defined
1470 by:
1471
1472 typedef int gregset_t[38];
1473
1474 #define R_G0 0
1475 ...
1476 #define R_TBR 37
1477
1478 and the floating point set by:
1479
1480 typedef struct prfpregset {
1481 union {
1482 u_long pr_regs[32];
1483 double pr_dregs[16];
1484 } pr_fr;
1485 void * pr_filler;
1486 u_long pr_fsr;
1487 u_char pr_qcnt;
1488 u_char pr_q_entrysize;
1489 u_char pr_en;
1490 u_long pr_q[64];
1491 } prfpregset_t;
1492
1493 These routines provide the packing and unpacking of gregset_t and
1494 fpregset_t formatted data.
1495
1496 */
9846de1b 1497/* *INDENT-ON* */
c906108c
SS
1498
1499/* Given a pointer to a general register set in /proc format (gregset_t *),
1500 unpack the register contents and supply them as gdb's idea of the current
1501 register values. */
1502
1503void
fba45db2 1504supply_gregset (gdb_gregset_t *gregsetp)
c906108c 1505{
5af923b0
MS
1506 prgreg_t *regp = (prgreg_t *) gregsetp;
1507 int regi, offset = 0;
1508
1509 /* If the host is 64-bit sparc, but the target is 32-bit sparc,
1510 then the gregset may contain 64-bit ints while supply_register
1511 is expecting 32-bit ints. Compensate. */
1512 if (sizeof (regp[0]) == 8 && SPARC_INTREG_SIZE == 4)
1513 offset = 4;
c906108c
SS
1514
1515 /* GDB register numbers for Gn, On, Ln, In all match /proc reg numbers. */
5af923b0 1516 /* FIXME MVS: assumes the order of the first 32 elements... */
c5aa993b 1517 for (regi = G0_REGNUM; regi <= I7_REGNUM; regi++)
c906108c 1518 {
5af923b0 1519 supply_register (regi, ((char *) (regp + regi)) + offset);
c906108c
SS
1520 }
1521
1522 /* These require a bit more care. */
5af923b0
MS
1523 supply_register (PC_REGNUM, ((char *) (regp + R_PC)) + offset);
1524 supply_register (NPC_REGNUM, ((char *) (regp + R_nPC)) + offset);
1525 supply_register (Y_REGNUM, ((char *) (regp + R_Y)) + offset);
1526
1527 if (GDB_TARGET_IS_SPARC64)
1528 {
1529#ifdef R_CCR
1530 supply_register (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
1531#else
1532 supply_register (CCR_REGNUM, NULL);
1533#endif
1534#ifdef R_FPRS
1535 supply_register (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
1536#else
1537 supply_register (FPRS_REGNUM, NULL);
1538#endif
1539#ifdef R_ASI
1540 supply_register (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
1541#else
1542 supply_register (ASI_REGNUM, NULL);
1543#endif
1544 }
1545 else /* sparc32 */
1546 {
1547#ifdef R_PS
1548 supply_register (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
1549#else
1550 supply_register (PS_REGNUM, NULL);
1551#endif
1552
1553 /* For 64-bit hosts, R_WIM and R_TBR may not be defined.
1554 Steal R_ASI and R_FPRS, and hope for the best! */
1555
1556#if !defined (R_WIM) && defined (R_ASI)
1557#define R_WIM R_ASI
1558#endif
1559
1560#if !defined (R_TBR) && defined (R_FPRS)
1561#define R_TBR R_FPRS
1562#endif
1563
1564#if defined (R_WIM)
1565 supply_register (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
1566#else
1567 supply_register (WIM_REGNUM, NULL);
1568#endif
1569
1570#if defined (R_TBR)
1571 supply_register (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
1572#else
1573 supply_register (TBR_REGNUM, NULL);
1574#endif
1575 }
c906108c
SS
1576
1577 /* Fill inaccessible registers with zero. */
5af923b0
MS
1578 if (GDB_TARGET_IS_SPARC64)
1579 {
1580 /*
1581 * don't know how to get value of any of the following:
1582 */
1583 supply_register (VER_REGNUM, NULL);
1584 supply_register (TICK_REGNUM, NULL);
1585 supply_register (PIL_REGNUM, NULL);
1586 supply_register (PSTATE_REGNUM, NULL);
1587 supply_register (TSTATE_REGNUM, NULL);
1588 supply_register (TBA_REGNUM, NULL);
1589 supply_register (TL_REGNUM, NULL);
1590 supply_register (TT_REGNUM, NULL);
1591 supply_register (TPC_REGNUM, NULL);
1592 supply_register (TNPC_REGNUM, NULL);
1593 supply_register (WSTATE_REGNUM, NULL);
1594 supply_register (CWP_REGNUM, NULL);
1595 supply_register (CANSAVE_REGNUM, NULL);
1596 supply_register (CANRESTORE_REGNUM, NULL);
1597 supply_register (CLEANWIN_REGNUM, NULL);
1598 supply_register (OTHERWIN_REGNUM, NULL);
1599 supply_register (ASR16_REGNUM, NULL);
1600 supply_register (ASR17_REGNUM, NULL);
1601 supply_register (ASR18_REGNUM, NULL);
1602 supply_register (ASR19_REGNUM, NULL);
1603 supply_register (ASR20_REGNUM, NULL);
1604 supply_register (ASR21_REGNUM, NULL);
1605 supply_register (ASR22_REGNUM, NULL);
1606 supply_register (ASR23_REGNUM, NULL);
1607 supply_register (ASR24_REGNUM, NULL);
1608 supply_register (ASR25_REGNUM, NULL);
1609 supply_register (ASR26_REGNUM, NULL);
1610 supply_register (ASR27_REGNUM, NULL);
1611 supply_register (ASR28_REGNUM, NULL);
1612 supply_register (ASR29_REGNUM, NULL);
1613 supply_register (ASR30_REGNUM, NULL);
1614 supply_register (ASR31_REGNUM, NULL);
1615 supply_register (ICC_REGNUM, NULL);
1616 supply_register (XCC_REGNUM, NULL);
1617 }
1618 else
1619 {
1620 supply_register (CPS_REGNUM, NULL);
1621 }
c906108c
SS
1622}
1623
1624void
fba45db2 1625fill_gregset (gdb_gregset_t *gregsetp, int regno)
c906108c 1626{
5af923b0
MS
1627 prgreg_t *regp = (prgreg_t *) gregsetp;
1628 int regi, offset = 0;
1629
1630 /* If the host is 64-bit sparc, but the target is 32-bit sparc,
1631 then the gregset may contain 64-bit ints while supply_register
1632 is expecting 32-bit ints. Compensate. */
1633 if (sizeof (regp[0]) == 8 && SPARC_INTREG_SIZE == 4)
1634 offset = 4;
c906108c 1635
c5aa993b 1636 for (regi = 0; regi <= R_I7; regi++)
5af923b0 1637 if ((regno == -1) || (regno == regi))
4caf0990 1638 deprecated_read_register_gen (regi, (char *) (regp + regi) + offset);
5af923b0 1639
c906108c 1640 if ((regno == -1) || (regno == PC_REGNUM))
4caf0990 1641 deprecated_read_register_gen (PC_REGNUM, (char *) (regp + R_PC) + offset);
5af923b0 1642
c906108c 1643 if ((regno == -1) || (regno == NPC_REGNUM))
4caf0990 1644 deprecated_read_register_gen (NPC_REGNUM, (char *) (regp + R_nPC) + offset);
5af923b0
MS
1645
1646 if ((regno == -1) || (regno == Y_REGNUM))
4caf0990 1647 deprecated_read_register_gen (Y_REGNUM, (char *) (regp + R_Y) + offset);
5af923b0
MS
1648
1649 if (GDB_TARGET_IS_SPARC64)
c906108c 1650 {
5af923b0
MS
1651#ifdef R_CCR
1652 if (regno == -1 || regno == CCR_REGNUM)
4caf0990 1653 deprecated_read_register_gen (CCR_REGNUM, ((char *) (regp + R_CCR)) + offset);
5af923b0
MS
1654#endif
1655#ifdef R_FPRS
1656 if (regno == -1 || regno == FPRS_REGNUM)
4caf0990 1657 deprecated_read_register_gen (FPRS_REGNUM, ((char *) (regp + R_FPRS)) + offset);
5af923b0
MS
1658#endif
1659#ifdef R_ASI
1660 if (regno == -1 || regno == ASI_REGNUM)
4caf0990 1661 deprecated_read_register_gen (ASI_REGNUM, ((char *) (regp + R_ASI)) + offset);
5af923b0 1662#endif
c906108c 1663 }
5af923b0 1664 else /* sparc32 */
c906108c 1665 {
5af923b0
MS
1666#ifdef R_PS
1667 if (regno == -1 || regno == PS_REGNUM)
4caf0990 1668 deprecated_read_register_gen (PS_REGNUM, ((char *) (regp + R_PS)) + offset);
5af923b0
MS
1669#endif
1670
1671 /* For 64-bit hosts, R_WIM and R_TBR may not be defined.
1672 Steal R_ASI and R_FPRS, and hope for the best! */
1673
1674#if !defined (R_WIM) && defined (R_ASI)
1675#define R_WIM R_ASI
1676#endif
1677
1678#if !defined (R_TBR) && defined (R_FPRS)
1679#define R_TBR R_FPRS
1680#endif
1681
1682#if defined (R_WIM)
1683 if (regno == -1 || regno == WIM_REGNUM)
4caf0990 1684 deprecated_read_register_gen (WIM_REGNUM, ((char *) (regp + R_WIM)) + offset);
5af923b0
MS
1685#else
1686 if (regno == -1 || regno == WIM_REGNUM)
4caf0990 1687 deprecated_read_register_gen (WIM_REGNUM, NULL);
5af923b0
MS
1688#endif
1689
1690#if defined (R_TBR)
1691 if (regno == -1 || regno == TBR_REGNUM)
4caf0990 1692 deprecated_read_register_gen (TBR_REGNUM, ((char *) (regp + R_TBR)) + offset);
5af923b0
MS
1693#else
1694 if (regno == -1 || regno == TBR_REGNUM)
4caf0990 1695 deprecated_read_register_gen (TBR_REGNUM, NULL);
5af923b0 1696#endif
c906108c
SS
1697 }
1698}
1699
c906108c 1700/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
1701 (fpregset_t *), unpack the register contents and supply them as gdb's
1702 idea of the current floating point register values. */
c906108c 1703
c5aa993b 1704void
fba45db2 1705supply_fpregset (gdb_fpregset_t *fpregsetp)
c906108c
SS
1706{
1707 register int regi;
1708 char *from;
c5aa993b 1709
5af923b0 1710 if (!SPARC_HAS_FPU)
60054393
MS
1711 return;
1712
c5aa993b 1713 for (regi = FP0_REGNUM; regi < FP_MAX_REGNUM; regi++)
c906108c 1714 {
c5aa993b 1715 from = (char *) &fpregsetp->pr_fr.pr_regs[regi - FP0_REGNUM];
c906108c
SS
1716 supply_register (regi, from);
1717 }
5af923b0
MS
1718
1719 if (GDB_TARGET_IS_SPARC64)
1720 {
1721 /*
1722 * don't know how to get value of the following.
1723 */
1724 supply_register (FSR_REGNUM, NULL); /* zero it out for now */
1725 supply_register (FCC0_REGNUM, NULL);
1726 supply_register (FCC1_REGNUM, NULL); /* don't know how to get value */
1727 supply_register (FCC2_REGNUM, NULL); /* don't know how to get value */
1728 supply_register (FCC3_REGNUM, NULL); /* don't know how to get value */
1729 }
1730 else
1731 {
1732 supply_register (FPS_REGNUM, (char *) &(fpregsetp->pr_fsr));
1733 }
c906108c
SS
1734}
1735
1736/* Given a pointer to a floating point register set in /proc format
c5aa993b
JM
1737 (fpregset_t *), update the register specified by REGNO from gdb's idea
1738 of the current floating point register set. If REGNO is -1, update
1739 them all. */
5af923b0 1740/* This will probably need some changes for sparc64. */
c906108c
SS
1741
1742void
fba45db2 1743fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
c906108c
SS
1744{
1745 int regi;
1746 char *to;
1747 char *from;
1748
5af923b0 1749 if (!SPARC_HAS_FPU)
60054393
MS
1750 return;
1751
c5aa993b 1752 for (regi = FP0_REGNUM; regi < FP_MAX_REGNUM; regi++)
c906108c
SS
1753 {
1754 if ((regno == -1) || (regno == regi))
1755 {
524d7c18 1756 from = (char *) &deprecated_registers[REGISTER_BYTE (regi)];
c5aa993b 1757 to = (char *) &fpregsetp->pr_fr.pr_regs[regi - FP0_REGNUM];
c906108c
SS
1758 memcpy (to, from, REGISTER_RAW_SIZE (regi));
1759 }
1760 }
5af923b0
MS
1761
1762 if (!(GDB_TARGET_IS_SPARC64)) /* FIXME: does Sparc64 have this register? */
1763 if ((regno == -1) || (regno == FPS_REGNUM))
1764 {
524d7c18 1765 from = (char *)&deprecated_registers[REGISTER_BYTE (FPS_REGNUM)];
5af923b0
MS
1766 to = (char *) &fpregsetp->pr_fsr;
1767 memcpy (to, from, REGISTER_RAW_SIZE (FPS_REGNUM));
1768 }
c906108c
SS
1769}
1770
c5aa993b 1771#endif /* USE_PROC_FS */
c906108c 1772
a48442a0
RE
1773/* Because of Multi-arch, GET_LONGJMP_TARGET is always defined. So test
1774 for a definition of JB_PC. */
1775#ifdef JB_PC
c906108c
SS
1776
1777/* Figure out where the longjmp will land. We expect that we have just entered
1778 longjmp and haven't yet setup the stack frame, so the args are still in the
1779 output regs. %o0 (O0_REGNUM) points at the jmp_buf structure from which we
1780 extract the pc (JB_PC) that we will land at. The pc is copied into ADDR.
1781 This routine returns true on success */
1782
1783int
fba45db2 1784get_longjmp_target (CORE_ADDR *pc)
c906108c
SS
1785{
1786 CORE_ADDR jb_addr;
1787#define LONGJMP_TARGET_SIZE 4
1788 char buf[LONGJMP_TARGET_SIZE];
1789
1790 jb_addr = read_register (O0_REGNUM);
1791
1792 if (target_read_memory (jb_addr + JB_PC * JB_ELEMENT_SIZE, buf,
1793 LONGJMP_TARGET_SIZE))
1794 return 0;
1795
7c0b4a20 1796 *pc = extract_unsigned_integer (buf, LONGJMP_TARGET_SIZE);
c906108c
SS
1797
1798 return 1;
1799}
1800#endif /* GET_LONGJMP_TARGET */
1801\f
1802#ifdef STATIC_TRANSFORM_NAME
1803/* SunPRO (3.0 at least), encodes the static variables. This is not
1804 related to C++ mangling, it is done for C too. */
1805
1806char *
fba45db2 1807sunpro_static_transform_name (char *name)
c906108c
SS
1808{
1809 char *p;
1810 if (name[0] == '$')
1811 {
1812 /* For file-local statics there will be a dollar sign, a bunch
c5aa993b
JM
1813 of junk (the contents of which match a string given in the
1814 N_OPT), a period and the name. For function-local statics
1815 there will be a bunch of junk (which seems to change the
1816 second character from 'A' to 'B'), a period, the name of the
1817 function, and the name. So just skip everything before the
1818 last period. */
c906108c
SS
1819 p = strrchr (name, '.');
1820 if (p != NULL)
1821 name = p + 1;
1822 }
1823 return name;
1824}
1825#endif /* STATIC_TRANSFORM_NAME */
1826\f
1827
1828/* Utilities for printing registers.
1829 Page numbers refer to the SPARC Architecture Manual. */
1830
5af923b0 1831static void dump_ccreg (char *, int);
c906108c
SS
1832
1833static void
fba45db2 1834dump_ccreg (char *reg, int val)
c906108c
SS
1835{
1836 /* page 41 */
1837 printf_unfiltered ("%s:%s,%s,%s,%s", reg,
c5aa993b
JM
1838 val & 8 ? "N" : "NN",
1839 val & 4 ? "Z" : "NZ",
1840 val & 2 ? "O" : "NO",
5af923b0 1841 val & 1 ? "C" : "NC");
c906108c
SS
1842}
1843
1844static char *
fba45db2 1845decode_asi (int val)
c906108c
SS
1846{
1847 /* page 72 */
1848 switch (val)
1849 {
c5aa993b
JM
1850 case 4:
1851 return "ASI_NUCLEUS";
1852 case 0x0c:
1853 return "ASI_NUCLEUS_LITTLE";
1854 case 0x10:
1855 return "ASI_AS_IF_USER_PRIMARY";
1856 case 0x11:
1857 return "ASI_AS_IF_USER_SECONDARY";
1858 case 0x18:
1859 return "ASI_AS_IF_USER_PRIMARY_LITTLE";
1860 case 0x19:
1861 return "ASI_AS_IF_USER_SECONDARY_LITTLE";
1862 case 0x80:
1863 return "ASI_PRIMARY";
1864 case 0x81:
1865 return "ASI_SECONDARY";
1866 case 0x82:
1867 return "ASI_PRIMARY_NOFAULT";
1868 case 0x83:
1869 return "ASI_SECONDARY_NOFAULT";
1870 case 0x88:
1871 return "ASI_PRIMARY_LITTLE";
1872 case 0x89:
1873 return "ASI_SECONDARY_LITTLE";
1874 case 0x8a:
1875 return "ASI_PRIMARY_NOFAULT_LITTLE";
1876 case 0x8b:
1877 return "ASI_SECONDARY_NOFAULT_LITTLE";
1878 default:
1879 return NULL;
c906108c
SS
1880 }
1881}
1882
867f3898 1883/* Pretty print various registers. */
c906108c
SS
1884/* FIXME: Would be nice if this did some fancy things for 32 bit sparc. */
1885
87647bb0 1886static void
fba45db2 1887sparc_print_register_hook (int regno)
c906108c
SS
1888{
1889 ULONGEST val;
1890
1891 /* Handle double/quad versions of lower 32 fp regs. */
1892 if (regno >= FP0_REGNUM && regno < FP0_REGNUM + 32
1893 && (regno & 1) == 0)
1894 {
1895 char value[16];
1896
6e7f8b9c
AC
1897 if (frame_register_read (deprecated_selected_frame, regno, value)
1898 && frame_register_read (deprecated_selected_frame, regno + 1, value + 4))
c906108c
SS
1899 {
1900 printf_unfiltered ("\t");
1901 print_floating (value, builtin_type_double, gdb_stdout);
1902 }
c5aa993b 1903#if 0 /* FIXME: gdb doesn't handle long doubles */
c906108c
SS
1904 if ((regno & 3) == 0)
1905 {
6e7f8b9c
AC
1906 if (frame_register_read (deprecated_selected_frame, regno + 2, value + 8)
1907 && frame_register_read (deprecated_selected_frame, regno + 3, value + 12))
c906108c
SS
1908 {
1909 printf_unfiltered ("\t");
1910 print_floating (value, builtin_type_long_double, gdb_stdout);
1911 }
1912 }
1913#endif
1914 return;
1915 }
1916
c5aa993b 1917#if 0 /* FIXME: gdb doesn't handle long doubles */
c906108c
SS
1918 /* Print upper fp regs as long double if appropriate. */
1919 if (regno >= FP0_REGNUM + 32 && regno < FP_MAX_REGNUM
c5aa993b
JM
1920 /* We test for even numbered regs and not a multiple of 4 because
1921 the upper fp regs are recorded as doubles. */
c906108c
SS
1922 && (regno & 1) == 0)
1923 {
1924 char value[16];
1925
6e7f8b9c
AC
1926 if (frame_register_read (deprecated_selected_frame, regno, value)
1927 && frame_register_read (deprecated_selected_frame, regno + 1, value + 8))
c906108c
SS
1928 {
1929 printf_unfiltered ("\t");
1930 print_floating (value, builtin_type_long_double, gdb_stdout);
1931 }
1932 return;
1933 }
1934#endif
1935
1936 /* FIXME: Some of these are priviledged registers.
1937 Not sure how they should be handled. */
1938
1939#define BITS(n, mask) ((int) (((val) >> (n)) & (mask)))
1940
1941 val = read_register (regno);
1942
1943 /* pages 40 - 60 */
5af923b0
MS
1944 if (GDB_TARGET_IS_SPARC64)
1945 switch (regno)
c906108c 1946 {
5af923b0
MS
1947 case CCR_REGNUM:
1948 printf_unfiltered ("\t");
1949 dump_ccreg ("xcc", val >> 4);
1950 printf_unfiltered (", ");
1951 dump_ccreg ("icc", val & 15);
c906108c 1952 break;
5af923b0
MS
1953 case FPRS_REGNUM:
1954 printf ("\tfef:%d, du:%d, dl:%d",
1955 BITS (2, 1), BITS (1, 1), BITS (0, 1));
c906108c 1956 break;
5af923b0
MS
1957 case FSR_REGNUM:
1958 {
1959 static char *fcc[4] =
1960 {"=", "<", ">", "?"};
1961 static char *rd[4] =
1962 {"N", "0", "+", "-"};
1963 /* Long, but I'd rather leave it as is and use a wide screen. */
1964 printf_filtered ("\t0:%s, 1:%s, 2:%s, 3:%s, rd:%s, tem:%d, ",
1965 fcc[BITS (10, 3)], fcc[BITS (32, 3)],
1966 fcc[BITS (34, 3)], fcc[BITS (36, 3)],
1967 rd[BITS (30, 3)], BITS (23, 31));
1968 printf_filtered ("ns:%d, ver:%d, ftt:%d, qne:%d, aexc:%d, cexc:%d",
1969 BITS (22, 1), BITS (17, 7), BITS (14, 7),
1970 BITS (13, 1), BITS (5, 31), BITS (0, 31));
1971 break;
1972 }
1973 case ASI_REGNUM:
1974 {
1975 char *asi = decode_asi (val);
1976 if (asi != NULL)
1977 printf ("\t%s", asi);
1978 break;
1979 }
1980 case VER_REGNUM:
1981 printf ("\tmanuf:%d, impl:%d, mask:%d, maxtl:%d, maxwin:%d",
1982 BITS (48, 0xffff), BITS (32, 0xffff),
1983 BITS (24, 0xff), BITS (8, 0xff), BITS (0, 31));
1984 break;
1985 case PSTATE_REGNUM:
1986 {
1987 static char *mm[4] =
1988 {"tso", "pso", "rso", "?"};
1989 printf_filtered ("\tcle:%d, tle:%d, mm:%s, red:%d, ",
1990 BITS (9, 1), BITS (8, 1),
1991 mm[BITS (6, 3)], BITS (5, 1));
1992 printf_filtered ("pef:%d, am:%d, priv:%d, ie:%d, ag:%d",
1993 BITS (4, 1), BITS (3, 1), BITS (2, 1),
1994 BITS (1, 1), BITS (0, 1));
1995 break;
1996 }
1997 case TSTATE_REGNUM:
1998 /* FIXME: print all 4? */
1999 break;
2000 case TT_REGNUM:
2001 /* FIXME: print all 4? */
2002 break;
2003 case TPC_REGNUM:
2004 /* FIXME: print all 4? */
2005 break;
2006 case TNPC_REGNUM:
2007 /* FIXME: print all 4? */
2008 break;
2009 case WSTATE_REGNUM:
2010 printf ("\tother:%d, normal:%d", BITS (3, 7), BITS (0, 7));
2011 break;
2012 case CWP_REGNUM:
2013 printf ("\t%d", BITS (0, 31));
2014 break;
2015 case CANSAVE_REGNUM:
2016 printf ("\t%-2d before spill", BITS (0, 31));
2017 break;
2018 case CANRESTORE_REGNUM:
2019 printf ("\t%-2d before fill", BITS (0, 31));
2020 break;
2021 case CLEANWIN_REGNUM:
2022 printf ("\t%-2d before clean", BITS (0, 31));
2023 break;
2024 case OTHERWIN_REGNUM:
2025 printf ("\t%d", BITS (0, 31));
c906108c
SS
2026 break;
2027 }
5af923b0
MS
2028 else /* Sparc32 */
2029 switch (regno)
c906108c 2030 {
5af923b0
MS
2031 case PS_REGNUM:
2032 printf ("\ticc:%c%c%c%c, pil:%d, s:%d, ps:%d, et:%d, cwp:%d",
2033 BITS (23, 1) ? 'N' : '-', BITS (22, 1) ? 'Z' : '-',
2034 BITS (21, 1) ? 'V' : '-', BITS (20, 1) ? 'C' : '-',
2035 BITS (8, 15), BITS (7, 1), BITS (6, 1), BITS (5, 1),
c906108c
SS
2036 BITS (0, 31));
2037 break;
5af923b0
MS
2038 case FPS_REGNUM:
2039 {
2040 static char *fcc[4] =
2041 {"=", "<", ">", "?"};
2042 static char *rd[4] =
2043 {"N", "0", "+", "-"};
2044 /* Long, but I'd rather leave it as is and use a wide screen. */
2045 printf ("\trd:%s, tem:%d, ns:%d, ver:%d, ftt:%d, qne:%d, "
2046 "fcc:%s, aexc:%d, cexc:%d",
2047 rd[BITS (30, 3)], BITS (23, 31), BITS (22, 1), BITS (17, 7),
2048 BITS (14, 7), BITS (13, 1), fcc[BITS (10, 3)], BITS (5, 31),
2049 BITS (0, 31));
2050 break;
2051 }
c906108c
SS
2052 }
2053
c906108c
SS
2054#undef BITS
2055}
87647bb0
AC
2056
2057static void
2058sparc_print_registers (struct gdbarch *gdbarch,
2059 struct ui_file *file,
2060 struct frame_info *frame,
2061 int regnum, int print_all,
2062 void (*print_register_hook) (int))
2063{
2064 int i;
2065 const int numregs = NUM_REGS + NUM_PSEUDO_REGS;
0c92afe8
AC
2066 char raw_buffer[MAX_REGISTER_SIZE];
2067 char virtual_buffer[MAX_REGISTER_SIZE];
87647bb0
AC
2068
2069 for (i = 0; i < numregs; i++)
2070 {
2071 /* Decide between printing all regs, non-float / vector regs, or
2072 specific reg. */
2073 if (regnum == -1)
2074 {
2075 if (!print_all)
2076 {
2077 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
2078 continue;
2079 if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)))
2080 continue;
2081 }
2082 }
2083 else
2084 {
2085 if (i != regnum)
2086 continue;
2087 }
2088
2089 /* If the register name is empty, it is undefined for this
2090 processor, so don't display anything. */
2091 if (REGISTER_NAME (i) == NULL || *(REGISTER_NAME (i)) == '\0')
2092 continue;
2093
2094 fputs_filtered (REGISTER_NAME (i), file);
2095 print_spaces_filtered (15 - strlen (REGISTER_NAME (i)), file);
2096
2097 /* Get the data in raw format. */
2098 if (! frame_register_read (frame, i, raw_buffer))
2099 {
2100 fprintf_filtered (file, "*value not available*\n");
2101 continue;
2102 }
2103
bf7488d2 2104 memcpy (virtual_buffer, raw_buffer, REGISTER_VIRTUAL_SIZE (i));
87647bb0
AC
2105
2106 /* If virtual format is floating, print it that way, and in raw
2107 hex. */
2108 if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT)
2109 {
2110 int j;
2111
2112 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2113 file, 0, 1, 0, Val_pretty_default);
2114
2115 fprintf_filtered (file, "\t(raw 0x");
2116 for (j = 0; j < REGISTER_RAW_SIZE (i); j++)
2117 {
2118 int idx;
2119 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
2120 idx = j;
2121 else
2122 idx = REGISTER_RAW_SIZE (i) - 1 - j;
2123 fprintf_filtered (file, "%02x", (unsigned char) raw_buffer[idx]);
2124 }
2125 fprintf_filtered (file, ")");
2126 }
2127 else
2128 {
2129 /* Print the register in hex. */
2130 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2131 file, 'x', 1, 0, Val_pretty_default);
2132 /* If not a vector register, print it also according to its
2133 natural format. */
2134 if (TYPE_VECTOR (REGISTER_VIRTUAL_TYPE (i)) == 0)
2135 {
2136 fprintf_filtered (file, "\t");
2137 val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, 0,
2138 file, 0, 1, 0, Val_pretty_default);
2139 }
2140 }
2141
2142 /* Some sparc specific info. */
2143 if (print_register_hook != NULL)
2144 print_register_hook (i);
2145
2146 fprintf_filtered (file, "\n");
2147 }
2148}
2149
2150static void
2151sparc_print_registers_info (struct gdbarch *gdbarch,
2152 struct ui_file *file,
2153 struct frame_info *frame,
2154 int regnum, int print_all)
2155{
2156 sparc_print_registers (gdbarch, file, frame, regnum, print_all,
2157 sparc_print_register_hook);
2158}
2159
2160void
2161sparc_do_registers_info (int regnum, int all)
2162{
6e7f8b9c 2163 sparc_print_registers_info (current_gdbarch, gdb_stdout, deprecated_selected_frame,
87647bb0
AC
2164 regnum, all);
2165}
2166
f81824a9
AC
2167#if 0
2168// OBSOLETE static void
2169// OBSOLETE sparclet_print_registers_info (struct gdbarch *gdbarch,
2170// OBSOLETE struct ui_file *file,
2171// OBSOLETE struct frame_info *frame,
2172// OBSOLETE int regnum, int print_all)
2173// OBSOLETE {
2174// OBSOLETE sparc_print_registers (gdbarch, file, frame, regnum, print_all, NULL);
2175// OBSOLETE }
2176// OBSOLETE
2177// OBSOLETE void
2178// OBSOLETE sparclet_do_registers_info (int regnum, int all)
2179// OBSOLETE {
2180// OBSOLETE sparclet_print_registers_info (current_gdbarch, gdb_stdout,
2181// OBSOLETE deprecated_selected_frame, regnum, all);
2182// OBSOLETE }
2183#endif
87647bb0 2184
c906108c 2185\f
a78f21af 2186static int
fba45db2 2187gdb_print_insn_sparc (bfd_vma memaddr, disassemble_info *info)
c906108c
SS
2188{
2189 /* It's necessary to override mach again because print_insn messes it up. */
96baa820 2190 info->mach = TARGET_ARCHITECTURE->mach;
c906108c
SS
2191 return print_insn_sparc (memaddr, info);
2192}
2193\f
c906108c 2194
eb2c22dc
MK
2195#define SPARC_F0_REGNUM FP0_REGNUM /* %f0 */
2196#define SPARC_F1_REGNUM (FP0_REGNUM + 1)/* %f1 */
2197#define SPARC_O0_REGNUM O0_REGNUM /* %o0 */
2198#define SPARC_O1_REGNUM O1_REGNUM /* %o1 */
2199
2200/* Push the arguments onto the stack and into the appropriate registers. */
2201
2202static CORE_ADDR
2203sparc32_do_push_arguments (struct regcache *regcache, int nargs,
2204 struct value **args, CORE_ADDR sp)
c906108c 2205{
eb2c22dc
MK
2206 CORE_ADDR *addr;
2207 int size = 0;
2208 int i;
2209
2210 /* Structure, union and quad-precision arguments are passed by
2211 reference. We allocate space for these arguments on the stack
2212 and record their addresses in an array. Array elements for
2213 arguments that are passed by value will be set to zero.*/
2214 addr = alloca (nargs * sizeof (CORE_ADDR));
2215
2216 for (i = nargs - 1; i >= 0; i--)
c906108c 2217 {
eb2c22dc
MK
2218 struct type *type = VALUE_ENCLOSING_TYPE (args[i]);
2219 enum type_code code = TYPE_CODE (type);
2220 int len = TYPE_LENGTH (type);
2221
2222 /* Push the contents of structure, union and quad-precision
2223 arguments on the stack. */
2224 if (code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION || len > 8)
2225 {
2226 /* Keep the stack doubleword aligned. */
2227 sp -= (len + 7) & ~7;
2228 write_memory (sp, VALUE_CONTENTS_ALL (args[i]), len);
2229 addr[i] = sp;
2230 size += 4;
2231 }
2232 else
2233 {
2234 addr[i] = 0;
2235 size += (len > 4) ? 8 : 4;
2236 }
2237 }
2238
2239 /* The needed space for outgoing arguments should be a multiple of 4. */
2240 gdb_assert (size % 4 == 0);
2241
2242 /* Make sure we reserve space for the first six words of arguments
2243 in the stack frame, even if we don't need them. */
2244 if (size < 24)
2245 sp -= (24 - size);
2246
2247 /* Make sure we end up with a doubleword aligned stack in the end.
2248 Reserve an extra word if necessary in order to accomplish this. */
2249 if ((sp - size) % 8 == 0)
2250 sp -= 4;
2251
2252 /* Now push the arguments onto the stack. */
2253 for (i = nargs - 1; i >=0; i--)
c906108c 2254 {
eb2c22dc
MK
2255 char buf[8];
2256 int len;
2257
2258 if (addr[i])
c906108c 2259 {
eb2c22dc
MK
2260 store_unsigned_integer (buf, 4, addr[i]);
2261 len = 4;
2262 }
2263 else
2264 {
2265 struct value *arg = args[i];
2266
2267 len = TYPE_LENGTH (VALUE_ENCLOSING_TYPE (arg));
2268
2269 /* Expand signed and unsigned bytes and halfwords as needed. */
2270 if (len < 4)
c906108c 2271 {
eb2c22dc
MK
2272 arg = value_cast (builtin_type_long, arg);
2273 len = 4;
c906108c 2274 }
eb2c22dc
MK
2275 else if (len > 4 && len < 8)
2276 {
2277 arg = value_cast (builtin_type_long_long, arg);
2278 len = 4;
2279 }
2280
2281 gdb_assert (len == 4 || len == 8);
2282 memcpy (buf, VALUE_CONTENTS_ALL (arg), len);
2283 }
2284
2285 /* We always write the argument word on the stack. */
2286 sp -= len;
2287 write_memory (sp, buf, len);
2288
2289 /* If this argument occupies one of the first 6 words, write it
2290 into the appropriate register too. */
2291 size -= len;
2292 if (size < 24)
2293 {
2294 int regnum = SPARC_O0_REGNUM + (size / 4);
2295
2296 regcache_cooked_write (regcache, regnum, buf);
2297 if (len == 8 && size < 20)
2298 regcache_cooked_write (regcache, regnum + 1, buf + 4);
c906108c 2299 }
c906108c
SS
2300 }
2301
eb2c22dc
MK
2302 /* Reserve space for the struct/union return value pointer. */
2303 sp -= 4;
2304
2305 /* Stack should be doubleword aligned at this point. */
2306 gdb_assert (sp % 8 == 0);
2307
2308 /* Return the adjusted stack pointer. */
2309 return sp;
2310}
c906108c 2311
eb2c22dc
MK
2312/* The SPARC passes the arguments on the stack; arguments smaller
2313 than an int are promoted to an int. The first 6 words worth of
2314 args are also passed in registers o0 - o5. */
2315
2316CORE_ADDR
2317sparc32_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
2318 int struct_return, CORE_ADDR struct_addr)
2319{
2320 sp = sparc32_do_push_arguments (current_regcache, nargs, args, sp);
2321
2322 /* FIXME: kettenis/20030525: We don't let this function set the
2323 struct/union return pointer just yet. */
2324#if 0
2325 if (struct_return)
5af923b0 2326 {
eb2c22dc
MK
2327 char buf[4];
2328
2329 /* The space for the struct/union return value pointer has
2330 already been reserved. */
2331 store_unsigned_integer (buf, 4, struct_addr);
2332 write (sp, buf, 4);
5af923b0 2333 }
c906108c
SS
2334
2335 return sp;
eb2c22dc
MK
2336#else
2337 return sp + 4;
2338#endif
c906108c
SS
2339}
2340
44b7b84e
MK
2341/* Extract from REGCACHE a function return value of type TYPE and copy
2342 that into VALBUF.
2343
2344 Note that REGCACHE specifies the register values for the frame of
2345 the calling function. This means that we need to fetch the value
2346 form %o0 and %o1, which correspond to %i0 and %i1 in the frame of
2347 the called function. */
c906108c
SS
2348
2349void
44b7b84e
MK
2350sparc32_extract_return_value (struct type *type, struct regcache *regcache,
2351 void *valbuf)
c906108c 2352{
44b7b84e
MK
2353 int len = TYPE_LENGTH (type);
2354 char buf[8];
c906108c
SS
2355
2356 if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
44b7b84e
MK
2357 {
2358 if (len == 4 || len == 8)
2359 {
2360 regcache_cooked_read (regcache, SPARC_F0_REGNUM, buf);
2361 regcache_cooked_read (regcache, SPARC_F1_REGNUM, buf + 4);
2362 memcpy (valbuf, buf, len);
2363 return;
2364 }
2365 else
2366 internal_error (__FILE__, __LINE__, "\
2367Cannot extract floating-point return value of %d bytes long.", len);
2368 }
2369
2370 if (len <= 4)
2371 {
2372 regcache_cooked_read (regcache, SPARC_O0_REGNUM, buf);
2373 memcpy (valbuf, buf + 4 - len, len);
2374 }
2375 else if (len <= 8)
2376 {
2377 regcache_cooked_read (regcache, SPARC_O0_REGNUM, buf);
2378 regcache_cooked_read (regcache, SPARC_O1_REGNUM, buf + 4);
2379 memcpy (valbuf, buf + 8 - len, len);
2380 }
c906108c 2381 else
44b7b84e
MK
2382 internal_error (__FILE__, __LINE__,
2383 "Cannot extract return value of %d bytes long.", len);
c906108c
SS
2384}
2385
44b7b84e
MK
2386/* Write into REGBUF a function return value VALBUF of type TYPE. */
2387
2388void
2389sparc32_store_return_value (struct type *type, struct regcache *regcache,
2390 const void *valbuf)
2391{
2392 int len = TYPE_LENGTH (type);
2393 char buf[8];
2394
2395 if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2396 {
2397 const char *buf = valbuf;
2398
2399 if (len == 4)
2400 {
2401 regcache_cooked_write (regcache, SPARC_F0_REGNUM, buf);
2402 return;
2403 }
2404 else if (len == 8)
2405 {
2406 regcache_cooked_write (regcache, SPARC_F0_REGNUM, buf);
2407 regcache_cooked_write (regcache, SPARC_F1_REGNUM, buf + 4);
2408 return;
2409 }
2410 else
2411 internal_error (__FILE__, __LINE__, "\
2412Cannot extract floating-point return value of %d bytes long.", len);
2413 }
2414
2415 /* Add leading zeros to the value. */
2416 memset (buf, 0, sizeof buf);
2417
2418 if (len <= 4)
2419 {
2420 memcpy (buf + 4 - len, valbuf, len);
2421 regcache_cooked_write (regcache, SPARC_O0_REGNUM, buf);
2422 }
2423 else if (len <= 8)
2424 {
2425 memcpy (buf + 8 - len, valbuf, len);
2426 regcache_cooked_write (regcache, SPARC_O0_REGNUM, buf);
2427 regcache_cooked_write (regcache, SPARC_O1_REGNUM, buf);
2428 }
2429 else
2430 internal_error (__FILE__, __LINE__,
2431 "Cannot extract return value of %d bytes long.", len);
2432}
2433
2434/* Extract from REGCACHE the address in which a function should return
2435 its structure value. */
2436
2437CORE_ADDR
2438sparc_extract_struct_value_address (struct regcache *regcache)
2439{
2440 ULONGEST addr;
2441
2442 regcache_cooked_read_unsigned (regcache, SPARC_O0_REGNUM, &addr);
2443 return addr;
2444}
c906108c 2445
44b7b84e 2446/* FIXME: kettenis/2003/05/24: Still used for sparc64. */
c906108c 2447
a78f21af 2448static void
fba45db2 2449sparc_store_return_value (struct type *type, char *valbuf)
c906108c
SS
2450{
2451 int regno;
d9d9c31f 2452 char buffer[MAX_REGISTER_SIZE];
c906108c
SS
2453
2454 if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2455 /* Floating-point values are returned in the register pair */
2456 /* formed by %f0 and %f1 (doubles are, anyway). */
2457 regno = FP0_REGNUM;
2458 else
2459 /* Other values are returned in register %o0. */
2460 regno = O0_REGNUM;
2461
2462 /* Add leading zeros to the value. */
c5aa993b 2463 if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (regno))
c906108c 2464 {
5af923b0 2465 memset (buffer, 0, REGISTER_RAW_SIZE (regno));
c5aa993b 2466 memcpy (buffer + REGISTER_RAW_SIZE (regno) - TYPE_LENGTH (type), valbuf,
c906108c 2467 TYPE_LENGTH (type));
4caf0990 2468 deprecated_write_register_gen (regno, buffer);
c906108c
SS
2469 }
2470 else
73937e03
AC
2471 deprecated_write_register_bytes (REGISTER_BYTE (regno), valbuf,
2472 TYPE_LENGTH (type));
c906108c
SS
2473}
2474
f81824a9
AC
2475#if 0
2476// OBSOLETE extern void
2477// OBSOLETE sparclet_store_return_value (struct type *type, char *valbuf)
2478// OBSOLETE {
2479// OBSOLETE /* Other values are returned in register %o0. */
2480// OBSOLETE deprecated_write_register_bytes (REGISTER_BYTE (O0_REGNUM), valbuf,
2481// OBSOLETE TYPE_LENGTH (type));
2482// OBSOLETE }
2483#endif
5af923b0
MS
2484
2485
4eb8c7fc
DM
2486#ifndef CALL_DUMMY_CALL_OFFSET
2487#define CALL_DUMMY_CALL_OFFSET \
2488 (gdbarch_tdep (current_gdbarch)->call_dummy_call_offset)
2489#endif /* CALL_DUMMY_CALL_OFFSET */
2490
c906108c
SS
2491/* Insert the function address into a call dummy instruction sequence
2492 stored at DUMMY.
2493
2494 For structs and unions, if the function was compiled with Sun cc,
2495 it expects 'unimp' after the call. But gcc doesn't use that
b1e29e33
AC
2496 (twisted) convention. So leave a nop there for gcc
2497 (DEPRECATED_FIX_CALL_DUMMY can assume it is operating on a pristine
2498 CALL_DUMMY, not one that has already been customized for a
2499 different function). */
c906108c
SS
2500
2501void
fba45db2
KB
2502sparc_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun,
2503 struct type *value_type, int using_gcc)
c906108c
SS
2504{
2505 int i;
2506
2507 /* Store the relative adddress of the target function into the
2508 'call' instruction. */
2509 store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET, 4,
2510 (0x40000000
2511 | (((fun - (pc + CALL_DUMMY_CALL_OFFSET)) >> 2)
c5aa993b 2512 & 0x3fffffff)));
c906108c 2513
9e36d949
PS
2514 /* If the called function returns an aggregate value, fill in the UNIMP
2515 instruction containing the size of the returned aggregate return value,
2516 which follows the call instruction.
2517 For details see the SPARC Architecture Manual Version 8, Appendix D.3.
2518
2519 Adjust the call_dummy_breakpoint_offset for the bp_call_dummy breakpoint
2520 to the proper address in the call dummy, so that `finish' after a stop
2521 in a call dummy works.
04714b91
AC
2522
2523 Tweeking current_gdbarch is not an optimal solution, but the call
2524 to sparc_fix_call_dummy is immediately followed by a call to
2525 call_function_by_hand, which is the only function where
2526 dummy_breakpoint_offset is actually used, if it is non-zero. */
9e36d949
PS
2527 if (TYPE_CODE (value_type) == TYPE_CODE_STRUCT
2528 || TYPE_CODE (value_type) == TYPE_CODE_UNION)
2529 {
2530 store_unsigned_integer (dummy + CALL_DUMMY_CALL_OFFSET + 8, 4,
2531 TYPE_LENGTH (value_type) & 0x1fff);
b1e29e33 2532 set_gdbarch_deprecated_call_dummy_breakpoint_offset (current_gdbarch, 0x30);
9e36d949
PS
2533 }
2534 else
b1e29e33 2535 set_gdbarch_deprecated_call_dummy_breakpoint_offset (current_gdbarch, 0x2c);
c906108c 2536
5af923b0 2537 if (!(GDB_TARGET_IS_SPARC64))
c906108c 2538 {
5af923b0
MS
2539 /* If this is not a simulator target, change the first four
2540 instructions of the call dummy to NOPs. Those instructions
2541 include a 'save' instruction and are designed to work around
2542 problems with register window flushing in the simulator. */
2543
2544 if (strcmp (target_shortname, "sim") != 0)
2545 {
2546 for (i = 0; i < 4; i++)
2547 store_unsigned_integer (dummy + (i * 4), 4, 0x01000000);
2548 }
c906108c 2549 }
c906108c 2550
f81824a9
AC
2551#if 0
2552// OBSOLETE /* If this is a bi-endian target, GDB has written the call dummy
2553// OBSOLETE in little-endian order. We must byte-swap it back to big-endian. */
2554// OBSOLETE if (bi_endian)
2555// OBSOLETE {
2556// OBSOLETE for (i = 0; i < CALL_DUMMY_LENGTH; i += 4)
2557// OBSOLETE {
2558// OBSOLETE char tmp = dummy[i];
2559// OBSOLETE dummy[i] = dummy[i + 3];
2560// OBSOLETE dummy[i + 3] = tmp;
2561// OBSOLETE tmp = dummy[i + 1];
2562// OBSOLETE dummy[i + 1] = dummy[i + 2];
2563// OBSOLETE dummy[i + 2] = tmp;
2564// OBSOLETE }
2565// OBSOLETE }
2566#endif
c906108c
SS
2567}
2568
2569
f81824a9
AC
2570#if 0
2571// OBSOLETE /* Set target byte order based on machine type. */
2572// OBSOLETE
2573// OBSOLETE static int
2574// OBSOLETE sparc_target_architecture_hook (const bfd_arch_info_type *ap)
2575// OBSOLETE {
2576// OBSOLETE int i, j;
2577// OBSOLETE
2578// OBSOLETE if (ap->mach == bfd_mach_sparc_sparclite_le)
2579// OBSOLETE {
2580// OBSOLETE target_byte_order = BFD_ENDIAN_LITTLE;
2581// OBSOLETE bi_endian = 1;
2582// OBSOLETE }
2583// OBSOLETE else
2584// OBSOLETE bi_endian = 0;
2585// OBSOLETE return 1;
2586// OBSOLETE }
2587#endif
c5aa993b 2588
5af923b0
MS
2589/*
2590 * Module "constructor" function.
2591 */
2592
2593static struct gdbarch * sparc_gdbarch_init (struct gdbarch_info info,
2594 struct gdbarch_list *arches);
ef3cf062 2595static void sparc_dump_tdep (struct gdbarch *, struct ui_file *);
5af923b0 2596
a78f21af
AC
2597extern initialize_file_ftype _initialize_sparc_tdep; /* -Wmissing-prototypes */
2598
c906108c 2599void
fba45db2 2600_initialize_sparc_tdep (void)
c906108c 2601{
5af923b0 2602 /* Hook us into the gdbarch mechanism. */
ef3cf062 2603 gdbarch_register (bfd_arch_sparc, sparc_gdbarch_init, sparc_dump_tdep);
5af923b0 2604
d7a27068 2605 deprecated_tm_print_insn = gdb_print_insn_sparc;
810ecf9f 2606 deprecated_tm_print_insn_info.mach = TM_PRINT_INSN_MACH; /* Selects sparc/sparclite */
f81824a9 2607 /* OBSOLETE target_architecture_hook = sparc_target_architecture_hook; */
c906108c
SS
2608}
2609
5af923b0
MS
2610/* Compensate for stack bias. Note that we currently don't handle
2611 mixed 32/64 bit code. */
c906108c 2612
a78f21af 2613static CORE_ADDR
5af923b0 2614sparc64_read_sp (void)
c906108c
SS
2615{
2616 CORE_ADDR sp = read_register (SP_REGNUM);
2617
2618 if (sp & 1)
2619 sp += 2047;
2620 return sp;
2621}
2622
a78f21af 2623static CORE_ADDR
5af923b0 2624sparc64_read_fp (void)
c906108c 2625{
0ba6dca9 2626 CORE_ADDR fp = read_register (DEPRECATED_FP_REGNUM);
c906108c
SS
2627
2628 if (fp & 1)
2629 fp += 2047;
2630 return fp;
2631}
2632
a78f21af 2633static void
fba45db2 2634sparc64_write_sp (CORE_ADDR val)
c906108c
SS
2635{
2636 CORE_ADDR oldsp = read_register (SP_REGNUM);
2637 if (oldsp & 1)
2638 write_register (SP_REGNUM, val - 2047);
2639 else
2640 write_register (SP_REGNUM, val);
2641}
2642
5af923b0
MS
2643/* The SPARC 64 ABI passes floating-point arguments in FP0 to FP31,
2644 and all other arguments in O0 to O5. They are also copied onto
2645 the stack in the correct places. Apparently (empirically),
2646 structs of less than 16 bytes are passed member-by-member in
2647 separate registers, but I am unable to figure out the algorithm.
2648 Some members go in floating point regs, but I don't know which.
2649
2650 FIXME: Handle small structs (less than 16 bytes containing floats).
2651
2652 The counting regimen for using both integer and FP registers
2653 for argument passing is rather odd -- a single counter is used
2654 for both; this means that if the arguments alternate between
2655 int and float, we will waste every other register of both types. */
c906108c 2656
a78f21af 2657static CORE_ADDR
ea7c478f 2658sparc64_push_arguments (int nargs, struct value **args, CORE_ADDR sp,
fba45db2 2659 int struct_return, CORE_ADDR struct_retaddr)
c906108c 2660{
5af923b0 2661 int i, j, register_counter = 0;
c906108c 2662 CORE_ADDR tempsp;
5af923b0
MS
2663 struct type *sparc_intreg_type =
2664 TYPE_LENGTH (builtin_type_long) == SPARC_INTREG_SIZE ?
2665 builtin_type_long : builtin_type_long_long;
c5aa993b 2666
5af923b0 2667 sp = (sp & ~(((unsigned long) SPARC_INTREG_SIZE) - 1UL));
c906108c
SS
2668
2669 /* Figure out how much space we'll need. */
5af923b0 2670 for (i = nargs - 1; i >= 0; i--)
c906108c 2671 {
5af923b0 2672 int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
ea7c478f 2673 struct value *copyarg = args[i];
c906108c
SS
2674 int copylen = len;
2675
5af923b0 2676 if (copylen < SPARC_INTREG_SIZE)
c906108c 2677 {
5af923b0
MS
2678 copyarg = value_cast (sparc_intreg_type, copyarg);
2679 copylen = SPARC_INTREG_SIZE;
c5aa993b 2680 }
c906108c
SS
2681 sp -= copylen;
2682 }
2683
2684 /* Round down. */
2685 sp = sp & ~7;
2686 tempsp = sp;
2687
5af923b0
MS
2688 /* if STRUCT_RETURN, then first argument is the struct return location. */
2689 if (struct_return)
2690 write_register (O0_REGNUM + register_counter++, struct_retaddr);
2691
2692 /* Now write the arguments onto the stack, while writing FP
2693 arguments into the FP registers, and other arguments into the
2694 first six 'O' registers. */
2695
2696 for (i = 0; i < nargs; i++)
c906108c 2697 {
5af923b0 2698 int len = TYPE_LENGTH (check_typedef (VALUE_TYPE (args[i])));
ea7c478f 2699 struct value *copyarg = args[i];
5af923b0 2700 enum type_code typecode = TYPE_CODE (VALUE_TYPE (args[i]));
c906108c
SS
2701 int copylen = len;
2702
5af923b0
MS
2703 if (typecode == TYPE_CODE_INT ||
2704 typecode == TYPE_CODE_BOOL ||
2705 typecode == TYPE_CODE_CHAR ||
2706 typecode == TYPE_CODE_RANGE ||
2707 typecode == TYPE_CODE_ENUM)
2708 if (len < SPARC_INTREG_SIZE)
2709 {
2710 /* Small ints will all take up the size of one intreg on
2711 the stack. */
2712 copyarg = value_cast (sparc_intreg_type, copyarg);
2713 copylen = SPARC_INTREG_SIZE;
2714 }
2715
c906108c
SS
2716 write_memory (tempsp, VALUE_CONTENTS (copyarg), copylen);
2717 tempsp += copylen;
5af923b0
MS
2718
2719 /* Corner case: Structs consisting of a single float member are floats.
2720 * FIXME! I don't know about structs containing multiple floats!
2721 * Structs containing mixed floats and ints are even more weird.
2722 */
2723
2724
2725
2726 /* Separate float args from all other args. */
2727 if (typecode == TYPE_CODE_FLT && SPARC_HAS_FPU)
c906108c 2728 {
5af923b0
MS
2729 if (register_counter < 16)
2730 {
2731 /* This arg gets copied into a FP register. */
2732 int fpreg;
2733
2734 switch (len) {
2735 case 4: /* Single-precision (float) */
2736 fpreg = FP0_REGNUM + 2 * register_counter + 1;
2737 register_counter += 1;
2738 break;
2739 case 8: /* Double-precision (double) */
2740 fpreg = FP0_REGNUM + 2 * register_counter;
2741 register_counter += 1;
2742 break;
2743 case 16: /* Quad-precision (long double) */
2744 fpreg = FP0_REGNUM + 2 * register_counter;
2745 register_counter += 2;
2746 break;
93d56215
AC
2747 default:
2748 internal_error (__FILE__, __LINE__, "bad switch");
5af923b0 2749 }
73937e03
AC
2750 deprecated_write_register_bytes (REGISTER_BYTE (fpreg),
2751 VALUE_CONTENTS (args[i]),
2752 len);
5af923b0 2753 }
c906108c 2754 }
5af923b0
MS
2755 else /* all other args go into the first six 'o' registers */
2756 {
2757 for (j = 0;
2758 j < len && register_counter < 6;
2759 j += SPARC_INTREG_SIZE)
2760 {
2761 int oreg = O0_REGNUM + register_counter;
2762
4caf0990 2763 deprecated_write_register_gen (oreg, VALUE_CONTENTS (copyarg) + j);
5af923b0
MS
2764 register_counter += 1;
2765 }
2766 }
c906108c
SS
2767 }
2768 return sp;
2769}
2770
2771/* Values <= 32 bytes are returned in o0-o3 (floating-point values are
2772 returned in f0-f3). */
5af923b0 2773
a78f21af 2774static void
fba45db2
KB
2775sp64_extract_return_value (struct type *type, char *regbuf, char *valbuf,
2776 int bitoffset)
c906108c
SS
2777{
2778 int typelen = TYPE_LENGTH (type);
2779 int regsize = REGISTER_RAW_SIZE (O0_REGNUM);
2780
2781 if (TYPE_CODE (type) == TYPE_CODE_FLT && SPARC_HAS_FPU)
2782 {
c5aa993b 2783 memcpy (valbuf, &regbuf[REGISTER_BYTE (FP0_REGNUM)], typelen);
c906108c
SS
2784 return;
2785 }
2786
2787 if (TYPE_CODE (type) != TYPE_CODE_STRUCT
2788 || (TYPE_LENGTH (type) > 32))
2789 {
2790 memcpy (valbuf,
c5aa993b 2791 &regbuf[O0_REGNUM * regsize +
c906108c
SS
2792 (typelen >= regsize ? 0 : regsize - typelen)],
2793 typelen);
2794 return;
2795 }
2796 else
2797 {
2798 char *o0 = &regbuf[O0_REGNUM * regsize];
2799 char *f0 = &regbuf[FP0_REGNUM * regsize];
2800 int x;
2801
2802 for (x = 0; x < TYPE_NFIELDS (type); x++)
2803 {
c5aa993b 2804 struct field *f = &TYPE_FIELDS (type)[x];
c906108c
SS
2805 /* FIXME: We may need to handle static fields here. */
2806 int whichreg = (f->loc.bitpos + bitoffset) / 32;
2807 int remainder = ((f->loc.bitpos + bitoffset) % 32) / 8;
2808 int where = (f->loc.bitpos + bitoffset) / 8;
2809 int size = TYPE_LENGTH (f->type);
2810 int typecode = TYPE_CODE (f->type);
2811
2812 if (typecode == TYPE_CODE_STRUCT)
2813 {
5af923b0
MS
2814 sp64_extract_return_value (f->type,
2815 regbuf,
2816 valbuf,
2817 bitoffset + f->loc.bitpos);
c906108c 2818 }
5af923b0 2819 else if (typecode == TYPE_CODE_FLT && SPARC_HAS_FPU)
c906108c
SS
2820 {
2821 memcpy (valbuf + where, &f0[whichreg * 4] + remainder, size);
2822 }
2823 else
2824 {
2825 memcpy (valbuf + where, &o0[whichreg * 4] + remainder, size);
2826 }
2827 }
2828 }
2829}
2acceee2 2830
a78f21af 2831static void
5af923b0
MS
2832sparc64_extract_return_value (struct type *type, char *regbuf, char *valbuf)
2833{
2834 sp64_extract_return_value (type, regbuf, valbuf, 0);
2835}
2836
f81824a9
AC
2837#if 0
2838// OBSOLETE extern void
2839// OBSOLETE sparclet_extract_return_value (struct type *type,
2840// OBSOLETE char *regbuf,
2841// OBSOLETE char *valbuf)
2842// OBSOLETE {
2843// OBSOLETE regbuf += REGISTER_RAW_SIZE (O0_REGNUM) * 8;
2844// OBSOLETE if (TYPE_LENGTH (type) < REGISTER_RAW_SIZE (O0_REGNUM))
2845// OBSOLETE regbuf += REGISTER_RAW_SIZE (O0_REGNUM) - TYPE_LENGTH (type);
2846// OBSOLETE
2847// OBSOLETE memcpy ((void *) valbuf, regbuf, TYPE_LENGTH (type));
2848// OBSOLETE }
2849#endif
5af923b0
MS
2850
2851extern CORE_ADDR
2852sparc32_stack_align (CORE_ADDR addr)
2853{
2854 return ((addr + 7) & -8);
2855}
2856
a78f21af 2857static CORE_ADDR
5af923b0
MS
2858sparc64_stack_align (CORE_ADDR addr)
2859{
2860 return ((addr + 15) & -16);
2861}
2862
2863extern void
2864sparc_print_extra_frame_info (struct frame_info *fi)
2865{
da50a4b7 2866 if (fi && get_frame_extra_info (fi) && get_frame_extra_info (fi)->flat)
5af923b0 2867 printf_filtered (" flat, pc saved at 0x%s, fp saved at 0x%s\n",
da50a4b7
AC
2868 paddr_nz (get_frame_extra_info (fi)->pc_addr),
2869 paddr_nz (get_frame_extra_info (fi)->fp_addr));
5af923b0
MS
2870}
2871
2872/* MULTI_ARCH support */
2873
fa88f677 2874static const char *
5af923b0
MS
2875sparc32_register_name (int regno)
2876{
2877 static char *register_names[] =
2878 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2879 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2880 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2881 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2882
2883 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
2884 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
2885 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2886 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2887
2888 "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr"
2889 };
2890
2891 if (regno < 0 ||
2892 regno >= (sizeof (register_names) / sizeof (register_names[0])))
2893 return NULL;
2894 else
2895 return register_names[regno];
2896}
2897
fa88f677 2898static const char *
5af923b0
MS
2899sparc64_register_name (int regno)
2900{
2901 static char *register_names[] =
2902 { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2903 "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2904 "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2905 "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2906
2907 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
2908 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
2909 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2910 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2911 "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46",
2912 "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62",
2913
2914 "pc", "npc", "ccr", "fsr", "fprs", "y", "asi", "ver",
2915 "tick", "pil", "pstate", "tstate", "tba", "tl", "tt", "tpc",
2916 "tnpc", "wstate", "cwp", "cansave", "canrestore", "cleanwin", "otherwin",
2917 "asr16", "asr17", "asr18", "asr19", "asr20", "asr21", "asr22", "asr23",
2918 "asr24", "asr25", "asr26", "asr27", "asr28", "asr29", "asr30", "asr31",
2919 /* These are here at the end to simplify removing them if we have to. */
2920 "icc", "xcc", "fcc0", "fcc1", "fcc2", "fcc3"
2921 };
2922
2923 if (regno < 0 ||
2924 regno >= (sizeof (register_names) / sizeof (register_names[0])))
2925 return NULL;
2926 else
2927 return register_names[regno];
2928}
2929
5af923b0 2930#if 0
f81824a9
AC
2931// OBSOLETE static const char *
2932// OBSOLETE sparclite_register_name (int regno)
2933// OBSOLETE {
2934// OBSOLETE static char *register_names[] =
2935// OBSOLETE { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2936// OBSOLETE "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2937// OBSOLETE "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2938// OBSOLETE "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2939// OBSOLETE
2940// OBSOLETE "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
2941// OBSOLETE "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
2942// OBSOLETE "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
2943// OBSOLETE "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
2944// OBSOLETE
2945// OBSOLETE "y", "psr", "wim", "tbr", "pc", "npc", "fpsr", "cpsr",
2946// OBSOLETE "dia1", "dia2", "dda1", "dda2", "ddv1", "ddv2", "dcr", "dsr"
2947// OBSOLETE };
2948// OBSOLETE
2949// OBSOLETE if (regno < 0 ||
2950// OBSOLETE regno >= (sizeof (register_names) / sizeof (register_names[0])))
2951// OBSOLETE return NULL;
2952// OBSOLETE else
2953// OBSOLETE return register_names[regno];
2954// OBSOLETE }
2955#endif
5af923b0 2956
f81824a9
AC
2957#if 0
2958// OBSOLETE static const char *
2959// OBSOLETE sparclet_register_name (int regno)
2960// OBSOLETE {
2961// OBSOLETE static char *register_names[] =
2962// OBSOLETE { "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
2963// OBSOLETE "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
2964// OBSOLETE "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
2965// OBSOLETE "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
2966// OBSOLETE
2967// OBSOLETE "", "", "", "", "", "", "", "", /* no floating point registers */
2968// OBSOLETE "", "", "", "", "", "", "", "",
2969// OBSOLETE "", "", "", "", "", "", "", "",
2970// OBSOLETE "", "", "", "", "", "", "", "",
2971// OBSOLETE
2972// OBSOLETE "y", "psr", "wim", "tbr", "pc", "npc", "", "", /* no FPSR or CPSR */
2973// OBSOLETE "ccsr", "ccpr", "cccrcr", "ccor", "ccobr", "ccibr", "ccir", "",
2974// OBSOLETE
2975// OBSOLETE /* ASR15 ASR19 (don't display them) */
2976// OBSOLETE "asr1", "", "asr17", "asr18", "", "asr20", "asr21", "asr22"
2977// OBSOLETE /* None of the rest get displayed */
2978// OBSOLETE #if 0
2979// OBSOLETE "awr0", "awr1", "awr2", "awr3", "awr4", "awr5", "awr6", "awr7",
2980// OBSOLETE "awr8", "awr9", "awr10", "awr11", "awr12", "awr13", "awr14", "awr15",
2981// OBSOLETE "awr16", "awr17", "awr18", "awr19", "awr20", "awr21", "awr22", "awr23",
2982// OBSOLETE "awr24", "awr25", "awr26", "awr27", "awr28", "awr29", "awr30", "awr31",
2983// OBSOLETE "apsr"
2984// OBSOLETE #endif /* 0 */
2985// OBSOLETE };
2986// OBSOLETE
2987// OBSOLETE if (regno < 0 ||
2988// OBSOLETE regno >= (sizeof (register_names) / sizeof (register_names[0])))
2989// OBSOLETE return NULL;
2990// OBSOLETE else
2991// OBSOLETE return register_names[regno];
2992// OBSOLETE }
2993#endif
5af923b0 2994
a78f21af 2995static CORE_ADDR
5af923b0
MS
2996sparc_push_return_address (CORE_ADDR pc_unused, CORE_ADDR sp)
2997{
2998 if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
2999 {
3000 /* The return PC of the dummy_frame is the former 'current' PC
3001 (where we were before we made the target function call).
3002 This is saved in %i7 by push_dummy_frame.
3003
3004 We will save the 'call dummy location' (ie. the address
3005 to which the target function will return) in %o7.
3006 This address will actually be the program's entry point.
3007 There will be a special call_dummy breakpoint there. */
3008
3009 write_register (O7_REGNUM,
3010 CALL_DUMMY_ADDRESS () - 8);
3011 }
3012
3013 return sp;
3014}
3015
3016/* Should call_function allocate stack space for a struct return? */
3017
3018static int
3019sparc64_use_struct_convention (int gcc_p, struct type *type)
3020{
3021 return (TYPE_LENGTH (type) > 32);
3022}
3023
3024/* Store the address of the place in which to copy the structure the
3025 subroutine will return. This is called from call_function_by_hand.
3026 The ultimate mystery is, tho, what is the value "16"?
3027
3028 MVS: That's the offset from where the sp is now, to where the
3029 subroutine is gonna expect to find the struct return address. */
3030
3031static void
3032sparc32_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
3033{
3034 char *val;
3035 CORE_ADDR o7;
3036
3037 val = alloca (SPARC_INTREG_SIZE);
3038 store_unsigned_integer (val, SPARC_INTREG_SIZE, addr);
3039 write_memory (sp + (16 * SPARC_INTREG_SIZE), val, SPARC_INTREG_SIZE);
3040
3041 if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
3042 {
3043 /* Now adjust the value of the link register, which was previously
3044 stored by push_return_address. Functions that return structs are
3045 peculiar in that they return to link register + 12, rather than
3046 link register + 8. */
3047
3048 o7 = read_register (O7_REGNUM);
3049 write_register (O7_REGNUM, o7 - 4);
3050 }
3051}
3052
3053static void
3054sparc64_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
3055{
3056 /* FIXME: V9 uses %o0 for this. */
3057 /* FIXME MVS: Only for small enough structs!!! */
2acceee2 3058
5af923b0
MS
3059 target_write_memory (sp + (16 * SPARC_INTREG_SIZE),
3060 (char *) &addr, SPARC_INTREG_SIZE);
3061#if 0
3062 if (CALL_DUMMY_LOCATION == AT_ENTRY_POINT)
3063 {
3064 /* Now adjust the value of the link register, which was previously
3065 stored by push_return_address. Functions that return structs are
3066 peculiar in that they return to link register + 12, rather than
3067 link register + 8. */
3068
3069 write_register (O7_REGNUM, read_register (O7_REGNUM) - 4);
3070 }
c906108c 3071#endif
5af923b0
MS
3072}
3073
3074/* Default target data type for register REGNO. */
3075
3076static struct type *
3077sparc32_register_virtual_type (int regno)
3078{
3079 if (regno == PC_REGNUM ||
0ba6dca9 3080 regno == DEPRECATED_FP_REGNUM ||
5af923b0
MS
3081 regno == SP_REGNUM)
3082 return builtin_type_unsigned_int;
3083 if (regno < 32)
3084 return builtin_type_int;
3085 if (regno < 64)
3086 return builtin_type_float;
3087 return builtin_type_int;
3088}
3089
3090static struct type *
3091sparc64_register_virtual_type (int regno)
3092{
3093 if (regno == PC_REGNUM ||
0ba6dca9 3094 regno == DEPRECATED_FP_REGNUM ||
5af923b0
MS
3095 regno == SP_REGNUM)
3096 return builtin_type_unsigned_long_long;
3097 if (regno < 32)
3098 return builtin_type_long_long;
3099 if (regno < 64)
3100 return builtin_type_float;
3101 if (regno < 80)
3102 return builtin_type_double;
3103 return builtin_type_long_long;
3104}
3105
3106/* Number of bytes of storage in the actual machine representation for
3107 register REGNO. */
3108
3109static int
3110sparc32_register_size (int regno)
3111{
3112 return 4;
3113}
3114
3115static int
3116sparc64_register_size (int regno)
3117{
3118 return (regno < 32 ? 8 : regno < 64 ? 4 : 8);
3119}
3120
3121/* Index within the `registers' buffer of the first byte of the space
3122 for register REGNO. */
3123
3124static int
3125sparc32_register_byte (int regno)
3126{
3127 return (regno * 4);
3128}
3129
3130static int
3131sparc64_register_byte (int regno)
3132{
3133 if (regno < 32)
3134 return regno * 8;
3135 else if (regno < 64)
3136 return 32 * 8 + (regno - 32) * 4;
3137 else if (regno < 80)
3138 return 32 * 8 + 32 * 4 + (regno - 64) * 8;
3139 else
3140 return 64 * 8 + (regno - 80) * 8;
3141}
3142
5af923b0
MS
3143/* Immediately after a function call, return the saved pc.
3144 Can't go through the frames for this because on some machines
3145 the new frame is not set up until the new function executes
3146 some instructions. */
3147
3148static CORE_ADDR
3149sparc_saved_pc_after_call (struct frame_info *fi)
3150{
3151 return sparc_pc_adjust (read_register (RP_REGNUM));
3152}
3153
5af923b0
MS
3154/* Init saved regs: nothing to do, just a place-holder function. */
3155
3156static void
3157sparc_frame_init_saved_regs (struct frame_info *fi_ignored)
3158{ /* no-op */
3159}
3160
5af923b0
MS
3161/* gdbarch fix call dummy:
3162 All this function does is rearrange the arguments before calling
3163 sparc_fix_call_dummy (which does the real work). */
3164
3165static void
3166sparc_gdbarch_fix_call_dummy (char *dummy,
3167 CORE_ADDR pc,
3168 CORE_ADDR fun,
3169 int nargs,
3170 struct value **args,
3171 struct type *type,
3172 int gcc_p)
3173{
3174 if (CALL_DUMMY_LOCATION == ON_STACK)
3175 sparc_fix_call_dummy (dummy, pc, fun, type, gcc_p);
3176}
3177
5af923b0
MS
3178/* CALL_DUMMY_ADDRESS: fetch the breakpoint address for a call dummy. */
3179
3180static CORE_ADDR
3181sparc_call_dummy_address (void)
3182{
b1e29e33 3183 return (DEPRECATED_CALL_DUMMY_START_OFFSET) + DEPRECATED_CALL_DUMMY_BREAKPOINT_OFFSET;
5af923b0
MS
3184}
3185
3186/* Supply the Y register number to those that need it. */
3187
9f9970a3 3188int
5af923b0
MS
3189sparc_y_regnum (void)
3190{
3191 return gdbarch_tdep (current_gdbarch)->y_regnum;
3192}
3193
3194int
3195sparc_reg_struct_has_addr (int gcc_p, struct type *type)
3196{
3197 if (GDB_TARGET_IS_SPARC64)
3198 return (TYPE_LENGTH (type) > 32);
3199 else
3200 return (gcc_p != 1);
3201}
3202
a78f21af 3203static int
5af923b0
MS
3204sparc_intreg_size (void)
3205{
3206 return SPARC_INTREG_SIZE;
3207}
3208
3209static int
3210sparc_return_value_on_stack (struct type *type)
3211{
3212 if (TYPE_CODE (type) == TYPE_CODE_FLT &&
3213 TYPE_LENGTH (type) > 8)
3214 return 1;
3215 else
3216 return 0;
3217}
3218
143985b7 3219/* Get the ith function argument for the current function. */
a78f21af
AC
3220static CORE_ADDR
3221sparc_fetch_pointer_argument (struct frame_info *frame, int argi,
3222 struct type *type)
143985b7
AF
3223{
3224 CORE_ADDR addr;
3225 frame_read_register (frame, O0_REGNUM + argi, &addr);
3226 return addr;
3227}
3228
5af923b0
MS
3229/*
3230 * Gdbarch "constructor" function.
3231 */
3232
3233#define SPARC32_CALL_DUMMY_ON_STACK
3234
3235#define SPARC_SP_REGNUM 14
3236#define SPARC_FP_REGNUM 30
3237#define SPARC_FP0_REGNUM 32
3238#define SPARC32_NPC_REGNUM 69
3239#define SPARC32_PC_REGNUM 68
3240#define SPARC32_Y_REGNUM 64
3241#define SPARC64_PC_REGNUM 80
3242#define SPARC64_NPC_REGNUM 81
3243#define SPARC64_Y_REGNUM 85
3244
3245static struct gdbarch *
3246sparc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
3247{
3248 struct gdbarch *gdbarch;
3249 struct gdbarch_tdep *tdep;
3250
3251 static LONGEST call_dummy_32[] =
3252 { 0xbc100001, 0x9de38000, 0xbc100002, 0xbe100003,
3253 0xda03a058, 0xd803a054, 0xd603a050, 0xd403a04c,
3254 0xd203a048, 0x40000000, 0xd003a044, 0x01000000,
3255 0x91d02001, 0x01000000
3256 };
3257 static LONGEST call_dummy_64[] =
3258 { 0x9de3bec0fd3fa7f7LL, 0xf93fa7eff53fa7e7LL,
3259 0xf13fa7dfed3fa7d7LL, 0xe93fa7cfe53fa7c7LL,
3260 0xe13fa7bfdd3fa7b7LL, 0xd93fa7afd53fa7a7LL,
3261 0xd13fa79fcd3fa797LL, 0xc93fa78fc53fa787LL,
3262 0xc13fa77fcc3fa777LL, 0xc83fa76fc43fa767LL,
3263 0xc03fa75ffc3fa757LL, 0xf83fa74ff43fa747LL,
3264 0xf03fa73f01000000LL, 0x0100000001000000LL,
3265 0x0100000091580000LL, 0xd027a72b93500000LL,
3266 0xd027a72791480000LL, 0xd027a72391400000LL,
3267 0xd027a71fda5ba8a7LL, 0xd85ba89fd65ba897LL,
3268 0xd45ba88fd25ba887LL, 0x9fc02000d05ba87fLL,
3269 0x0100000091d02001LL, 0x0100000001000000LL
3270 };
3271 static LONGEST call_dummy_nil[] = {0};
3272
ef3cf062
JT
3273 /* Try to determine the OS ABI of the object we are loading. */
3274
4be87837
DJ
3275 if (info.abfd != NULL
3276 && info.osabi == GDB_OSABI_UNKNOWN)
ef3cf062 3277 {
4be87837
DJ
3278 /* If it's an ELF file, assume it's Solaris. */
3279 if (bfd_get_flavour (info.abfd) == bfd_target_elf_flavour)
3280 info.osabi = GDB_OSABI_SOLARIS;
ef3cf062
JT
3281 }
3282
5af923b0 3283 /* First see if there is already a gdbarch that can satisfy the request. */
4be87837
DJ
3284 arches = gdbarch_list_lookup_by_info (arches, &info);
3285 if (arches != NULL)
3286 return arches->gdbarch;
5af923b0
MS
3287
3288 /* None found: is the request for a sparc architecture? */
aca21d9a 3289 if (info.bfd_arch_info->arch != bfd_arch_sparc)
5af923b0
MS
3290 return NULL; /* No; then it's not for us. */
3291
3292 /* Yes: create a new gdbarch for the specified machine type. */
3293 tdep = (struct gdbarch_tdep *) xmalloc (sizeof (struct gdbarch_tdep));
3294 gdbarch = gdbarch_alloc (&info, tdep);
3295
3296 /* First set settings that are common for all sparc architectures. */
3297 set_gdbarch_believe_pcc_promotion (gdbarch, 1);
aaab4dba 3298 set_gdbarch_breakpoint_from_pc (gdbarch, sparc_breakpoint_from_pc);
5af923b0
MS
3299 set_gdbarch_decr_pc_after_break (gdbarch, 0);
3300 set_gdbarch_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
44b7b84e
MK
3301 set_gdbarch_extract_struct_value_address (gdbarch,
3302 sparc_extract_struct_value_address);
b1e29e33 3303 set_gdbarch_deprecated_fix_call_dummy (gdbarch, sparc_gdbarch_fix_call_dummy);
5af923b0 3304 set_gdbarch_float_bit (gdbarch, 4 * TARGET_CHAR_BIT);
0ba6dca9 3305 set_gdbarch_deprecated_fp_regnum (gdbarch, SPARC_FP_REGNUM);
5af923b0 3306 set_gdbarch_fp0_regnum (gdbarch, SPARC_FP0_REGNUM);
618ce49f 3307 set_gdbarch_deprecated_frame_chain (gdbarch, sparc_frame_chain);
f30ee0bc 3308 set_gdbarch_deprecated_frame_init_saved_regs (gdbarch, sparc_frame_init_saved_regs);
8bedc050 3309 set_gdbarch_deprecated_frame_saved_pc (gdbarch, sparc_frame_saved_pc);
5af923b0
MS
3310 set_gdbarch_frameless_function_invocation (gdbarch,
3311 frameless_look_for_prologue);
129c1cd6 3312 set_gdbarch_deprecated_get_saved_register (gdbarch, sparc_get_saved_register);
e9582e71 3313 set_gdbarch_deprecated_init_extra_frame_info (gdbarch, sparc_init_extra_frame_info);
5af923b0
MS
3314 set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
3315 set_gdbarch_int_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3316 set_gdbarch_long_double_bit (gdbarch, 16 * TARGET_CHAR_BIT);
3317 set_gdbarch_long_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
a0ed5532
AC
3318 set_gdbarch_deprecated_max_register_raw_size (gdbarch, 8);
3319 set_gdbarch_deprecated_max_register_virtual_size (gdbarch, 8);
749b82f6 3320 set_gdbarch_deprecated_pop_frame (gdbarch, sparc_pop_frame);
28f617b3 3321 set_gdbarch_deprecated_push_return_address (gdbarch, sparc_push_return_address);
f3824013 3322 set_gdbarch_deprecated_push_dummy_frame (gdbarch, sparc_push_dummy_frame);
5af923b0
MS
3323 set_gdbarch_reg_struct_has_addr (gdbarch, sparc_reg_struct_has_addr);
3324 set_gdbarch_return_value_on_stack (gdbarch, sparc_return_value_on_stack);
6913c89a 3325 set_gdbarch_deprecated_saved_pc_after_call (gdbarch, sparc_saved_pc_after_call);
9319a2fe 3326 set_gdbarch_prologue_frameless_p (gdbarch, sparc_prologue_frameless_p);
5af923b0 3327 set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT);
f510d44e 3328 set_gdbarch_skip_prologue (gdbarch, sparc_skip_prologue);
5af923b0 3329 set_gdbarch_sp_regnum (gdbarch, SPARC_SP_REGNUM);
07555a72 3330 set_gdbarch_deprecated_use_generic_dummy_frames (gdbarch, 0);
5af923b0
MS
3331 set_gdbarch_write_pc (gdbarch, generic_target_write_pc);
3332
143985b7
AF
3333 /* Helper for function argument information. */
3334 set_gdbarch_fetch_pointer_argument (gdbarch, sparc_fetch_pointer_argument);
3335
5af923b0
MS
3336 /*
3337 * Settings that depend only on 32/64 bit word size
3338 */
3339
3340 switch (info.bfd_arch_info->mach)
3341 {
3342 case bfd_mach_sparc:
f81824a9
AC
3343#if 0
3344 // OBSOLETE case bfd_mach_sparc_sparclet:
3345 // OBSOLETE case bfd_mach_sparc_sparclite:
3346#endif
5af923b0
MS
3347 case bfd_mach_sparc_v8plus:
3348 case bfd_mach_sparc_v8plusa:
f81824a9
AC
3349#if 0
3350 // OBSOLETE case bfd_mach_sparc_sparclite_le:
3351#endif
5af923b0
MS
3352 /* 32-bit machine types: */
3353
3354#ifdef SPARC32_CALL_DUMMY_ON_STACK
ae45cd16 3355 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
5af923b0 3356 set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
b1e29e33
AC
3357 set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, 0x30);
3358 set_gdbarch_deprecated_call_dummy_length (gdbarch, 0x38);
7e57f5f4 3359
7043d8dc
AC
3360 /* NOTE: cagney/2003-05-01: Using the just added push_dummy_code
3361 architecture method, it is now possible to implement a
3362 generic dummy frames based inferior function call that stores
3363 the breakpoint (and struct info) on the stack. Further, by
3364 treating a SIGSEG at a breakpoint as equivalent to a SIGTRAP
3365 it is even possible to make this work when the stack is
3366 no-execute.
3367
3368 NOTE: cagney/2002-04-26: Based from info posted by Peter
7e57f5f4
AC
3369 Schauer around Oct '99. Briefly, due to aspects of the SPARC
3370 ABI, it isn't possible to use ON_STACK with a strictly
3371 compliant compiler.
3372
3373 Peter Schauer writes ...
3374
3375 No, any call from GDB to a user function returning a
3376 struct/union will fail miserably. Try this:
3377
3378 *NOINDENT*
3379 struct x
3380 {
3381 int a[4];
3382 };
3383
3384 struct x gx;
3385
3386 struct x
3387 sret ()
3388 {
3389 return gx;
3390 }
3391
3392 main ()
3393 {
3394 int i;
3395 for (i = 0; i < 4; i++)
3396 gx.a[i] = i + 1;
3397 gx = sret ();
3398 }
3399 *INDENT*
3400
3401 Set a breakpoint at the gx = sret () statement, run to it and
3402 issue a `print sret()'. It will not succed with your
3403 approach, and I doubt that continuing the program will work
3404 as well.
3405
3406 For details of the ABI see the Sparc Architecture Manual. I
3407 have Version 8 (Prentice Hall ISBN 0-13-825001-4) and the
3408 calling conventions for functions returning aggregate values
3409 are explained in Appendix D.3. */
3410
5af923b0 3411 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
b1e29e33 3412 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_32);
5af923b0 3413#else
ae45cd16 3414 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
b1e29e33 3415 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_nil);
5af923b0 3416#endif
1bf6d5cc 3417 set_gdbarch_deprecated_call_dummy_stack_adjust (gdbarch, 68);
5af923b0
MS
3418 set_gdbarch_frame_args_skip (gdbarch, 68);
3419 set_gdbarch_function_start_offset (gdbarch, 0);
3420 set_gdbarch_long_bit (gdbarch, 4 * TARGET_CHAR_BIT);
3421 set_gdbarch_npc_regnum (gdbarch, SPARC32_NPC_REGNUM);
3422 set_gdbarch_pc_regnum (gdbarch, SPARC32_PC_REGNUM);
3423 set_gdbarch_ptr_bit (gdbarch, 4 * TARGET_CHAR_BIT);
b81774d8 3424 set_gdbarch_deprecated_push_arguments (gdbarch, sparc32_push_arguments);
5af923b0 3425
9c04cab7
AC
3426 set_gdbarch_deprecated_register_byte (gdbarch, sparc32_register_byte);
3427 set_gdbarch_deprecated_register_raw_size (gdbarch, sparc32_register_size);
b1e29e33 3428 set_gdbarch_deprecated_register_size (gdbarch, 4);
9c04cab7
AC
3429 set_gdbarch_deprecated_register_virtual_size (gdbarch, sparc32_register_size);
3430 set_gdbarch_deprecated_register_virtual_type (gdbarch, sparc32_register_virtual_type);
5af923b0 3431#ifdef SPARC32_CALL_DUMMY_ON_STACK
b1e29e33 3432 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (call_dummy_32));
5af923b0 3433#else
b1e29e33 3434 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, 0);
5af923b0
MS
3435#endif
3436 set_gdbarch_stack_align (gdbarch, sparc32_stack_align);
f933a9c5 3437 set_gdbarch_deprecated_extra_stack_alignment_needed (gdbarch, 1);
4183d812 3438 set_gdbarch_deprecated_store_struct_return (gdbarch, sparc32_store_struct_return);
5af923b0
MS
3439 set_gdbarch_use_struct_convention (gdbarch,
3440 generic_use_struct_convention);
b46e02f6 3441 set_gdbarch_deprecated_dummy_write_sp (gdbarch, deprecated_write_sp);
5af923b0
MS
3442 tdep->y_regnum = SPARC32_Y_REGNUM;
3443 tdep->fp_max_regnum = SPARC_FP0_REGNUM + 32;
3444 tdep->intreg_size = 4;
3445 tdep->reg_save_offset = 0x60;
3446 tdep->call_dummy_call_offset = 0x24;
3447 break;
3448
3449 case bfd_mach_sparc_v9:
3450 case bfd_mach_sparc_v9a:
3451 /* 64-bit machine types: */
3452 default: /* Any new machine type is likely to be 64-bit. */
3453
3454#ifdef SPARC64_CALL_DUMMY_ON_STACK
ae45cd16 3455 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_on_stack);
5af923b0 3456 set_gdbarch_call_dummy_address (gdbarch, sparc_call_dummy_address);
b1e29e33
AC
3457 set_gdbarch_deprecated_call_dummy_breakpoint_offset (gdbarch, 8 * 4);
3458 set_gdbarch_deprecated_call_dummy_length (gdbarch, 192);
5af923b0 3459 set_gdbarch_call_dummy_location (gdbarch, ON_STACK);
b1e29e33
AC
3460 set_gdbarch_deprecated_call_dummy_start_offset (gdbarch, 148);
3461 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_64);
5af923b0 3462#else
ae45cd16 3463 set_gdbarch_deprecated_pc_in_call_dummy (gdbarch, deprecated_pc_in_call_dummy_at_entry_point);
b1e29e33 3464 set_gdbarch_deprecated_call_dummy_words (gdbarch, call_dummy_nil);
5af923b0 3465#endif
1bf6d5cc 3466 set_gdbarch_deprecated_call_dummy_stack_adjust (gdbarch, 128);
5af923b0
MS
3467 set_gdbarch_frame_args_skip (gdbarch, 136);
3468 set_gdbarch_function_start_offset (gdbarch, 0);
3469 set_gdbarch_long_bit (gdbarch, 8 * TARGET_CHAR_BIT);
3470 set_gdbarch_npc_regnum (gdbarch, SPARC64_NPC_REGNUM);
3471 set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM);
3472 set_gdbarch_ptr_bit (gdbarch, 8 * TARGET_CHAR_BIT);
b81774d8 3473 set_gdbarch_deprecated_push_arguments (gdbarch, sparc64_push_arguments);
5af923b0 3474 /* NOTE different for at_entry */
0ba6dca9 3475 set_gdbarch_deprecated_target_read_fp (gdbarch, sparc64_read_fp);
5af923b0
MS
3476 set_gdbarch_read_sp (gdbarch, sparc64_read_sp);
3477 /* Some of the registers aren't 64 bits, but it's a lot simpler just
3478 to assume they all are (since most of them are). */
9c04cab7
AC
3479 set_gdbarch_deprecated_register_byte (gdbarch, sparc64_register_byte);
3480 set_gdbarch_deprecated_register_raw_size (gdbarch, sparc64_register_size);
b1e29e33 3481 set_gdbarch_deprecated_register_size (gdbarch, 8);
9c04cab7
AC
3482 set_gdbarch_deprecated_register_virtual_size (gdbarch, sparc64_register_size);
3483 set_gdbarch_deprecated_register_virtual_type (gdbarch, sparc64_register_virtual_type);
5af923b0 3484#ifdef SPARC64_CALL_DUMMY_ON_STACK
b1e29e33 3485 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, sizeof (call_dummy_64));
5af923b0 3486#else
b1e29e33 3487 set_gdbarch_deprecated_sizeof_call_dummy_words (gdbarch, 0);
5af923b0
MS
3488#endif
3489 set_gdbarch_stack_align (gdbarch, sparc64_stack_align);
f933a9c5 3490 set_gdbarch_deprecated_extra_stack_alignment_needed (gdbarch, 1);
4183d812 3491 set_gdbarch_deprecated_store_struct_return (gdbarch, sparc64_store_struct_return);
5af923b0
MS
3492 set_gdbarch_use_struct_convention (gdbarch,
3493 sparc64_use_struct_convention);
6c0e89ed 3494 set_gdbarch_deprecated_dummy_write_sp (gdbarch, sparc64_write_sp);
5af923b0
MS
3495 tdep->y_regnum = SPARC64_Y_REGNUM;
3496 tdep->fp_max_regnum = SPARC_FP0_REGNUM + 48;
3497 tdep->intreg_size = 8;
3498 tdep->reg_save_offset = 0x90;
3499 tdep->call_dummy_call_offset = 148 + 4 * 5;
3500 break;
3501 }
3502
3503 /*
3504 * Settings that vary per-architecture:
3505 */
3506
3507 switch (info.bfd_arch_info->mach)
3508 {
3509 case bfd_mach_sparc:
44b7b84e
MK
3510 set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
3511 set_gdbarch_store_return_value (gdbarch, sparc32_store_return_value);
5af923b0 3512 set_gdbarch_num_regs (gdbarch, 72);
b8b527c5 3513 set_gdbarch_deprecated_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
5af923b0 3514 set_gdbarch_register_name (gdbarch, sparc32_register_name);
f81824a9
AC
3515#if 0
3516 // OBSOLETE tdep->has_fpu = 1; /* (all but sparclet and sparclite) */
3517#endif
5af923b0
MS
3518 tdep->fp_register_bytes = 32 * 4;
3519 tdep->print_insn_mach = bfd_mach_sparc;
3520 break;
f81824a9
AC
3521#if 0
3522 // OBSOLETE case bfd_mach_sparc_sparclet:
3523 // OBSOLETE set_gdbarch_deprecated_extract_return_value (gdbarch, sparclet_extract_return_value);
3524 // OBSOLETE set_gdbarch_num_regs (gdbarch, 32 + 32 + 8 + 8 + 8);
3525 // OBSOLETE set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4 + 8*4);
3526 // OBSOLETE set_gdbarch_register_name (gdbarch, sparclet_register_name);
3527 // OBSOLETE set_gdbarch_deprecated_store_return_value (gdbarch, sparclet_store_return_value);
3528 // OBSOLETE tdep->has_fpu = 0; /* (all but sparclet and sparclite) */
3529 // OBSOLETE tdep->fp_register_bytes = 0;
3530 // OBSOLETE tdep->print_insn_mach = bfd_mach_sparc_sparclet;
3531 // OBSOLETE break;
3532#endif
3533#if 0
3534 // OBSOLETE case bfd_mach_sparc_sparclite:
3535 // OBSOLETE set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3536 // OBSOLETE set_gdbarch_num_regs (gdbarch, 80);
3537 // OBSOLETE set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
3538 // OBSOLETE set_gdbarch_register_name (gdbarch, sparclite_register_name);
3539 // OBSOLETE set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3540 // OBSOLETE tdep->has_fpu = 0; /* (all but sparclet and sparclite) */
3541 // OBSOLETE tdep->fp_register_bytes = 0;
3542 // OBSOLETE tdep->print_insn_mach = bfd_mach_sparc_sparclite;
3543 // OBSOLETE break;
3544#endif
5af923b0 3545 case bfd_mach_sparc_v8plus:
44b7b84e
MK
3546 set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
3547 set_gdbarch_store_return_value (gdbarch, sparc32_store_return_value);
5af923b0 3548 set_gdbarch_num_regs (gdbarch, 72);
b8b527c5 3549 set_gdbarch_deprecated_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
5af923b0 3550 set_gdbarch_register_name (gdbarch, sparc32_register_name);
5af923b0
MS
3551 tdep->print_insn_mach = bfd_mach_sparc;
3552 tdep->fp_register_bytes = 32 * 4;
f81824a9
AC
3553#if 0
3554 // OBSOLETE tdep->has_fpu = 1; /* (all but sparclet and sparclite) */
3555#endif
5af923b0
MS
3556 break;
3557 case bfd_mach_sparc_v8plusa:
44b7b84e
MK
3558 set_gdbarch_extract_return_value (gdbarch, sparc32_extract_return_value);
3559 set_gdbarch_store_return_value (gdbarch, sparc32_store_return_value);
5af923b0 3560 set_gdbarch_num_regs (gdbarch, 72);
b8b527c5 3561 set_gdbarch_deprecated_register_bytes (gdbarch, 32*4 + 32*4 + 8*4);
5af923b0 3562 set_gdbarch_register_name (gdbarch, sparc32_register_name);
f81824a9
AC
3563#if 0
3564 // OBSOLETE tdep->has_fpu = 1; /* (all but sparclet and sparclite) */
3565#endif
5af923b0
MS
3566 tdep->fp_register_bytes = 32 * 4;
3567 tdep->print_insn_mach = bfd_mach_sparc;
3568 break;
f81824a9
AC
3569#if 0
3570// OBSOLETE case bfd_mach_sparc_sparclite_le:
3571// OBSOLETE set_gdbarch_deprecated_extract_return_value (gdbarch, sparc32_extract_return_value);
3572// OBSOLETE set_gdbarch_num_regs (gdbarch, 80);
3573// OBSOLETE set_gdbarch_register_bytes (gdbarch, 32*4 + 32*4 + 8*4 + 8*4);
3574// OBSOLETE set_gdbarch_register_name (gdbarch, sparclite_register_name);
3575// OBSOLETE set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
3576// OBSOLETE tdep->has_fpu = 0; /* (all but sparclet and sparclite) */
3577// OBSOLETE tdep->fp_register_bytes = 0;
3578// OBSOLETE tdep->print_insn_mach = bfd_mach_sparc_sparclite;
3579// OBSOLETE break;
3580#endif
5af923b0 3581 case bfd_mach_sparc_v9:
26e9b323 3582 set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
5af923b0 3583 set_gdbarch_num_regs (gdbarch, 125);
b8b527c5 3584 set_gdbarch_deprecated_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
5af923b0 3585 set_gdbarch_register_name (gdbarch, sparc64_register_name);
ebba8386 3586 set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
f81824a9
AC
3587#if 0
3588 // OBSOLETE tdep->has_fpu = 1; /* (all but sparclet and sparclite) */
3589#endif
5af923b0
MS
3590 tdep->fp_register_bytes = 64 * 4;
3591 tdep->print_insn_mach = bfd_mach_sparc_v9a;
3592 break;
3593 case bfd_mach_sparc_v9a:
26e9b323 3594 set_gdbarch_deprecated_extract_return_value (gdbarch, sparc64_extract_return_value);
5af923b0 3595 set_gdbarch_num_regs (gdbarch, 125);
b8b527c5 3596 set_gdbarch_deprecated_register_bytes (gdbarch, 32*8 + 32*8 + 45*8);
5af923b0 3597 set_gdbarch_register_name (gdbarch, sparc64_register_name);
ebba8386 3598 set_gdbarch_deprecated_store_return_value (gdbarch, sparc_store_return_value);
f81824a9
AC
3599#if 0
3600 // OBSOLETE tdep->has_fpu = 1; /* (all but sparclet and sparclite) */
3601#endif
5af923b0
MS
3602 tdep->fp_register_bytes = 64 * 4;
3603 tdep->print_insn_mach = bfd_mach_sparc_v9a;
3604 break;
3605 }
3606
ef3cf062 3607 /* Hook in OS ABI-specific overrides, if they have been registered. */
4be87837 3608 gdbarch_init_osabi (info, gdbarch);
ef3cf062 3609
5af923b0
MS
3610 return gdbarch;
3611}
3612
ef3cf062
JT
3613static void
3614sparc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
3615{
3616 struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
3617
3618 if (tdep == NULL)
3619 return;
3620
f81824a9
AC
3621#if 0
3622 // OBSOLETE fprintf_unfiltered (file, "sparc_dump_tdep: has_fpu = %d\n",
3623 // OBSOLETE tdep->has_fpu);
3624#endif
4be87837
DJ
3625 fprintf_unfiltered (file, "sparc_dump_tdep: fp_register_bytes = %d\n",
3626 tdep->fp_register_bytes);
3627 fprintf_unfiltered (file, "sparc_dump_tdep: y_regnum = %d\n",
3628 tdep->y_regnum);
3629 fprintf_unfiltered (file, "sparc_dump_tdep: fp_max_regnum = %d\n",
3630 tdep->fp_max_regnum);
3631 fprintf_unfiltered (file, "sparc_dump_tdep: intreg_size = %d\n",
3632 tdep->intreg_size);
3633 fprintf_unfiltered (file, "sparc_dump_tdep: reg_save_offset = %d\n",
3634 tdep->reg_save_offset);
3635 fprintf_unfiltered (file, "sparc_dump_tdep: call_dummy_call_offset = %d\n",
3636 tdep->call_dummy_call_offset);
3637 fprintf_unfiltered (file, "sparc_dump_tdep: print_insn_match = %d\n",
d995ff4b 3638 tdep->print_insn_mach);
ef3cf062 3639}
This page took 0.623723 seconds and 4 git commands to generate.