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