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