1 /* Target-dependent code for UltraSPARC.
3 Copyright 2003, 2004 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #include "arch-utils.h"
24 #include "floatformat.h"
26 #include "frame-base.h"
27 #include "frame-unwind.h"
38 #include "gdb_assert.h"
39 #include "gdb_string.h"
41 #include "sparc64-tdep.h"
43 /* This file implements the The SPARC 64-bit ABI as defined by the
44 section "Low-Level System Information" of the SPARC Compliance
45 Definition (SCD) 2.4.1, which is the 64-bit System V psABI for
48 /* Please use the sparc32_-prefix for 32-bit specific code, the
49 sparc64_-prefix for 64-bit specific code and the sparc_-prefix for
50 code can handle both. */
52 /* The functions on this page are intended to be used to classify
53 function arguments. */
55 /* Return the contents if register REGNUM as an address. */
58 sparc_address_from_register (int regnum)
62 regcache_cooked_read_unsigned (current_regcache, regnum, &addr);
66 /* Check whether TYPE is "Integral or Pointer". */
69 sparc64_integral_or_pointer_p (const struct type *type)
71 switch (TYPE_CODE (type))
79 int len = TYPE_LENGTH (type);
80 gdb_assert (len == 1 || len == 2 || len == 4 || len == 8);
86 int len = TYPE_LENGTH (type);
87 gdb_assert (len == 8);
97 /* Check whether TYPE is "Floating". */
100 sparc64_floating_p (const struct type *type)
102 switch (TYPE_CODE (type))
106 int len = TYPE_LENGTH (type);
107 gdb_assert (len == 4 || len == 8 || len == 16);
117 /* Check whether TYPE is "Structure or Union". */
120 sparc64_structure_or_union_p (const struct type *type)
122 switch (TYPE_CODE (type))
124 case TYPE_CODE_STRUCT:
125 case TYPE_CODE_UNION:
134 /* Register information. */
136 struct sparc64_register_info
142 static struct sparc64_register_info sparc64_register_info[] =
144 { "g0", &builtin_type_int64 },
145 { "g1", &builtin_type_int64 },
146 { "g2", &builtin_type_int64 },
147 { "g3", &builtin_type_int64 },
148 { "g4", &builtin_type_int64 },
149 { "g5", &builtin_type_int64 },
150 { "g6", &builtin_type_int64 },
151 { "g7", &builtin_type_int64 },
153 { "o0", &builtin_type_int64 },
154 { "o1", &builtin_type_int64 },
155 { "o2", &builtin_type_int64 },
156 { "o3", &builtin_type_int64 },
157 { "o4", &builtin_type_int64 },
158 { "o5", &builtin_type_int64 },
159 { "sp", &builtin_type_void_data_ptr },
160 { "o7", &builtin_type_int64 },
162 { "l0", &builtin_type_int64 },
163 { "l1", &builtin_type_int64 },
164 { "l2", &builtin_type_int64 },
165 { "l3", &builtin_type_int64 },
166 { "l4", &builtin_type_int64 },
167 { "l5", &builtin_type_int64 },
168 { "l6", &builtin_type_int64 },
169 { "l7", &builtin_type_int64 },
171 { "i0", &builtin_type_int64 },
172 { "i1", &builtin_type_int64 },
173 { "i2", &builtin_type_int64 },
174 { "i3", &builtin_type_int64 },
175 { "i4", &builtin_type_int64 },
176 { "i5", &builtin_type_int64 },
177 { "fp", &builtin_type_void_data_ptr },
178 { "i7", &builtin_type_int64 },
180 { "f0", &builtin_type_float },
181 { "f1", &builtin_type_float },
182 { "f2", &builtin_type_float },
183 { "f3", &builtin_type_float },
184 { "f4", &builtin_type_float },
185 { "f5", &builtin_type_float },
186 { "f6", &builtin_type_float },
187 { "f7", &builtin_type_float },
188 { "f8", &builtin_type_float },
189 { "f9", &builtin_type_float },
190 { "f10", &builtin_type_float },
191 { "f11", &builtin_type_float },
192 { "f12", &builtin_type_float },
193 { "f13", &builtin_type_float },
194 { "f14", &builtin_type_float },
195 { "f15", &builtin_type_float },
196 { "f16", &builtin_type_float },
197 { "f17", &builtin_type_float },
198 { "f18", &builtin_type_float },
199 { "f19", &builtin_type_float },
200 { "f20", &builtin_type_float },
201 { "f21", &builtin_type_float },
202 { "f22", &builtin_type_float },
203 { "f23", &builtin_type_float },
204 { "f24", &builtin_type_float },
205 { "f25", &builtin_type_float },
206 { "f26", &builtin_type_float },
207 { "f27", &builtin_type_float },
208 { "f28", &builtin_type_float },
209 { "f29", &builtin_type_float },
210 { "f30", &builtin_type_float },
211 { "f31", &builtin_type_float },
212 { "f32", &builtin_type_double },
213 { "f34", &builtin_type_double },
214 { "f36", &builtin_type_double },
215 { "f38", &builtin_type_double },
216 { "f40", &builtin_type_double },
217 { "f42", &builtin_type_double },
218 { "f44", &builtin_type_double },
219 { "f46", &builtin_type_double },
220 { "f48", &builtin_type_double },
221 { "f50", &builtin_type_double },
222 { "f52", &builtin_type_double },
223 { "f54", &builtin_type_double },
224 { "f56", &builtin_type_double },
225 { "f58", &builtin_type_double },
226 { "f60", &builtin_type_double },
227 { "f62", &builtin_type_double },
229 { "pc", &builtin_type_void_func_ptr },
230 { "npc", &builtin_type_void_func_ptr },
232 /* This raw register contains the contents of %cwp, %pstate, %asi
233 and %ccr as laid out in a %tstate register. */
234 /* FIXME: Give it a name until we start using register groups. */
235 { "state", &builtin_type_int64 },
237 { "fsr", &builtin_type_int64 },
238 { "fprs", &builtin_type_int64 },
240 /* "Although Y is a 64-bit register, its high-order 32 bits are
241 reserved and always read as 0." */
242 { "y", &builtin_type_int64 }
245 /* Total number of registers. */
246 #define SPARC64_NUM_REGS ARRAY_SIZE (sparc64_register_info)
248 /* We provide the aliases %d0..%d62 and %q0..%q60 for the floating
249 registers as "psuedo" registers. */
251 static struct sparc64_register_info sparc64_pseudo_register_info[] =
253 { "cwp", &builtin_type_int64 },
254 { "pstate", &builtin_type_int64 },
255 { "asi", &builtin_type_int64 },
256 { "ccr", &builtin_type_int64 },
258 { "d0", &builtin_type_double },
259 { "d2", &builtin_type_double },
260 { "d4", &builtin_type_double },
261 { "d6", &builtin_type_double },
262 { "d8", &builtin_type_double },
263 { "d10", &builtin_type_double },
264 { "d12", &builtin_type_double },
265 { "d14", &builtin_type_double },
266 { "d16", &builtin_type_double },
267 { "d18", &builtin_type_double },
268 { "d20", &builtin_type_double },
269 { "d22", &builtin_type_double },
270 { "d24", &builtin_type_double },
271 { "d26", &builtin_type_double },
272 { "d28", &builtin_type_double },
273 { "d30", &builtin_type_double },
274 { "d32", &builtin_type_double },
275 { "d34", &builtin_type_double },
276 { "d36", &builtin_type_double },
277 { "d38", &builtin_type_double },
278 { "d40", &builtin_type_double },
279 { "d42", &builtin_type_double },
280 { "d44", &builtin_type_double },
281 { "d46", &builtin_type_double },
282 { "d48", &builtin_type_double },
283 { "d50", &builtin_type_double },
284 { "d52", &builtin_type_double },
285 { "d54", &builtin_type_double },
286 { "d56", &builtin_type_double },
287 { "d58", &builtin_type_double },
288 { "d60", &builtin_type_double },
289 { "d62", &builtin_type_double },
291 { "q0", &builtin_type_long_double },
292 { "q4", &builtin_type_long_double },
293 { "q8", &builtin_type_long_double },
294 { "q12", &builtin_type_long_double },
295 { "q16", &builtin_type_long_double },
296 { "q20", &builtin_type_long_double },
297 { "q24", &builtin_type_long_double },
298 { "q28", &builtin_type_long_double },
299 { "q32", &builtin_type_long_double },
300 { "q36", &builtin_type_long_double },
301 { "q40", &builtin_type_long_double },
302 { "q44", &builtin_type_long_double },
303 { "q48", &builtin_type_long_double },
304 { "q52", &builtin_type_long_double },
305 { "q56", &builtin_type_long_double },
306 { "q60", &builtin_type_long_double }
309 /* Total number of pseudo registers. */
310 #define SPARC64_NUM_PSEUDO_REGS ARRAY_SIZE (sparc64_pseudo_register_info)
312 /* Return the name of register REGNUM. */
315 sparc64_register_name (int regnum)
317 if (regnum >= 0 && regnum < SPARC64_NUM_REGS)
318 return sparc64_register_info[regnum].name;
320 if (regnum >= SPARC64_NUM_REGS
321 && regnum < SPARC64_NUM_REGS + SPARC64_NUM_PSEUDO_REGS)
322 return sparc64_pseudo_register_info[regnum - SPARC64_NUM_REGS].name;
327 /* Return the GDB type object for the "standard" data type of data in
331 sparc64_register_type (struct gdbarch *gdbarch, int regnum)
333 if (regnum >= SPARC64_NUM_REGS
334 && regnum < SPARC64_NUM_REGS + SPARC64_NUM_PSEUDO_REGS)
335 return *sparc64_pseudo_register_info[regnum - SPARC64_NUM_REGS].type;
337 gdb_assert (regnum >= 0 && regnum < SPARC64_NUM_REGS);
338 return *sparc64_register_info[regnum].type;
342 sparc64_pseudo_register_read (struct gdbarch *gdbarch,
343 struct regcache *regcache,
344 int regnum, void *buf)
346 gdb_assert (regnum >= SPARC64_NUM_REGS);
348 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
350 regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
351 regcache_raw_read (regcache, regnum, buf);
352 regcache_raw_read (regcache, regnum + 1, ((char *)buf) + 4);
354 else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
356 regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
357 regcache_raw_read (regcache, regnum, buf);
359 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
361 regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
362 regcache_raw_read (regcache, regnum, buf);
363 regcache_raw_read (regcache, regnum + 1, ((char *)buf) + 4);
364 regcache_raw_read (regcache, regnum + 2, ((char *)buf) + 8);
365 regcache_raw_read (regcache, regnum + 3, ((char *)buf) + 12);
367 else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
369 regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
370 regcache_raw_read (regcache, regnum, buf);
371 regcache_raw_read (regcache, regnum + 1, ((char *)buf) + 8);
373 else if (regnum == SPARC64_CWP_REGNUM
374 || regnum == SPARC64_PSTATE_REGNUM
375 || regnum == SPARC64_ASI_REGNUM
376 || regnum == SPARC64_CCR_REGNUM)
380 regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
383 case SPARC64_CWP_REGNUM:
384 state = (state >> 0) & ((1 << 5) - 1);
386 case SPARC64_PSTATE_REGNUM:
387 state = (state >> 8) & ((1 << 12) - 1);
389 case SPARC64_ASI_REGNUM:
390 state = (state >> 24) & ((1 << 8) - 1);
392 case SPARC64_CCR_REGNUM:
393 state = (state >> 32) & ((1 << 8) - 1);
396 store_unsigned_integer (buf, 8, state);
401 sparc64_pseudo_register_write (struct gdbarch *gdbarch,
402 struct regcache *regcache,
403 int regnum, const void *buf)
405 gdb_assert (regnum >= SPARC64_NUM_REGS);
407 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
409 regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
410 regcache_raw_write (regcache, regnum, buf);
411 regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 4);
413 else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
415 regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
416 regcache_raw_write (regcache, regnum, buf);
418 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
420 regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
421 regcache_raw_write (regcache, regnum, buf);
422 regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 4);
423 regcache_raw_write (regcache, regnum + 2, ((const char *)buf) + 8);
424 regcache_raw_write (regcache, regnum + 3, ((const char *)buf) + 12);
426 else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
428 regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
429 regcache_raw_write (regcache, regnum, buf);
430 regcache_raw_write (regcache, regnum + 1, ((const char *)buf) + 8);
432 else if (regnum == SPARC64_CWP_REGNUM
433 || regnum == SPARC64_PSTATE_REGNUM
434 || regnum == SPARC64_ASI_REGNUM
435 || regnum == SPARC64_CCR_REGNUM)
437 ULONGEST state, bits;
439 regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
440 bits = extract_unsigned_integer (buf, 8);
443 case SPARC64_CWP_REGNUM:
444 state |= ((bits & ((1 << 5) - 1)) << 0);
446 case SPARC64_PSTATE_REGNUM:
447 state |= ((bits & ((1 << 12) - 1)) << 8);
449 case SPARC64_ASI_REGNUM:
450 state |= ((bits & ((1 << 8) - 1)) << 24);
452 case SPARC64_CCR_REGNUM:
453 state |= ((bits & ((1 << 8) - 1)) << 32);
456 regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
461 /* Return PC of first real instruction of the function starting at
465 sparc64_skip_prologue (CORE_ADDR start_pc)
467 struct symtab_and_line sal;
468 CORE_ADDR func_start, func_end;
469 struct sparc_frame_cache cache;
471 /* This is the preferred method, find the end of the prologue by
472 using the debugging information. */
473 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
475 sal = find_pc_line (func_start, 0);
477 if (sal.end < func_end
478 && start_pc <= sal.end)
482 return sparc_analyze_prologue (start_pc, 0xffffffffffffffffULL, &cache);
487 static struct sparc_frame_cache *
488 sparc64_frame_cache (struct frame_info *next_frame, void **this_cache)
490 return sparc_frame_cache (next_frame, this_cache);
494 sparc64_frame_this_id (struct frame_info *next_frame, void **this_cache,
495 struct frame_id *this_id)
497 struct sparc_frame_cache *cache =
498 sparc64_frame_cache (next_frame, this_cache);
500 /* This marks the outermost frame. */
501 if (cache->base == 0)
504 (*this_id) = frame_id_build (cache->base, cache->pc);
508 sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
509 int regnum, int *optimizedp,
510 enum lval_type *lvalp, CORE_ADDR *addrp,
511 int *realnump, void *valuep)
513 struct sparc_frame_cache *cache =
514 sparc64_frame_cache (next_frame, this_cache);
516 if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
524 CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
526 regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
527 pc += frame_unwind_register_unsigned (next_frame, regnum) + 8;
528 store_unsigned_integer (valuep, 8, pc);
533 /* The previous frame's `local' and `in' registers have been saved
534 in the register save area. */
535 if (!cache->frameless_p
536 && regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM)
539 *lvalp = lval_memory;
540 *addrp = cache->base + BIAS + (regnum - SPARC_L0_REGNUM) * 8;
544 struct gdbarch *gdbarch = get_frame_arch (next_frame);
546 /* Read the value in from memory. */
547 read_memory (*addrp, valuep, register_size (gdbarch, regnum));
552 /* The previous frame's `out' registers are accessable as the
553 current frame's `in' registers. */
554 if (!cache->frameless_p
555 && regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
556 regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
558 frame_register_unwind (next_frame, regnum,
559 optimizedp, lvalp, addrp, realnump, valuep);
562 static const struct frame_unwind sparc64_frame_unwind =
565 sparc64_frame_this_id,
566 sparc64_frame_prev_register
569 static const struct frame_unwind *
570 sparc64_frame_sniffer (struct frame_info *next_frame)
572 return &sparc64_frame_unwind;
577 sparc64_frame_base_address (struct frame_info *next_frame, void **this_cache)
579 struct sparc_frame_cache *cache =
580 sparc64_frame_cache (next_frame, this_cache);
582 /* ??? Should we take BIAS into account here? */
586 static const struct frame_base sparc64_frame_base =
588 &sparc64_frame_unwind,
589 sparc64_frame_base_address,
590 sparc64_frame_base_address,
591 sparc64_frame_base_address
594 /* Check whether TYPE must be 16-byte aligned. */
597 sparc64_16_byte_align_p (struct type *type)
599 if (sparc64_floating_p (type) && TYPE_LENGTH (type) == 16)
602 if (sparc64_structure_or_union_p (type))
606 for (i = 0; i < TYPE_NFIELDS (type); i++)
607 if (sparc64_16_byte_align_p (TYPE_FIELD_TYPE (type, i)))
614 /* Store floating fields of element ELEMENT of an "parameter array"
615 that has type TYPE and is stored at BITPOS in VALBUF in the
616 apropriate registers of REGCACHE. This function can be called
617 recursively and therefore handles floating types in addition to
621 sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
622 char *valbuf, int element, int bitpos)
624 gdb_assert (element < 16);
626 if (sparc64_floating_p (type))
628 int len = TYPE_LENGTH (type);
633 gdb_assert (bitpos == 0);
634 gdb_assert ((element % 2) == 0);
636 regnum = SPARC64_Q0_REGNUM + element / 2;
637 regcache_cooked_write (regcache, regnum, valbuf);
641 gdb_assert (bitpos == 0 || bitpos == 64);
643 regnum = SPARC64_D0_REGNUM + element + bitpos / 64;
644 regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
648 gdb_assert (len == 4);
649 gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 128);
651 regnum = SPARC_F0_REGNUM + element * 2 + bitpos / 32;
652 regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
655 else if (sparc64_structure_or_union_p (type))
659 for (i = 0; i < TYPE_NFIELDS (type); i++)
660 sparc64_store_floating_fields (regcache, TYPE_FIELD_TYPE (type, i),
662 bitpos + TYPE_FIELD_BITPOS (type, i));
666 /* Fetch floating fields from a variable of type TYPE from the
667 appropriate registers for BITPOS in REGCACHE and store it at BITPOS
668 in VALBUF. This function can be called recursively and therefore
669 handles floating types in addition to structures. */
672 sparc64_extract_floating_fields (struct regcache *regcache, struct type *type,
673 char *valbuf, int bitpos)
675 if (sparc64_floating_p (type))
677 int len = TYPE_LENGTH (type);
682 gdb_assert (bitpos == 0 || bitpos == 128);
684 regnum = SPARC64_Q0_REGNUM + bitpos / 128;
685 regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
689 gdb_assert (bitpos % 64 == 0 && bitpos >= 0 && bitpos < 256);
691 regnum = SPARC64_D0_REGNUM + bitpos / 64;
692 regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
696 gdb_assert (len == 4);
697 gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 256);
699 regnum = SPARC_F0_REGNUM + bitpos / 32;
700 regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
703 else if (sparc64_structure_or_union_p (type))
707 for (i = 0; i < TYPE_NFIELDS (type); i++)
708 sparc64_extract_floating_fields (regcache, TYPE_FIELD_TYPE (type, i),
710 bitpos + TYPE_FIELD_BITPOS (type, i));
714 /* Store the NARGS arguments ARGS and STRUCT_ADDR (if STRUCT_RETURN is
715 non-zero) in REGCACHE and on the stack (starting from address SP). */
718 sparc64_store_arguments (struct regcache *regcache, int nargs,
719 struct value **args, CORE_ADDR sp,
720 int struct_return, CORE_ADDR struct_addr)
722 /* Number of extended words in the "parameter array". */
723 int num_elements = 0;
727 /* Take BIAS into account. */
730 /* First we calculate the number of extended words in the "parameter
731 array". While doing so we also convert some of the arguments. */
736 for (i = 0; i < nargs; i++)
738 struct type *type = VALUE_TYPE (args[i]);
739 int len = TYPE_LENGTH (type);
741 if (sparc64_structure_or_union_p (type))
743 /* Structure or Union arguments. */
746 if (num_elements % 2 && sparc64_16_byte_align_p (type))
748 num_elements += ((len + 7) / 8);
752 /* The psABI says that "Structures or unions larger than
753 sixteen bytes are copied by the caller and passed
754 indirectly; the caller will pass the address of a
755 correctly aligned structure value. This sixty-four
756 bit address will occupy one word in the parameter
757 array, and may be promoted to an %o register like any
758 other pointer value." Allocate memory for these
759 values on the stack. */
762 /* Use 16-byte alignment for these values. That's
763 always correct, and wasting a few bytes shouldn't be
767 write_memory (sp, VALUE_CONTENTS (args[i]), len);
768 args[i] = value_from_pointer (lookup_pointer_type (type), sp);
772 else if (sparc64_floating_p (type))
774 /* Floating arguments. */
778 /* The psABI says that "Each quad-precision parameter
779 value will be assigned to two extended words in the
783 /* The psABI says that "Long doubles must be
784 quad-aligned, and thus a hole might be introduced
785 into the parameter array to force alignment." Skip
786 an element if necessary. */
787 if (num_elements % 2)
795 /* Integral and pointer arguments. */
796 gdb_assert (sparc64_integral_or_pointer_p (type));
798 /* The psABI says that "Each argument value of integral type
799 smaller than an extended word will be widened by the
800 caller to an extended word according to the signed-ness
801 of the argument type." */
803 args[i] = value_cast (builtin_type_int64, args[i]);
808 /* Allocate the "parameter array". */
809 sp -= num_elements * 8;
811 /* The psABI says that "Every stack frame must be 16-byte aligned." */
814 /* Now we store the arguments in to the "paramater array". Some
815 Integer or Pointer arguments and Structure or Union arguments
816 will be passed in %o registers. Some Floating arguments and
817 floating members of structures are passed in floating-point
818 registers. However, for functions with variable arguments,
819 floating arguments are stored in an %0 register, and for
820 functions without a prototype floating arguments are stored in
821 both a floating-point and an %o registers, or a floating-point
822 register and memory. To simplify the logic here we always pass
823 arguments in memory, an %o register, and a floating-point
824 register if appropriate. This should be no problem since the
825 contents of any unused memory or registers in the "parameter
826 array" are undefined. */
830 regcache_cooked_write_unsigned (regcache, SPARC_O0_REGNUM, struct_addr);
834 for (i = 0; i < nargs; i++)
836 char *valbuf = VALUE_CONTENTS (args[i]);
837 struct type *type = VALUE_TYPE (args[i]);
838 int len = TYPE_LENGTH (type);
842 if (sparc64_structure_or_union_p (type))
844 /* Structure or Union arguments. */
845 gdb_assert (len <= 16);
846 memset (buf, 0, sizeof (buf));
847 valbuf = memcpy (buf, valbuf, len);
849 if (element % 2 && sparc64_16_byte_align_p (type))
854 regnum = SPARC_O0_REGNUM + element;
855 if (len > 8 && element < 5)
856 regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
860 sparc64_store_floating_fields (regcache, type, valbuf, element, 0);
862 else if (sparc64_floating_p (type))
864 /* Floating arguments. */
870 regnum = SPARC64_Q0_REGNUM + element / 2;
875 regnum = SPARC64_D0_REGNUM + element;
879 /* The psABI says "Each single-precision parameter value
880 will be assigned to one extended word in the
881 parameter array, and right-justified within that
882 word; the left half (even floatregister) is
883 undefined." Even though the psABI says that "the
884 left half is undefined", set it to zero here. */
886 valbuf = memcpy (buf + 4, valbuf, 4);
889 regnum = SPARC64_D0_REGNUM;
894 /* Integral and pointer arguments. */
895 gdb_assert (len == 8);
897 regnum = SPARC_O0_REGNUM + element;
902 regcache_cooked_write (regcache, regnum, valbuf);
904 /* If we're storing the value in a floating-point register,
905 also store it in the corresponding %0 register(s). */
906 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D10_REGNUM)
908 gdb_assert (element < 6);
909 regnum = SPARC_O0_REGNUM + element;
910 regcache_cooked_write (regcache, regnum, valbuf);
912 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM)
914 gdb_assert (element < 6);
915 regnum = SPARC_O0_REGNUM + element;
916 regcache_cooked_write (regcache, regnum, valbuf);
917 regcache_cooked_write (regcache, regnum + 1, valbuf);
921 /* Always store the argument in memeory. */
922 write_memory (sp + element * 8, valbuf, len);
923 element += ((len + 7) / 8);
926 gdb_assert (element == num_elements);
928 /* Take BIAS into account. */
934 sparc64_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
935 struct regcache *regcache, CORE_ADDR bp_addr,
936 int nargs, struct value **args, CORE_ADDR sp,
937 int struct_return, CORE_ADDR struct_addr)
939 /* Set return address. */
940 regcache_cooked_write_unsigned (regcache, SPARC_O7_REGNUM, bp_addr - 8);
942 /* Set up function arguments. */
943 sp = sparc64_store_arguments (regcache, nargs, args, sp,
944 struct_return, struct_addr);
946 /* Allocate the register save area. */
949 /* Stack should be 16-byte aligned at this point. */
950 gdb_assert ((sp + BIAS) % 16 == 0);
952 /* Finally, update the stack pointer. */
953 regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
959 /* Extract from an array REGBUF containing the (raw) register state, a
960 function return value of TYPE, and copy that into VALBUF. */
963 sparc64_extract_return_value (struct type *type, struct regcache *regcache,
966 int len = TYPE_LENGTH (type);
970 if (sparc64_structure_or_union_p (type))
972 /* Structure or Union return values. */
973 gdb_assert (len <= 32);
975 for (i = 0; i < ((len + 7) / 8); i++)
976 regcache_cooked_read (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
977 if (TYPE_CODE (type) != TYPE_CODE_UNION)
978 sparc64_extract_floating_fields (regcache, type, buf, 0);
979 memcpy (valbuf, buf, len);
981 else if (sparc64_floating_p (type))
983 /* Floating return values. */
984 for (i = 0; i < len / 4; i++)
985 regcache_cooked_read (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
986 memcpy (valbuf, buf, len);
990 /* Integral and pointer return values. */
991 gdb_assert (sparc64_integral_or_pointer_p (type));
993 /* Just stripping off any unused bytes should preserve the
994 signed-ness just fine. */
995 regcache_cooked_read (regcache, SPARC_O0_REGNUM, buf);
996 memcpy (valbuf, buf + 8 - len, len);
1000 /* Write into the appropriate registers a function return value stored
1001 in VALBUF of type TYPE. */
1004 sparc64_store_return_value (struct type *type, struct regcache *regcache,
1007 int len = TYPE_LENGTH (type);
1011 if (sparc64_structure_or_union_p (type))
1013 /* Structure or Union return values. */
1014 gdb_assert (len <= 32);
1016 /* Simplify matters by storing the complete value (including
1017 floating members) into %o0 and %o1. Floating members are
1018 also store in the appropriate floating-point registers. */
1019 memset (buf, 0, sizeof (buf));
1020 memcpy (buf, valbuf, len);
1021 for (i = 0; i < ((len + 7) / 8); i++)
1022 regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 4);
1023 if (TYPE_CODE (type) != TYPE_CODE_UNION)
1024 sparc64_store_floating_fields (regcache, type, buf, 0, 0);
1026 else if (sparc64_floating_p (type))
1028 /* Floating return values. */
1029 memcpy (buf, valbuf, len);
1030 for (i = 0; i < len / 4; i++)
1031 regcache_cooked_write (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
1035 /* Integral and pointer return values. */
1036 gdb_assert (sparc64_integral_or_pointer_p (type));
1038 /* ??? Do we need to do any sign-extension here? */
1040 memcpy (buf + 8 - len, valbuf, len);
1041 regcache_cooked_write (regcache, SPARC_O0_REGNUM, buf);
1046 sparc64_use_struct_convention (int gcc_p, struct type *type)
1048 /* Structure and union types up to 32 bytes in size are returned in
1050 return (TYPE_LENGTH (type) > 32);
1055 sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1057 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1059 tdep->pc_regnum = SPARC64_PC_REGNUM;
1060 tdep->npc_regnum = SPARC64_NPC_REGNUM;
1062 /* This is what all the fuss is about. */
1063 set_gdbarch_long_bit (gdbarch, 64);
1064 set_gdbarch_long_long_bit (gdbarch, 64);
1065 set_gdbarch_ptr_bit (gdbarch, 64);
1067 set_gdbarch_num_regs (gdbarch, SPARC64_NUM_REGS);
1068 set_gdbarch_register_name (gdbarch, sparc64_register_name);
1069 set_gdbarch_register_type (gdbarch, sparc64_register_type);
1070 set_gdbarch_num_pseudo_regs (gdbarch, SPARC64_NUM_PSEUDO_REGS);
1071 set_gdbarch_pseudo_register_read (gdbarch, sparc64_pseudo_register_read);
1072 set_gdbarch_pseudo_register_write (gdbarch, sparc64_pseudo_register_write);
1074 /* Register numbers of various important registers. */
1075 set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
1077 /* Call dummy code. */
1078 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1079 set_gdbarch_push_dummy_code (gdbarch, NULL);
1080 set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
1082 set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value);
1083 set_gdbarch_store_return_value (gdbarch, sparc64_store_return_value);
1084 set_gdbarch_use_struct_convention (gdbarch, sparc64_use_struct_convention);
1085 set_gdbarch_return_value_on_stack
1086 (gdbarch, generic_return_value_on_stack_not);
1087 set_gdbarch_stabs_argument_has_addr
1088 (gdbarch, default_stabs_argument_has_addr);
1090 set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
1092 frame_unwind_append_sniffer (gdbarch, sparc64_frame_sniffer);
1093 frame_base_set_default (gdbarch, &sparc64_frame_base);
1097 /* Helper functions for dealing with register sets. */
1099 #define TSTATE_CWP 0x000000000000001fULL
1100 #define TSTATE_ICC 0x0000000f00000000ULL
1101 #define TSTATE_XCC 0x000000f000000000ULL
1103 #define PSR_S 0x00000080
1104 #define PSR_ICC 0x00f00000
1105 #define PSR_VERS 0x0f000000
1106 #define PSR_IMPL 0xf0000000
1107 #define PSR_V8PLUS 0xff000000
1108 #define PSR_XCC 0x000f0000
1111 sparc64_supply_gregset (const struct sparc_gregset *gregset,
1112 struct regcache *regcache,
1113 int regnum, const void *gregs)
1115 int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
1116 const char *regs = gregs;
1121 if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1123 int offset = gregset->r_tstate_offset;
1124 ULONGEST tstate, psr;
1127 tstate = extract_unsigned_integer (regs + offset, 8);
1128 psr = ((tstate & TSTATE_CWP) | PSR_S | ((tstate & TSTATE_ICC) >> 12)
1129 | ((tstate & TSTATE_XCC) >> 20) | PSR_V8PLUS);
1130 store_unsigned_integer (buf, 4, psr);
1131 regcache_raw_supply (regcache, SPARC32_PSR_REGNUM, buf);
1134 if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1135 regcache_raw_supply (regcache, SPARC32_PC_REGNUM,
1136 regs + gregset->r_pc_offset + 4);
1138 if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1139 regcache_raw_supply (regcache, SPARC32_NPC_REGNUM,
1140 regs + gregset->r_npc_offset + 4);
1142 if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1144 int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1145 regcache_raw_supply (regcache, SPARC32_Y_REGNUM, regs + offset);
1150 if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1151 regcache_raw_supply (regcache, SPARC64_STATE_REGNUM,
1152 regs + gregset->r_tstate_offset);
1154 if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1155 regcache_raw_supply (regcache, SPARC64_PC_REGNUM,
1156 regs + gregset->r_pc_offset);
1158 if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1159 regcache_raw_supply (regcache, SPARC64_NPC_REGNUM,
1160 regs + gregset->r_npc_offset);
1162 if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1167 memcpy (buf + 8 - gregset->r_y_size,
1168 regs + gregset->r_y_offset, gregset->r_y_size);
1169 regcache_raw_supply (regcache, SPARC64_Y_REGNUM, buf);
1172 if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1173 && gregset->r_fprs_offset != -1)
1174 regcache_raw_supply (regcache, SPARC64_FPRS_REGNUM,
1175 regs + gregset->r_fprs_offset);
1178 if (regnum == SPARC_G0_REGNUM || regnum == -1)
1179 regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
1181 if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1183 int offset = gregset->r_g1_offset;
1188 for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1190 if (regnum == i || regnum == -1)
1191 regcache_raw_supply (regcache, i, regs + offset);
1196 if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1198 /* Not all of the register set variants include Locals and
1199 Inputs. For those that don't, we read them off the stack. */
1200 if (gregset->r_l0_offset == -1)
1204 regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
1205 sparc_supply_rwindow (regcache, sp, regnum);
1209 int offset = gregset->r_l0_offset;
1214 for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1216 if (regnum == i || regnum == -1)
1217 regcache_raw_supply (regcache, i, regs + offset);
1225 sparc64_collect_gregset (const struct sparc_gregset *gregset,
1226 const struct regcache *regcache,
1227 int regnum, void *gregs)
1229 int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
1235 if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1237 int offset = gregset->r_tstate_offset;
1238 ULONGEST tstate, psr;
1241 tstate = extract_unsigned_integer (regs + offset, 8);
1242 regcache_raw_collect (regcache, SPARC32_PSR_REGNUM, buf);
1243 psr = extract_unsigned_integer (buf, 4);
1244 tstate |= (psr & PSR_ICC) << 12;
1245 if ((psr & (PSR_VERS | PSR_IMPL)) == PSR_V8PLUS)
1246 tstate |= (psr & PSR_XCC) << 20;
1247 store_unsigned_integer (buf, 8, tstate);
1248 memcpy (regs + offset, buf, 8);
1251 if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1252 regcache_raw_collect (regcache, SPARC32_PC_REGNUM,
1253 regs + gregset->r_pc_offset + 4);
1255 if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1256 regcache_raw_collect (regcache, SPARC32_NPC_REGNUM,
1257 regs + gregset->r_npc_offset + 4);
1259 if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1261 int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1262 regcache_raw_collect (regcache, SPARC32_Y_REGNUM, regs + offset);
1267 if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1268 regcache_raw_collect (regcache, SPARC64_STATE_REGNUM,
1269 regs + gregset->r_tstate_offset);
1271 if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1272 regcache_raw_collect (regcache, SPARC64_PC_REGNUM,
1273 regs + gregset->r_pc_offset);
1275 if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1276 regcache_raw_collect (regcache, SPARC64_NPC_REGNUM,
1277 regs + gregset->r_npc_offset);
1279 if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1283 regcache_raw_collect (regcache, SPARC64_Y_REGNUM, buf);
1284 memcpy (regs + gregset->r_y_offset,
1285 buf + 8 - gregset->r_y_size, gregset->r_y_size);
1288 if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1289 && gregset->r_fprs_offset != -1)
1290 regcache_raw_collect (regcache, SPARC64_FPRS_REGNUM,
1291 regs + gregset->r_fprs_offset);
1295 if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1297 int offset = gregset->r_g1_offset;
1302 /* %g0 is always zero. */
1303 for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1305 if (regnum == i || regnum == -1)
1306 regcache_raw_collect (regcache, i, regs + offset);
1311 if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1313 /* Not all of the register set variants include Locals and
1314 Inputs. For those that don't, we read them off the stack. */
1315 if (gregset->r_l0_offset != -1)
1317 int offset = gregset->r_l0_offset;
1322 for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1324 if (regnum == i || regnum == -1)
1325 regcache_raw_collect (regcache, i, regs + offset);
1333 sparc64_supply_fpregset (struct regcache *regcache,
1334 int regnum, const void *fpregs)
1336 int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
1337 const char *regs = fpregs;
1340 for (i = 0; i < 32; i++)
1342 if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1343 regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1348 if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1349 regcache_raw_supply (regcache, SPARC32_FSR_REGNUM,
1350 regs + (32 * 4) + (16 * 8) + 4);
1354 for (i = 0; i < 16; i++)
1356 if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1357 regcache_raw_supply (regcache, SPARC64_F32_REGNUM + i,
1358 regs + (32 * 4) + (i * 8));
1361 if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1362 regcache_raw_supply (regcache, SPARC64_FSR_REGNUM,
1363 regs + (32 * 4) + (16 * 8));
1368 sparc64_collect_fpregset (const struct regcache *regcache,
1369 int regnum, void *fpregs)
1371 int sparc32 = (gdbarch_ptr_bit (current_gdbarch) == 32);
1372 char *regs = fpregs;
1375 for (i = 0; i < 32; i++)
1377 if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1378 regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1383 if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1384 regcache_raw_collect (regcache, SPARC32_FSR_REGNUM,
1385 regs + (32 * 4) + (16 * 8) + 4);
1389 for (i = 0; i < 16; i++)
1391 if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1392 regcache_raw_collect (regcache, SPARC64_F32_REGNUM + i,
1393 regs + (32 * 4) + (i * 8));
1396 if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1397 regcache_raw_collect (regcache, SPARC64_FSR_REGNUM,
1398 regs + (32 * 4) + (16 * 8));