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