2007-10-10 Markus Deuling <deuling@de.ibm.com>
[external/binutils.git] / gdb / sparc64-tdep.c
1 /* Target-dependent code for UltraSPARC.
2
3    Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
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 3 of the License, or
10    (at your option) any later version.
11
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.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "arch-utils.h"
22 #include "dwarf2-frame.h"
23 #include "floatformat.h"
24 #include "frame.h"
25 #include "frame-base.h"
26 #include "frame-unwind.h"
27 #include "gdbcore.h"
28 #include "gdbtypes.h"
29 #include "inferior.h"
30 #include "symtab.h"
31 #include "objfiles.h"
32 #include "osabi.h"
33 #include "regcache.h"
34 #include "target.h"
35 #include "value.h"
36
37 #include "gdb_assert.h"
38 #include "gdb_string.h"
39
40 #include "sparc64-tdep.h"
41
42 /* This file implements the The SPARC 64-bit ABI as defined by the
43    section "Low-Level System Information" of the SPARC Compliance
44    Definition (SCD) 2.4.1, which is the 64-bit System V psABI for
45    SPARC.  */
46
47 /* Please use the sparc32_-prefix for 32-bit specific code, the
48    sparc64_-prefix for 64-bit specific code and the sparc_-prefix for
49    code can handle both.  */
50 \f
51 /* The functions on this page are intended to be used to classify
52    function arguments.  */
53
54 /* Check whether TYPE is "Integral or Pointer".  */
55
56 static int
57 sparc64_integral_or_pointer_p (const struct type *type)
58 {
59   switch (TYPE_CODE (type))
60     {
61     case TYPE_CODE_INT:
62     case TYPE_CODE_BOOL:
63     case TYPE_CODE_CHAR:
64     case TYPE_CODE_ENUM:
65     case TYPE_CODE_RANGE:
66       {
67         int len = TYPE_LENGTH (type);
68         gdb_assert (len == 1 || len == 2 || len == 4 || len == 8);
69       }
70       return 1;
71     case TYPE_CODE_PTR:
72     case TYPE_CODE_REF:
73       {
74         int len = TYPE_LENGTH (type);
75         gdb_assert (len == 8);
76       }
77       return 1;
78     default:
79       break;
80     }
81
82   return 0;
83 }
84
85 /* Check whether TYPE is "Floating".  */
86
87 static int
88 sparc64_floating_p (const struct type *type)
89 {
90   switch (TYPE_CODE (type))
91     {
92     case TYPE_CODE_FLT:
93       {
94         int len = TYPE_LENGTH (type);
95         gdb_assert (len == 4 || len == 8 || len == 16);
96       }
97       return 1;
98     default:
99       break;
100     }
101
102   return 0;
103 }
104
105 /* Check whether TYPE is "Structure or Union".  */
106
107 static int
108 sparc64_structure_or_union_p (const struct type *type)
109 {
110   switch (TYPE_CODE (type))
111     {
112     case TYPE_CODE_STRUCT:
113     case TYPE_CODE_UNION:
114       return 1;
115     default:
116       break;
117     }
118
119   return 0;
120 }
121 \f
122
123 /* Type for %pstate.  */
124 struct type *sparc64_pstate_type;
125
126 /* Type for %fsr.  */
127 struct type *sparc64_fsr_type;
128
129 /* Type for %fprs.  */
130 struct type *sparc64_fprs_type;
131
132 /* Construct types for ISA-specific registers.  */
133
134 static void
135 sparc64_init_types (void)
136 {
137   struct type *type;
138
139   type = init_flags_type ("builtin_type_sparc64_pstate", 8);
140   append_flags_type_flag (type, 0, "AG");
141   append_flags_type_flag (type, 1, "IE");
142   append_flags_type_flag (type, 2, "PRIV");
143   append_flags_type_flag (type, 3, "AM");
144   append_flags_type_flag (type, 4, "PEF");
145   append_flags_type_flag (type, 5, "RED");
146   append_flags_type_flag (type, 8, "TLE");
147   append_flags_type_flag (type, 9, "CLE");
148   append_flags_type_flag (type, 10, "PID0");
149   append_flags_type_flag (type, 11, "PID1");
150   sparc64_pstate_type = type;
151
152   type = init_flags_type ("builtin_type_sparc64_fsr", 8);
153   append_flags_type_flag (type, 0, "NXA");
154   append_flags_type_flag (type, 1, "DZA");
155   append_flags_type_flag (type, 2, "UFA");
156   append_flags_type_flag (type, 3, "OFA");
157   append_flags_type_flag (type, 4, "NVA");
158   append_flags_type_flag (type, 5, "NXC");
159   append_flags_type_flag (type, 6, "DZC");
160   append_flags_type_flag (type, 7, "UFC");
161   append_flags_type_flag (type, 8, "OFC");
162   append_flags_type_flag (type, 9, "NVC");
163   append_flags_type_flag (type, 22, "NS");
164   append_flags_type_flag (type, 23, "NXM");
165   append_flags_type_flag (type, 24, "DZM");
166   append_flags_type_flag (type, 25, "UFM");
167   append_flags_type_flag (type, 26, "OFM");
168   append_flags_type_flag (type, 27, "NVM");
169   sparc64_fsr_type = type;
170
171   type = init_flags_type ("builtin_type_sparc64_fprs", 8);
172   append_flags_type_flag (type, 0, "DL");
173   append_flags_type_flag (type, 1, "DU");
174   append_flags_type_flag (type, 2, "FEF");
175   sparc64_fprs_type = type;
176 }
177
178 /* Register information.  */
179
180 static const char *sparc64_register_names[] =
181 {
182   "g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
183   "o0", "o1", "o2", "o3", "o4", "o5", "sp", "o7",
184   "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
185   "i0", "i1", "i2", "i3", "i4", "i5", "fp", "i7",
186
187   "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
188   "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
189   "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
190   "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
191   "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46",
192   "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62",
193
194   "pc", "npc",
195   
196   /* FIXME: Give "state" a name until we start using register groups.  */
197   "state",
198   "fsr",
199   "fprs",
200   "y",
201 };
202
203 /* Total number of registers.  */
204 #define SPARC64_NUM_REGS ARRAY_SIZE (sparc64_register_names)
205
206 /* We provide the aliases %d0..%d62 and %q0..%q60 for the floating
207    registers as "psuedo" registers.  */
208
209 static const char *sparc64_pseudo_register_names[] =
210 {
211   "cwp", "pstate", "asi", "ccr",
212
213   "d0", "d2", "d4", "d6", "d8", "d10", "d12", "d14",
214   "d16", "d18", "d20", "d22", "d24", "d26", "d28", "d30",
215   "d32", "d34", "d36", "d38", "d40", "d42", "d44", "d46",
216   "d48", "d50", "d52", "d54", "d56", "d58", "d60", "d62",
217
218   "q0", "q4", "q8", "q12", "q16", "q20", "q24", "q28",
219   "q32", "q36", "q40", "q44", "q48", "q52", "q56", "q60",
220 };
221
222 /* Total number of pseudo registers.  */
223 #define SPARC64_NUM_PSEUDO_REGS ARRAY_SIZE (sparc64_pseudo_register_names)
224
225 /* Return the name of register REGNUM.  */
226
227 static const char *
228 sparc64_register_name (int regnum)
229 {
230   if (regnum >= 0 && regnum < SPARC64_NUM_REGS)
231     return sparc64_register_names[regnum];
232
233   if (regnum >= SPARC64_NUM_REGS
234       && regnum < SPARC64_NUM_REGS + SPARC64_NUM_PSEUDO_REGS)
235     return sparc64_pseudo_register_names[regnum - SPARC64_NUM_REGS];
236
237   return NULL;
238 }
239
240 /* Return the GDB type object for the "standard" data type of data in
241    register REGNUM. */
242
243 static struct type *
244 sparc64_register_type (struct gdbarch *gdbarch, int regnum)
245 {
246   /* Raw registers.  */
247
248   if (regnum == SPARC_SP_REGNUM || regnum == SPARC_FP_REGNUM)
249     return builtin_type_void_data_ptr;
250   if (regnum >= SPARC_G0_REGNUM && regnum <= SPARC_I7_REGNUM)
251     return builtin_type_int64;
252   if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
253     return builtin_type_float;
254   if (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM)
255     return builtin_type_double;
256   if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
257     return builtin_type_void_func_ptr;
258   /* This raw register contains the contents of %cwp, %pstate, %asi
259      and %ccr as laid out in a %tstate register.  */
260   if (regnum == SPARC64_STATE_REGNUM)
261     return builtin_type_int64;
262   if (regnum == SPARC64_FSR_REGNUM)
263     return sparc64_fsr_type;
264   if (regnum == SPARC64_FPRS_REGNUM)
265     return sparc64_fprs_type;
266   /* "Although Y is a 64-bit register, its high-order 32 bits are
267      reserved and always read as 0."  */
268   if (regnum == SPARC64_Y_REGNUM)
269     return builtin_type_int64;
270
271   /* Pseudo registers.  */
272
273   if (regnum == SPARC64_CWP_REGNUM)
274     return builtin_type_int64;
275   if (regnum == SPARC64_PSTATE_REGNUM)
276     return sparc64_pstate_type;
277   if (regnum == SPARC64_ASI_REGNUM)
278     return builtin_type_int64;
279   if (regnum == SPARC64_CCR_REGNUM)
280     return builtin_type_int64;
281   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D62_REGNUM)
282     return builtin_type_double;
283   if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q60_REGNUM)
284     return builtin_type_long_double;
285
286   internal_error (__FILE__, __LINE__, _("invalid regnum"));
287 }
288
289 static void
290 sparc64_pseudo_register_read (struct gdbarch *gdbarch,
291                               struct regcache *regcache,
292                               int regnum, gdb_byte *buf)
293 {
294   gdb_assert (regnum >= SPARC64_NUM_REGS);
295
296   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
297     {
298       regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
299       regcache_raw_read (regcache, regnum, buf);
300       regcache_raw_read (regcache, regnum + 1, buf + 4);
301     }
302   else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
303     {
304       regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
305       regcache_raw_read (regcache, regnum, buf);
306     }
307   else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
308     {
309       regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
310       regcache_raw_read (regcache, regnum, buf);
311       regcache_raw_read (regcache, regnum + 1, buf + 4);
312       regcache_raw_read (regcache, regnum + 2, buf + 8);
313       regcache_raw_read (regcache, regnum + 3, buf + 12);
314     }
315   else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
316     {
317       regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
318       regcache_raw_read (regcache, regnum, buf);
319       regcache_raw_read (regcache, regnum + 1, buf + 8);
320     }
321   else if (regnum == SPARC64_CWP_REGNUM
322            || regnum == SPARC64_PSTATE_REGNUM
323            || regnum == SPARC64_ASI_REGNUM
324            || regnum == SPARC64_CCR_REGNUM)
325     {
326       ULONGEST state;
327
328       regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
329       switch (regnum)
330         {
331         case SPARC64_CWP_REGNUM:
332           state = (state >> 0) & ((1 << 5) - 1);
333           break;
334         case SPARC64_PSTATE_REGNUM:
335           state = (state >> 8) & ((1 << 12) - 1);
336           break;
337         case SPARC64_ASI_REGNUM:
338           state = (state >> 24) & ((1 << 8) - 1);
339           break;
340         case SPARC64_CCR_REGNUM:
341           state = (state >> 32) & ((1 << 8) - 1);
342           break;
343         }
344       store_unsigned_integer (buf, 8, state);
345     }
346 }
347
348 static void
349 sparc64_pseudo_register_write (struct gdbarch *gdbarch,
350                                struct regcache *regcache,
351                                int regnum, const gdb_byte *buf)
352 {
353   gdb_assert (regnum >= SPARC64_NUM_REGS);
354
355   if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
356     {
357       regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
358       regcache_raw_write (regcache, regnum, buf);
359       regcache_raw_write (regcache, regnum + 1, buf + 4);
360     }
361   else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
362     {
363       regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
364       regcache_raw_write (regcache, regnum, buf);
365     }
366   else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
367     {
368       regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
369       regcache_raw_write (regcache, regnum, buf);
370       regcache_raw_write (regcache, regnum + 1, buf + 4);
371       regcache_raw_write (regcache, regnum + 2, buf + 8);
372       regcache_raw_write (regcache, regnum + 3, buf + 12);
373     }
374   else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
375     {
376       regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
377       regcache_raw_write (regcache, regnum, buf);
378       regcache_raw_write (regcache, regnum + 1, buf + 8);
379     }
380   else if (regnum == SPARC64_CWP_REGNUM
381            || regnum == SPARC64_PSTATE_REGNUM
382            || regnum == SPARC64_ASI_REGNUM
383            || regnum == SPARC64_CCR_REGNUM)
384     {
385       ULONGEST state, bits;
386
387       regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
388       bits = extract_unsigned_integer (buf, 8);
389       switch (regnum)
390         {
391         case SPARC64_CWP_REGNUM:
392           state |= ((bits & ((1 << 5) - 1)) << 0);
393           break;
394         case SPARC64_PSTATE_REGNUM:
395           state |= ((bits & ((1 << 12) - 1)) << 8);
396           break;
397         case SPARC64_ASI_REGNUM:
398           state |= ((bits & ((1 << 8) - 1)) << 24);
399           break;
400         case SPARC64_CCR_REGNUM:
401           state |= ((bits & ((1 << 8) - 1)) << 32);
402           break;
403         }
404       regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
405     }
406 }
407 \f
408
409 /* Return PC of first real instruction of the function starting at
410    START_PC.  */
411
412 static CORE_ADDR
413 sparc64_skip_prologue (CORE_ADDR start_pc)
414 {
415   struct symtab_and_line sal;
416   CORE_ADDR func_start, func_end;
417   struct sparc_frame_cache cache;
418
419   /* This is the preferred method, find the end of the prologue by
420      using the debugging information.  */
421   if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
422     {
423       sal = find_pc_line (func_start, 0);
424
425       if (sal.end < func_end
426           && start_pc <= sal.end)
427         return sal.end;
428     }
429
430   return sparc_analyze_prologue (start_pc, 0xffffffffffffffffULL, &cache);
431 }
432
433 /* Normal frames.  */
434
435 static struct sparc_frame_cache *
436 sparc64_frame_cache (struct frame_info *next_frame, void **this_cache)
437 {
438   return sparc_frame_cache (next_frame, this_cache);
439 }
440
441 static void
442 sparc64_frame_this_id (struct frame_info *next_frame, void **this_cache,
443                        struct frame_id *this_id)
444 {
445   struct sparc_frame_cache *cache =
446     sparc64_frame_cache (next_frame, this_cache);
447
448   /* This marks the outermost frame.  */
449   if (cache->base == 0)
450     return;
451
452   (*this_id) = frame_id_build (cache->base, cache->pc);
453 }
454
455 static void
456 sparc64_frame_prev_register (struct frame_info *next_frame, void **this_cache,
457                              int regnum, int *optimizedp,
458                              enum lval_type *lvalp, CORE_ADDR *addrp,
459                              int *realnump, gdb_byte *valuep)
460 {
461   struct sparc_frame_cache *cache =
462     sparc64_frame_cache (next_frame, this_cache);
463
464   if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
465     {
466       *optimizedp = 0;
467       *lvalp = not_lval;
468       *addrp = 0;
469       *realnump = -1;
470       if (valuep)
471         {
472           CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
473
474           regnum = cache->frameless_p ? SPARC_O7_REGNUM : SPARC_I7_REGNUM;
475           pc += frame_unwind_register_unsigned (next_frame, regnum) + 8;
476           store_unsigned_integer (valuep, 8, pc);
477         }
478       return;
479     }
480
481   /* Handle StackGhost.  */
482   {
483     ULONGEST wcookie = sparc_fetch_wcookie ();
484
485     if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
486       {
487         *optimizedp = 0;
488         *lvalp = not_lval;
489         *addrp = 0;
490         *realnump = -1;
491         if (valuep)
492           {
493             CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
494             ULONGEST i7;
495
496             /* Read the value in from memory.  */
497             i7 = get_frame_memory_unsigned (next_frame, addr, 8);
498             store_unsigned_integer (valuep, 8, i7 ^ wcookie);
499           }
500         return;
501       }
502   }
503
504   /* The previous frame's `local' and `in' registers have been saved
505      in the register save area.  */
506   if (!cache->frameless_p
507       && regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM)
508     {
509       *optimizedp = 0;
510       *lvalp = lval_memory;
511       *addrp = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
512       *realnump = -1;
513       if (valuep)
514         {
515           struct gdbarch *gdbarch = get_frame_arch (next_frame);
516
517           /* Read the value in from memory.  */
518           read_memory (*addrp, valuep, register_size (gdbarch, regnum));
519         }
520       return;
521     }
522
523   /* The previous frame's `out' registers are accessable as the
524      current frame's `in' registers.  */
525   if (!cache->frameless_p
526       && regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM)
527     regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
528
529   *optimizedp = 0;
530   *lvalp = lval_register;
531   *addrp = 0;
532   *realnump = regnum;
533   if (valuep)
534     frame_unwind_register (next_frame, regnum, valuep);
535 }
536
537 static const struct frame_unwind sparc64_frame_unwind =
538 {
539   NORMAL_FRAME,
540   sparc64_frame_this_id,
541   sparc64_frame_prev_register
542 };
543
544 static const struct frame_unwind *
545 sparc64_frame_sniffer (struct frame_info *next_frame)
546 {
547   return &sparc64_frame_unwind;
548 }
549 \f
550
551 static CORE_ADDR
552 sparc64_frame_base_address (struct frame_info *next_frame, void **this_cache)
553 {
554   struct sparc_frame_cache *cache =
555     sparc64_frame_cache (next_frame, this_cache);
556
557   return cache->base;
558 }
559
560 static const struct frame_base sparc64_frame_base =
561 {
562   &sparc64_frame_unwind,
563   sparc64_frame_base_address,
564   sparc64_frame_base_address,
565   sparc64_frame_base_address
566 };
567 \f
568 /* Check whether TYPE must be 16-byte aligned.  */
569
570 static int
571 sparc64_16_byte_align_p (struct type *type)
572 {
573   if (sparc64_floating_p (type) && TYPE_LENGTH (type) == 16)
574     return 1;
575
576   if (sparc64_structure_or_union_p (type))
577     {
578       int i;
579
580       for (i = 0; i < TYPE_NFIELDS (type); i++)
581         {
582           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
583
584           if (sparc64_16_byte_align_p (subtype))
585             return 1;
586         }
587     }
588
589   return 0;
590 }
591
592 /* Store floating fields of element ELEMENT of an "parameter array"
593    that has type TYPE and is stored at BITPOS in VALBUF in the
594    apropriate registers of REGCACHE.  This function can be called
595    recursively and therefore handles floating types in addition to
596    structures.  */
597
598 static void
599 sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
600                                const gdb_byte *valbuf, int element, int bitpos)
601 {
602   gdb_assert (element < 16);
603
604   if (sparc64_floating_p (type))
605     {
606       int len = TYPE_LENGTH (type);
607       int regnum;
608
609       if (len == 16)
610         {
611           gdb_assert (bitpos == 0);
612           gdb_assert ((element % 2) == 0);
613
614           regnum = SPARC64_Q0_REGNUM + element / 2;
615           regcache_cooked_write (regcache, regnum, valbuf);
616         }
617       else if (len == 8)
618         {
619           gdb_assert (bitpos == 0 || bitpos == 64);
620
621           regnum = SPARC64_D0_REGNUM + element + bitpos / 64;
622           regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
623         }
624       else
625         {
626           gdb_assert (len == 4);
627           gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 128);
628
629           regnum = SPARC_F0_REGNUM + element * 2 + bitpos / 32;
630           regcache_cooked_write (regcache, regnum, valbuf + (bitpos / 8));
631         }
632     }
633   else if (sparc64_structure_or_union_p (type))
634     {
635       int i;
636
637       for (i = 0; i < TYPE_NFIELDS (type); i++)
638         {
639           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
640           int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
641
642           sparc64_store_floating_fields (regcache, subtype, valbuf,
643                                          element, subpos);
644         }
645
646       /* GCC has an interesting bug.  If TYPE is a structure that has
647          a single `float' member, GCC doesn't treat it as a structure
648          at all, but rather as an ordinary `float' argument.  This
649          argument will be stored in %f1, as required by the psABI.
650          However, as a member of a structure the psABI requires it to
651          be stored in %f0.  This bug is present in GCC 3.3.2, but
652          probably in older releases to.  To appease GCC, if a
653          structure has only a single `float' member, we store its
654          value in %f1 too (we already have stored in %f0).  */
655       if (TYPE_NFIELDS (type) == 1)
656         {
657           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, 0));
658
659           if (sparc64_floating_p (subtype) && TYPE_LENGTH (subtype) == 4)
660             regcache_cooked_write (regcache, SPARC_F1_REGNUM, valbuf);
661         }
662     }
663 }
664
665 /* Fetch floating fields from a variable of type TYPE from the
666    appropriate registers for BITPOS in REGCACHE and store it at BITPOS
667    in VALBUF.  This function can be called recursively and therefore
668    handles floating types in addition to structures.  */
669
670 static void
671 sparc64_extract_floating_fields (struct regcache *regcache, struct type *type,
672                                  gdb_byte *valbuf, int bitpos)
673 {
674   if (sparc64_floating_p (type))
675     {
676       int len = TYPE_LENGTH (type);
677       int regnum;
678
679       if (len == 16)
680         {
681           gdb_assert (bitpos == 0 || bitpos == 128);
682
683           regnum = SPARC64_Q0_REGNUM + bitpos / 128;
684           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
685         }
686       else if (len == 8)
687         {
688           gdb_assert (bitpos % 64 == 0 && bitpos >= 0 && bitpos < 256);
689
690           regnum = SPARC64_D0_REGNUM + bitpos / 64;
691           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
692         }
693       else
694         {
695           gdb_assert (len == 4);
696           gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 256);
697
698           regnum = SPARC_F0_REGNUM + bitpos / 32;
699           regcache_cooked_read (regcache, regnum, valbuf + (bitpos / 8));
700         }
701     }
702   else if (sparc64_structure_or_union_p (type))
703     {
704       int i;
705
706       for (i = 0; i < TYPE_NFIELDS (type); i++)
707         {
708           struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
709           int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
710
711           sparc64_extract_floating_fields (regcache, subtype, valbuf, subpos);
712         }
713     }
714 }
715
716 /* Store the NARGS arguments ARGS and STRUCT_ADDR (if STRUCT_RETURN is
717    non-zero) in REGCACHE and on the stack (starting from address SP).  */
718
719 static CORE_ADDR
720 sparc64_store_arguments (struct regcache *regcache, int nargs,
721                          struct value **args, CORE_ADDR sp,
722                          int struct_return, CORE_ADDR struct_addr)
723 {
724   /* Number of extended words in the "parameter array".  */
725   int num_elements = 0;
726   int element = 0;
727   int i;
728
729   /* Take BIAS into account.  */
730   sp += BIAS;
731
732   /* First we calculate the number of extended words in the "parameter
733      array".  While doing so we also convert some of the arguments.  */
734
735   if (struct_return)
736     num_elements++;
737
738   for (i = 0; i < nargs; i++)
739     {
740       struct type *type = value_type (args[i]);
741       int len = TYPE_LENGTH (type);
742
743       if (sparc64_structure_or_union_p (type))
744         {
745           /* Structure or Union arguments.  */
746           if (len <= 16)
747             {
748               if (num_elements % 2 && sparc64_16_byte_align_p (type))
749                 num_elements++;
750               num_elements += ((len + 7) / 8);
751             }
752           else
753             {
754               /* The psABI says that "Structures or unions larger than
755                  sixteen bytes are copied by the caller and passed
756                  indirectly; the caller will pass the address of a
757                  correctly aligned structure value.  This sixty-four
758                  bit address will occupy one word in the parameter
759                  array, and may be promoted to an %o register like any
760                  other pointer value."  Allocate memory for these
761                  values on the stack.  */
762               sp -= len;
763
764               /* Use 16-byte alignment for these values.  That's
765                  always correct, and wasting a few bytes shouldn't be
766                  a problem.  */
767               sp &= ~0xf;
768
769               write_memory (sp, value_contents (args[i]), len);
770               args[i] = value_from_pointer (lookup_pointer_type (type), sp);
771               num_elements++;
772             }
773         }
774       else if (sparc64_floating_p (type))
775         {
776           /* Floating arguments.  */
777
778           if (len == 16)
779             {
780               /* The psABI says that "Each quad-precision parameter
781                  value will be assigned to two extended words in the
782                  parameter array.  */
783               num_elements += 2;
784
785               /* The psABI says that "Long doubles must be
786                  quad-aligned, and thus a hole might be introduced
787                  into the parameter array to force alignment."  Skip
788                  an element if necessary.  */
789               if (num_elements % 2)
790                 num_elements++;
791             }
792           else
793             num_elements++;
794         }
795       else
796         {
797           /* Integral and pointer arguments.  */
798           gdb_assert (sparc64_integral_or_pointer_p (type));
799
800           /* The psABI says that "Each argument value of integral type
801              smaller than an extended word will be widened by the
802              caller to an extended word according to the signed-ness
803              of the argument type."  */
804           if (len < 8)
805             args[i] = value_cast (builtin_type_int64, args[i]);
806           num_elements++;
807         }
808     }
809
810   /* Allocate the "parameter array".  */
811   sp -= num_elements * 8;
812
813   /* The psABI says that "Every stack frame must be 16-byte aligned."  */
814   sp &= ~0xf;
815
816   /* Now we store the arguments in to the "paramater array".  Some
817      Integer or Pointer arguments and Structure or Union arguments
818      will be passed in %o registers.  Some Floating arguments and
819      floating members of structures are passed in floating-point
820      registers.  However, for functions with variable arguments,
821      floating arguments are stored in an %0 register, and for
822      functions without a prototype floating arguments are stored in
823      both a floating-point and an %o registers, or a floating-point
824      register and memory.  To simplify the logic here we always pass
825      arguments in memory, an %o register, and a floating-point
826      register if appropriate.  This should be no problem since the
827      contents of any unused memory or registers in the "parameter
828      array" are undefined.  */
829
830   if (struct_return)
831     {
832       regcache_cooked_write_unsigned (regcache, SPARC_O0_REGNUM, struct_addr);
833       element++;
834     }
835
836   for (i = 0; i < nargs; i++)
837     {
838       const gdb_byte *valbuf = value_contents (args[i]);
839       struct type *type = value_type (args[i]);
840       int len = TYPE_LENGTH (type);
841       int regnum = -1;
842       gdb_byte buf[16];
843
844       if (sparc64_structure_or_union_p (type))
845         {
846           /* Structure or Union arguments.  */
847           gdb_assert (len <= 16);
848           memset (buf, 0, sizeof (buf));
849           valbuf = memcpy (buf, valbuf, len);
850
851           if (element % 2 && sparc64_16_byte_align_p (type))
852             element++;
853
854           if (element < 6)
855             {
856               regnum = SPARC_O0_REGNUM + element;
857               if (len > 8 && element < 5)
858                 regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
859             }
860
861           if (element < 16)
862             sparc64_store_floating_fields (regcache, type, valbuf, element, 0);
863         }
864       else if (sparc64_floating_p (type))
865         {
866           /* Floating arguments.  */
867           if (len == 16)
868             {
869               if (element % 2)
870                 element++;
871               if (element < 16)
872                 regnum = SPARC64_Q0_REGNUM + element / 2;
873             }
874           else if (len == 8)
875             {
876               if (element < 16)
877                 regnum = SPARC64_D0_REGNUM + element;
878             }
879           else
880             {
881               /* The psABI says "Each single-precision parameter value
882                  will be assigned to one extended word in the
883                  parameter array, and right-justified within that
884                  word; the left half (even floatregister) is
885                  undefined."  Even though the psABI says that "the
886                  left half is undefined", set it to zero here.  */
887               memset (buf, 0, 4);
888               memcpy (buf + 4, valbuf, 4);
889               valbuf = buf;
890               len = 8;
891               if (element < 16)
892                 regnum = SPARC64_D0_REGNUM + element;
893             }
894         }
895       else
896         {
897           /* Integral and pointer arguments.  */
898           gdb_assert (len == 8);
899           if (element < 6)
900             regnum = SPARC_O0_REGNUM + element;
901         }
902
903       if (regnum != -1)
904         {
905           regcache_cooked_write (regcache, regnum, valbuf);
906
907           /* If we're storing the value in a floating-point register,
908              also store it in the corresponding %0 register(s).  */
909           if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D10_REGNUM)
910             {
911               gdb_assert (element < 6);
912               regnum = SPARC_O0_REGNUM + element;
913               regcache_cooked_write (regcache, regnum, valbuf);
914             }
915           else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM)
916             {
917               gdb_assert (element < 6);
918               regnum = SPARC_O0_REGNUM + element;
919               regcache_cooked_write (regcache, regnum, valbuf);
920               regcache_cooked_write (regcache, regnum + 1, valbuf + 8);
921             }
922         }
923
924       /* Always store the argument in memory.  */
925       write_memory (sp + element * 8, valbuf, len);
926       element += ((len + 7) / 8);
927     }
928
929   gdb_assert (element == num_elements);
930
931   /* Take BIAS into account.  */
932   sp -= BIAS;
933   return sp;
934 }
935
936 static CORE_ADDR
937 sparc64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
938                          struct regcache *regcache, CORE_ADDR bp_addr,
939                          int nargs, struct value **args, CORE_ADDR sp,
940                          int struct_return, CORE_ADDR struct_addr)
941 {
942   /* Set return address.  */
943   regcache_cooked_write_unsigned (regcache, SPARC_O7_REGNUM, bp_addr - 8);
944
945   /* Set up function arguments.  */
946   sp = sparc64_store_arguments (regcache, nargs, args, sp,
947                                 struct_return, struct_addr);
948
949   /* Allocate the register save area.  */
950   sp -= 16 * 8;
951
952   /* Stack should be 16-byte aligned at this point.  */
953   gdb_assert ((sp + BIAS) % 16 == 0);
954
955   /* Finally, update the stack pointer.  */
956   regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
957
958   return sp + BIAS;
959 }
960 \f
961
962 /* Extract from an array REGBUF containing the (raw) register state, a
963    function return value of TYPE, and copy that into VALBUF.  */
964
965 static void
966 sparc64_extract_return_value (struct type *type, struct regcache *regcache,
967                               gdb_byte *valbuf)
968 {
969   int len = TYPE_LENGTH (type);
970   gdb_byte buf[32];
971   int i;
972
973   if (sparc64_structure_or_union_p (type))
974     {
975       /* Structure or Union return values.  */
976       gdb_assert (len <= 32);
977
978       for (i = 0; i < ((len + 7) / 8); i++)
979         regcache_cooked_read (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
980       if (TYPE_CODE (type) != TYPE_CODE_UNION)
981         sparc64_extract_floating_fields (regcache, type, buf, 0);
982       memcpy (valbuf, buf, len);
983     }
984   else if (sparc64_floating_p (type))
985     {
986       /* Floating return values.  */
987       for (i = 0; i < len / 4; i++)
988         regcache_cooked_read (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
989       memcpy (valbuf, buf, len);
990     }
991   else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
992     {
993       /* Small arrays are returned the same way as small structures.  */
994       gdb_assert (len <= 32);
995
996       for (i = 0; i < ((len + 7) / 8); i++)
997         regcache_cooked_read (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
998       memcpy (valbuf, buf, len);
999     }
1000   else
1001     {
1002       /* Integral and pointer return values.  */
1003       gdb_assert (sparc64_integral_or_pointer_p (type));
1004
1005       /* Just stripping off any unused bytes should preserve the
1006          signed-ness just fine.  */
1007       regcache_cooked_read (regcache, SPARC_O0_REGNUM, buf);
1008       memcpy (valbuf, buf + 8 - len, len);
1009     }
1010 }
1011
1012 /* Write into the appropriate registers a function return value stored
1013    in VALBUF of type TYPE.  */
1014
1015 static void
1016 sparc64_store_return_value (struct type *type, struct regcache *regcache,
1017                             const gdb_byte *valbuf)
1018 {
1019   int len = TYPE_LENGTH (type);
1020   gdb_byte buf[16];
1021   int i;
1022
1023   if (sparc64_structure_or_union_p (type))
1024     {
1025       /* Structure or Union return values.  */
1026       gdb_assert (len <= 32);
1027
1028       /* Simplify matters by storing the complete value (including
1029          floating members) into %o0 and %o1.  Floating members are
1030          also store in the appropriate floating-point registers.  */
1031       memset (buf, 0, sizeof (buf));
1032       memcpy (buf, valbuf, len);
1033       for (i = 0; i < ((len + 7) / 8); i++)
1034         regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
1035       if (TYPE_CODE (type) != TYPE_CODE_UNION)
1036         sparc64_store_floating_fields (regcache, type, buf, 0, 0);
1037     }
1038   else if (sparc64_floating_p (type))
1039     {
1040       /* Floating return values.  */
1041       memcpy (buf, valbuf, len);
1042       for (i = 0; i < len / 4; i++)
1043         regcache_cooked_write (regcache, SPARC_F0_REGNUM + i, buf + i * 4);
1044     }
1045   else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
1046     {
1047       /* Small arrays are returned the same way as small structures.  */
1048       gdb_assert (len <= 32);
1049
1050       memset (buf, 0, sizeof (buf));
1051       memcpy (buf, valbuf, len);
1052       for (i = 0; i < ((len + 7) / 8); i++)
1053         regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
1054     }
1055   else
1056     {
1057       /* Integral and pointer return values.  */
1058       gdb_assert (sparc64_integral_or_pointer_p (type));
1059
1060       /* ??? Do we need to do any sign-extension here?  */
1061       memset (buf, 0, 8);
1062       memcpy (buf + 8 - len, valbuf, len);
1063       regcache_cooked_write (regcache, SPARC_O0_REGNUM, buf);
1064     }
1065 }
1066
1067 static enum return_value_convention
1068 sparc64_return_value (struct gdbarch *gdbarch, struct type *type,
1069                       struct regcache *regcache, gdb_byte *readbuf,
1070                       const gdb_byte *writebuf)
1071 {
1072   if (TYPE_LENGTH (type) > 32)
1073     return RETURN_VALUE_STRUCT_CONVENTION;
1074
1075   if (readbuf)
1076     sparc64_extract_return_value (type, regcache, readbuf);
1077   if (writebuf)
1078     sparc64_store_return_value (type, regcache, writebuf);
1079
1080   return RETURN_VALUE_REGISTER_CONVENTION;
1081 }
1082 \f
1083
1084 static void
1085 sparc64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
1086                                struct dwarf2_frame_state_reg *reg,
1087                                struct frame_info *next_frame)
1088 {
1089   switch (regnum)
1090     {
1091     case SPARC_G0_REGNUM:
1092       /* Since %g0 is always zero, there is no point in saving it, and
1093          people will be inclined omit it from the CFI.  Make sure we
1094          don't warn about that.  */
1095       reg->how = DWARF2_FRAME_REG_SAME_VALUE;
1096       break;
1097     case SPARC_SP_REGNUM:
1098       reg->how = DWARF2_FRAME_REG_CFA;
1099       break;
1100     case SPARC64_PC_REGNUM:
1101       reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1102       reg->loc.offset = 8;
1103       break;
1104     case SPARC64_NPC_REGNUM:
1105       reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1106       reg->loc.offset = 12;
1107       break;
1108     }
1109 }
1110
1111 void
1112 sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1113 {
1114   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
1115
1116   tdep->pc_regnum = SPARC64_PC_REGNUM;
1117   tdep->npc_regnum = SPARC64_NPC_REGNUM;
1118
1119   /* This is what all the fuss is about.  */
1120   set_gdbarch_long_bit (gdbarch, 64);
1121   set_gdbarch_long_long_bit (gdbarch, 64);
1122   set_gdbarch_ptr_bit (gdbarch, 64);
1123
1124   set_gdbarch_num_regs (gdbarch, SPARC64_NUM_REGS);
1125   set_gdbarch_register_name (gdbarch, sparc64_register_name);
1126   set_gdbarch_register_type (gdbarch, sparc64_register_type);
1127   set_gdbarch_num_pseudo_regs (gdbarch, SPARC64_NUM_PSEUDO_REGS);
1128   set_gdbarch_pseudo_register_read (gdbarch, sparc64_pseudo_register_read);
1129   set_gdbarch_pseudo_register_write (gdbarch, sparc64_pseudo_register_write);
1130
1131   /* Register numbers of various important registers.  */
1132   set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
1133
1134   /* Call dummy code.  */
1135   set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1136   set_gdbarch_push_dummy_code (gdbarch, NULL);
1137   set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
1138
1139   set_gdbarch_return_value (gdbarch, sparc64_return_value);
1140   set_gdbarch_stabs_argument_has_addr
1141     (gdbarch, default_stabs_argument_has_addr);
1142
1143   set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
1144
1145   /* Hook in the DWARF CFI frame unwinder.  */
1146   dwarf2_frame_set_init_reg (gdbarch, sparc64_dwarf2_frame_init_reg);
1147   /* FIXME: kettenis/20050423: Don't enable the unwinder until the
1148      StackGhost issues have been resolved.  */
1149
1150   frame_unwind_append_sniffer (gdbarch, sparc64_frame_sniffer);
1151   frame_base_set_default (gdbarch, &sparc64_frame_base);
1152 }
1153 \f
1154
1155 /* Helper functions for dealing with register sets.  */
1156
1157 #define TSTATE_CWP      0x000000000000001fULL
1158 #define TSTATE_ICC      0x0000000f00000000ULL
1159 #define TSTATE_XCC      0x000000f000000000ULL
1160
1161 #define PSR_S           0x00000080
1162 #define PSR_ICC         0x00f00000
1163 #define PSR_VERS        0x0f000000
1164 #define PSR_IMPL        0xf0000000
1165 #define PSR_V8PLUS      0xff000000
1166 #define PSR_XCC         0x000f0000
1167
1168 void
1169 sparc64_supply_gregset (const struct sparc_gregset *gregset,
1170                         struct regcache *regcache,
1171                         int regnum, const void *gregs)
1172 {
1173   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1174   const gdb_byte *regs = gregs;
1175   int i;
1176
1177   if (sparc32)
1178     {
1179       if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1180         {
1181           int offset = gregset->r_tstate_offset;
1182           ULONGEST tstate, psr;
1183           gdb_byte buf[4];
1184
1185           tstate = extract_unsigned_integer (regs + offset, 8);
1186           psr = ((tstate & TSTATE_CWP) | PSR_S | ((tstate & TSTATE_ICC) >> 12)
1187                  | ((tstate & TSTATE_XCC) >> 20) | PSR_V8PLUS);
1188           store_unsigned_integer (buf, 4, psr);
1189           regcache_raw_supply (regcache, SPARC32_PSR_REGNUM, buf);
1190         }
1191
1192       if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1193         regcache_raw_supply (regcache, SPARC32_PC_REGNUM,
1194                              regs + gregset->r_pc_offset + 4);
1195
1196       if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1197         regcache_raw_supply (regcache, SPARC32_NPC_REGNUM,
1198                              regs + gregset->r_npc_offset + 4);
1199
1200       if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1201         {
1202           int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1203           regcache_raw_supply (regcache, SPARC32_Y_REGNUM, regs + offset);
1204         }
1205     }
1206   else
1207     {
1208       if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1209         regcache_raw_supply (regcache, SPARC64_STATE_REGNUM,
1210                              regs + gregset->r_tstate_offset);
1211
1212       if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1213         regcache_raw_supply (regcache, SPARC64_PC_REGNUM,
1214                              regs + gregset->r_pc_offset);
1215
1216       if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1217         regcache_raw_supply (regcache, SPARC64_NPC_REGNUM,
1218                              regs + gregset->r_npc_offset);
1219
1220       if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1221         {
1222           gdb_byte buf[8];
1223
1224           memset (buf, 0, 8);
1225           memcpy (buf + 8 - gregset->r_y_size,
1226                   regs + gregset->r_y_offset, gregset->r_y_size);
1227           regcache_raw_supply (regcache, SPARC64_Y_REGNUM, buf);
1228         }
1229
1230       if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1231           && gregset->r_fprs_offset != -1)
1232         regcache_raw_supply (regcache, SPARC64_FPRS_REGNUM,
1233                              regs + gregset->r_fprs_offset);
1234     }
1235
1236   if (regnum == SPARC_G0_REGNUM || regnum == -1)
1237     regcache_raw_supply (regcache, SPARC_G0_REGNUM, NULL);
1238
1239   if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1240     {
1241       int offset = gregset->r_g1_offset;
1242
1243       if (sparc32)
1244         offset += 4;
1245
1246       for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1247         {
1248           if (regnum == i || regnum == -1)
1249             regcache_raw_supply (regcache, i, regs + offset);
1250           offset += 8;
1251         }
1252     }
1253
1254   if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1255     {
1256       /* Not all of the register set variants include Locals and
1257          Inputs.  For those that don't, we read them off the stack.  */
1258       if (gregset->r_l0_offset == -1)
1259         {
1260           ULONGEST sp;
1261
1262           regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
1263           sparc_supply_rwindow (regcache, sp, regnum);
1264         }
1265       else
1266         {
1267           int offset = gregset->r_l0_offset;
1268
1269           if (sparc32)
1270             offset += 4;
1271
1272           for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1273             {
1274               if (regnum == i || regnum == -1)
1275                 regcache_raw_supply (regcache, i, regs + offset);
1276               offset += 8;
1277             }
1278         }
1279     }
1280 }
1281
1282 void
1283 sparc64_collect_gregset (const struct sparc_gregset *gregset,
1284                          const struct regcache *regcache,
1285                          int regnum, void *gregs)
1286 {
1287   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1288   gdb_byte *regs = gregs;
1289   int i;
1290
1291   if (sparc32)
1292     {
1293       if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1294         {
1295           int offset = gregset->r_tstate_offset;
1296           ULONGEST tstate, psr;
1297           gdb_byte buf[8];
1298
1299           tstate = extract_unsigned_integer (regs + offset, 8);
1300           regcache_raw_collect (regcache, SPARC32_PSR_REGNUM, buf);
1301           psr = extract_unsigned_integer (buf, 4);
1302           tstate |= (psr & PSR_ICC) << 12;
1303           if ((psr & (PSR_VERS | PSR_IMPL)) == PSR_V8PLUS)
1304             tstate |= (psr & PSR_XCC) << 20;
1305           store_unsigned_integer (buf, 8, tstate);
1306           memcpy (regs + offset, buf, 8);
1307         }
1308
1309       if (regnum == SPARC32_PC_REGNUM || regnum == -1)
1310         regcache_raw_collect (regcache, SPARC32_PC_REGNUM,
1311                               regs + gregset->r_pc_offset + 4);
1312
1313       if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
1314         regcache_raw_collect (regcache, SPARC32_NPC_REGNUM,
1315                               regs + gregset->r_npc_offset + 4);
1316
1317       if (regnum == SPARC32_Y_REGNUM || regnum == -1)
1318         {
1319           int offset = gregset->r_y_offset + 8 - gregset->r_y_size;
1320           regcache_raw_collect (regcache, SPARC32_Y_REGNUM, regs + offset);
1321         }
1322     }
1323   else
1324     {
1325       if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
1326         regcache_raw_collect (regcache, SPARC64_STATE_REGNUM,
1327                               regs + gregset->r_tstate_offset);
1328
1329       if (regnum == SPARC64_PC_REGNUM || regnum == -1)
1330         regcache_raw_collect (regcache, SPARC64_PC_REGNUM,
1331                               regs + gregset->r_pc_offset);
1332
1333       if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
1334         regcache_raw_collect (regcache, SPARC64_NPC_REGNUM,
1335                               regs + gregset->r_npc_offset);
1336
1337       if (regnum == SPARC64_Y_REGNUM || regnum == -1)
1338         {
1339           gdb_byte buf[8];
1340
1341           regcache_raw_collect (regcache, SPARC64_Y_REGNUM, buf);
1342           memcpy (regs + gregset->r_y_offset,
1343                   buf + 8 - gregset->r_y_size, gregset->r_y_size);
1344         }
1345
1346       if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
1347           && gregset->r_fprs_offset != -1)
1348         regcache_raw_collect (regcache, SPARC64_FPRS_REGNUM,
1349                               regs + gregset->r_fprs_offset);
1350
1351     }
1352
1353   if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1354     {
1355       int offset = gregset->r_g1_offset;
1356
1357       if (sparc32)
1358         offset += 4;
1359
1360       /* %g0 is always zero.  */
1361       for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
1362         {
1363           if (regnum == i || regnum == -1)
1364             regcache_raw_collect (regcache, i, regs + offset);
1365           offset += 8;
1366         }
1367     }
1368
1369   if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1370     {
1371       /* Not all of the register set variants include Locals and
1372          Inputs.  For those that don't, we read them off the stack.  */
1373       if (gregset->r_l0_offset != -1)
1374         {
1375           int offset = gregset->r_l0_offset;
1376
1377           if (sparc32)
1378             offset += 4;
1379
1380           for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
1381             {
1382               if (regnum == i || regnum == -1)
1383                 regcache_raw_collect (regcache, i, regs + offset);
1384               offset += 8;
1385             }
1386         }
1387     }
1388 }
1389
1390 void
1391 sparc64_supply_fpregset (struct regcache *regcache,
1392                          int regnum, const void *fpregs)
1393 {
1394   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1395   const gdb_byte *regs = fpregs;
1396   int i;
1397
1398   for (i = 0; i < 32; i++)
1399     {
1400       if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1401         regcache_raw_supply (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1402     }
1403
1404   if (sparc32)
1405     {
1406       if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1407         regcache_raw_supply (regcache, SPARC32_FSR_REGNUM,
1408                              regs + (32 * 4) + (16 * 8) + 4);
1409     }
1410   else
1411     {
1412       for (i = 0; i < 16; i++)
1413         {
1414           if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1415             regcache_raw_supply (regcache, SPARC64_F32_REGNUM + i,
1416                                  regs + (32 * 4) + (i * 8));
1417         }
1418
1419       if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1420         regcache_raw_supply (regcache, SPARC64_FSR_REGNUM,
1421                              regs + (32 * 4) + (16 * 8));
1422     }
1423 }
1424
1425 void
1426 sparc64_collect_fpregset (const struct regcache *regcache,
1427                           int regnum, void *fpregs)
1428 {
1429   int sparc32 = (gdbarch_ptr_bit (get_regcache_arch (regcache)) == 32);
1430   gdb_byte *regs = fpregs;
1431   int i;
1432
1433   for (i = 0; i < 32; i++)
1434     {
1435       if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
1436         regcache_raw_collect (regcache, SPARC_F0_REGNUM + i, regs + (i * 4));
1437     }
1438
1439   if (sparc32)
1440     {
1441       if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
1442         regcache_raw_collect (regcache, SPARC32_FSR_REGNUM,
1443                               regs + (32 * 4) + (16 * 8) + 4);
1444     }
1445   else
1446     {
1447       for (i = 0; i < 16; i++)
1448         {
1449           if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
1450             regcache_raw_collect (regcache, SPARC64_F32_REGNUM + i,
1451                                   regs + (32 * 4) + (i * 8));
1452         }
1453
1454       if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
1455         regcache_raw_collect (regcache, SPARC64_FSR_REGNUM,
1456                               regs + (32 * 4) + (16 * 8));
1457     }
1458 }
1459
1460
1461 /* Provide a prototype to silence -Wmissing-prototypes.  */
1462 void _initialize_sparc64_tdep (void);
1463
1464 void
1465 _initialize_sparc64_tdep (void)
1466 {
1467   /* Initialize the UltraSPARC-specific register types.  */
1468   sparc64_init_types();
1469 }