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