]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/sparc64-tdep.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / sparc64-tdep.c
CommitLineData
8b39fe56
MK
1/* Target-dependent code for UltraSPARC.
2
213516ef 3 Copyright (C) 2003-2023 Free Software Foundation, Inc.
8b39fe56
MK
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
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
8b39fe56
MK
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
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8b39fe56
MK
19
20#include "defs.h"
21#include "arch-utils.h"
82ca8957 22#include "dwarf2/frame.h"
8b39fe56
MK
23#include "frame.h"
24#include "frame-base.h"
25#include "frame-unwind.h"
26#include "gdbcore.h"
27#include "gdbtypes.h"
386c036b
MK
28#include "inferior.h"
29#include "symtab.h"
30#include "objfiles.h"
8b39fe56
MK
31#include "osabi.h"
32#include "regcache.h"
3f7b46f2 33#include "target-descriptions.h"
8b39fe56
MK
34#include "target.h"
35#include "value.h"
8b39fe56 36#include "sparc64-tdep.h"
159ed7d9 37#include <forward_list>
8b39fe56 38
b021a221 39/* This file implements the SPARC 64-bit ABI as defined by the
8b39fe56
MK
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. */
8b39fe56 47\f
58afddc6
WP
48/* The M7 processor supports an Application Data Integrity (ADI) feature
49 that detects invalid data accesses. When software allocates memory and
50 enables ADI on the allocated memory, it chooses a 4-bit version number,
51 sets the version in the upper 4 bits of the 64-bit pointer to that data,
52 and stores the 4-bit version in every cacheline of the object. Hardware
53 saves the latter in spare bits in the cache and memory hierarchy. On each
54 load and store, the processor compares the upper 4 VA (virtual address) bits
55 to the cacheline's version. If there is a mismatch, the processor generates
56 a version mismatch trap which can be either precise or disrupting.
57 The trap is an error condition which the kernel delivers to the process
58 as a SIGSEGV signal.
59
60 The upper 4 bits of the VA represent a version and are not part of the
61 true address. The processor clears these bits and sign extends bit 59
62 to generate the true address.
63
64 Note that 32-bit applications cannot use ADI. */
65
66
67#include <algorithm>
68#include "cli/cli-utils.h"
69#include "gdbcmd.h"
70#include "auxv.h"
71
72#define MAX_PROC_NAME_SIZE sizeof("/proc/99999/lwp/9999/adi/lstatus")
73
74/* ELF Auxiliary vectors */
75#ifndef AT_ADI_BLKSZ
76#define AT_ADI_BLKSZ 34
77#endif
78#ifndef AT_ADI_NBITS
79#define AT_ADI_NBITS 35
80#endif
81#ifndef AT_ADI_UEONADI
82#define AT_ADI_UEONADI 36
83#endif
84
85/* ADI command list. */
86static struct cmd_list_element *sparc64adilist = NULL;
87
88/* ADI stat settings. */
8f86ae1a 89struct adi_stat_t
58afddc6
WP
90{
91 /* The ADI block size. */
92 unsigned long blksize;
93
94 /* Number of bits used for an ADI version tag which can be
654670a4
WP
95 used together with the shift value for an ADI version tag
96 to encode or extract the ADI version value in a pointer. */
58afddc6
WP
97 unsigned long nbits;
98
99 /* The maximum ADI version tag value supported. */
100 int max_version;
101
102 /* ADI version tag file. */
103 int tag_fd = 0;
104
105 /* ADI availability check has been done. */
106 bool checked_avail = false;
107
108 /* ADI is available. */
109 bool is_avail = false;
110
8f86ae1a 111};
58afddc6
WP
112
113/* Per-process ADI stat info. */
114
8f86ae1a 115struct sparc64_adi_info
58afddc6
WP
116{
117 sparc64_adi_info (pid_t pid_)
118 : pid (pid_)
119 {}
120
121 /* The process identifier. */
122 pid_t pid;
123
124 /* The ADI stat. */
125 adi_stat_t stat = {};
126
8f86ae1a 127};
58afddc6
WP
128
129static std::forward_list<sparc64_adi_info> adi_proc_list;
130
131
132/* Get ADI info for process PID, creating one if it doesn't exist. */
133
134static sparc64_adi_info *
135get_adi_info_proc (pid_t pid)
136{
137 auto found = std::find_if (adi_proc_list.begin (), adi_proc_list.end (),
dda83cd7
SM
138 [&pid] (const sparc64_adi_info &info)
139 {
140 return info.pid == pid;
141 });
58afddc6
WP
142
143 if (found == adi_proc_list.end ())
144 {
145 adi_proc_list.emplace_front (pid);
146 return &adi_proc_list.front ();
147 }
148 else
149 {
150 return &(*found);
151 }
152}
153
154static adi_stat_t
155get_adi_info (pid_t pid)
156{
157 sparc64_adi_info *proc;
158
159 proc = get_adi_info_proc (pid);
160 return proc->stat;
161}
162
163/* Is called when GDB is no longer debugging process PID. It
164 deletes data structure that keeps track of the ADI stat. */
165
166void
167sparc64_forget_process (pid_t pid)
168{
b872057a 169 fileio_error target_errno;
58afddc6
WP
170
171 for (auto pit = adi_proc_list.before_begin (),
172 it = std::next (pit);
173 it != adi_proc_list.end ();
174 )
175 {
176 if ((*it).pid == pid)
177 {
dda83cd7
SM
178 if ((*it).stat.tag_fd > 0)
179 target_fileio_close ((*it).stat.tag_fd, &target_errno);
58afddc6 180 adi_proc_list.erase_after (pit);
dda83cd7 181 break;
58afddc6
WP
182 }
183 else
184 pit = it++;
185 }
186
187}
188
58afddc6
WP
189/* Read attributes of a maps entry in /proc/[pid]/adi/maps. */
190
191static void
192read_maps_entry (const char *line,
dda83cd7 193 ULONGEST *addr, ULONGEST *endaddr)
58afddc6
WP
194{
195 const char *p = line;
196
197 *addr = strtoulst (p, &p, 16);
198 if (*p == '-')
199 p++;
200
201 *endaddr = strtoulst (p, &p, 16);
202}
203
204/* Check if ADI is available. */
205
206static bool
207adi_available (void)
208{
e99b03dc 209 pid_t pid = inferior_ptid.pid ();
58afddc6 210 sparc64_adi_info *proc = get_adi_info_proc (pid);
654670a4 211 CORE_ADDR value;
58afddc6
WP
212
213 if (proc->stat.checked_avail)
214 return proc->stat.is_avail;
215
216 proc->stat.checked_avail = true;
82d23ca8 217 if (target_auxv_search (AT_ADI_BLKSZ, &value) <= 0)
58afddc6 218 return false;
654670a4 219 proc->stat.blksize = value;
82d23ca8 220 target_auxv_search (AT_ADI_NBITS, &value);
654670a4 221 proc->stat.nbits = value;
58afddc6
WP
222 proc->stat.max_version = (1 << proc->stat.nbits) - 2;
223 proc->stat.is_avail = true;
224
225 return proc->stat.is_avail;
226}
227
228/* Normalize a versioned address - a VA with ADI bits (63-60) set. */
229
230static CORE_ADDR
231adi_normalize_address (CORE_ADDR addr)
232{
e99b03dc 233 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
58afddc6
WP
234
235 if (ast.nbits)
654670a4
WP
236 {
237 /* Clear upper bits. */
238 addr &= ((uint64_t) -1) >> ast.nbits;
239
240 /* Sign extend. */
241 CORE_ADDR signbit = (uint64_t) 1 << (64 - ast.nbits - 1);
242 return (addr ^ signbit) - signbit;
243 }
58afddc6
WP
244 return addr;
245}
246
247/* Align a normalized address - a VA with bit 59 sign extended into
248 ADI bits. */
249
250static CORE_ADDR
251adi_align_address (CORE_ADDR naddr)
252{
e99b03dc 253 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
58afddc6
WP
254
255 return (naddr - (naddr % ast.blksize)) / ast.blksize;
256}
257
258/* Convert a byte count to count at a ratio of 1:adi_blksz. */
259
260static int
261adi_convert_byte_count (CORE_ADDR naddr, int nbytes, CORE_ADDR locl)
262{
e99b03dc 263 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
58afddc6
WP
264
265 return ((naddr + nbytes + ast.blksize - 1) / ast.blksize) - locl;
266}
267
268/* The /proc/[pid]/adi/tags file, which allows gdb to get/set ADI
269 version in a target process, maps linearly to the address space
270 of the target process at a ratio of 1:adi_blksz.
271
272 A read (or write) at offset K in the file returns (or modifies)
273 the ADI version tag stored in the cacheline containing address
274 K * adi_blksz, encoded as 1 version tag per byte. The allowed
275 version tag values are between 0 and adi_stat.max_version. */
276
277static int
278adi_tag_fd (void)
279{
e99b03dc 280 pid_t pid = inferior_ptid.pid ();
58afddc6
WP
281 sparc64_adi_info *proc = get_adi_info_proc (pid);
282
283 if (proc->stat.tag_fd != 0)
284 return proc->stat.tag_fd;
285
286 char cl_name[MAX_PROC_NAME_SIZE];
39b06c20 287 snprintf (cl_name, sizeof(cl_name), "/proc/%ld/adi/tags", (long) pid);
b872057a 288 fileio_error target_errno;
58afddc6 289 proc->stat.tag_fd = target_fileio_open (NULL, cl_name, O_RDWR|O_EXCL,
dda83cd7 290 false, 0, &target_errno);
58afddc6
WP
291 return proc->stat.tag_fd;
292}
293
294/* Check if an address set is ADI enabled, using /proc/[pid]/adi/maps
295 which was exported by the kernel and contains the currently ADI
296 mapped memory regions and their access permissions. */
297
298static bool
299adi_is_addr_mapped (CORE_ADDR vaddr, size_t cnt)
300{
301 char filename[MAX_PROC_NAME_SIZE];
302 size_t i = 0;
303
e99b03dc 304 pid_t pid = inferior_ptid.pid ();
39b06c20 305 snprintf (filename, sizeof filename, "/proc/%ld/adi/maps", (long) pid);
87028b87
TT
306 gdb::unique_xmalloc_ptr<char> data
307 = target_fileio_read_stralloc (NULL, filename);
58afddc6
WP
308 if (data)
309 {
58afddc6 310 adi_stat_t adi_stat = get_adi_info (pid);
ca3a04f6
CB
311 char *saveptr;
312 for (char *line = strtok_r (data.get (), "\n", &saveptr);
313 line;
314 line = strtok_r (NULL, "\n", &saveptr))
dda83cd7
SM
315 {
316 ULONGEST addr, endaddr;
58afddc6 317
dda83cd7 318 read_maps_entry (line, &addr, &endaddr);
58afddc6 319
dda83cd7
SM
320 while (((vaddr + i) * adi_stat.blksize) >= addr
321 && ((vaddr + i) * adi_stat.blksize) < endaddr)
322 {
323 if (++i == cnt)
87028b87 324 return true;
dda83cd7
SM
325 }
326 }
58afddc6 327 }
492325c4
SM
328 else
329 warning (_("unable to open /proc file '%s'"), filename);
58afddc6
WP
330
331 return false;
332}
333
334/* Read ADI version tag value for memory locations starting at "VADDR"
335 for "SIZE" number of bytes. */
336
337static int
7f6743fd 338adi_read_versions (CORE_ADDR vaddr, size_t size, gdb_byte *tags)
58afddc6
WP
339{
340 int fd = adi_tag_fd ();
341 if (fd == -1)
342 return -1;
343
344 if (!adi_is_addr_mapped (vaddr, size))
345 {
e99b03dc 346 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
654670a4 347 error(_("Address at %s is not in ADI maps"),
dda83cd7 348 paddress (target_gdbarch (), vaddr * ast.blksize));
58afddc6
WP
349 }
350
b872057a 351 fileio_error target_errno;
58afddc6
WP
352 return target_fileio_pread (fd, tags, size, vaddr, &target_errno);
353}
354
355/* Write ADI version tag for memory locations starting at "VADDR" for
356 "SIZE" number of bytes to "TAGS". */
357
358static int
359adi_write_versions (CORE_ADDR vaddr, size_t size, unsigned char *tags)
360{
361 int fd = adi_tag_fd ();
362 if (fd == -1)
363 return -1;
364
365 if (!adi_is_addr_mapped (vaddr, size))
366 {
e99b03dc 367 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
654670a4 368 error(_("Address at %s is not in ADI maps"),
dda83cd7 369 paddress (target_gdbarch (), vaddr * ast.blksize));
58afddc6
WP
370 }
371
b872057a 372 fileio_error target_errno;
58afddc6
WP
373 return target_fileio_pwrite (fd, tags, size, vaddr, &target_errno);
374}
375
376/* Print ADI version tag value in "TAGS" for memory locations starting
377 at "VADDR" with number of "CNT". */
378
379static void
7f6743fd 380adi_print_versions (CORE_ADDR vaddr, size_t cnt, gdb_byte *tags)
58afddc6
WP
381{
382 int v_idx = 0;
383 const int maxelts = 8; /* # of elements per line */
384
e99b03dc 385 adi_stat_t adi_stat = get_adi_info (inferior_ptid.pid ());
58afddc6
WP
386
387 while (cnt > 0)
388 {
389 QUIT;
6cb06a8c
TT
390 gdb_printf ("%s:\t",
391 paddress (target_gdbarch (), vaddr * adi_stat.blksize));
58afddc6 392 for (int i = maxelts; i > 0 && cnt > 0; i--, cnt--)
dda83cd7
SM
393 {
394 if (tags[v_idx] == 0xff) /* no version tag */
6cb06a8c 395 gdb_printf ("-");
dda83cd7 396 else
6cb06a8c 397 gdb_printf ("%1X", tags[v_idx]);
58afddc6 398 if (cnt > 1)
6cb06a8c 399 gdb_printf (" ");
dda83cd7
SM
400 ++v_idx;
401 }
6cb06a8c 402 gdb_printf ("\n");
58afddc6
WP
403 vaddr += maxelts;
404 }
405}
406
407static void
408do_examine (CORE_ADDR start, int bcnt)
409{
410 CORE_ADDR vaddr = adi_normalize_address (start);
58afddc6
WP
411
412 CORE_ADDR vstart = adi_align_address (vaddr);
413 int cnt = adi_convert_byte_count (vaddr, bcnt, vstart);
7f6743fd
TT
414 gdb::def_vector<gdb_byte> buf (cnt);
415 int read_cnt = adi_read_versions (vstart, cnt, buf.data ());
58afddc6
WP
416 if (read_cnt == -1)
417 error (_("No ADI information"));
418 else if (read_cnt < cnt)
654670a4 419 error(_("No ADI information at %s"), paddress (target_gdbarch (), vaddr));
58afddc6 420
7f6743fd 421 adi_print_versions (vstart, cnt, buf.data ());
58afddc6
WP
422}
423
424static void
425do_assign (CORE_ADDR start, size_t bcnt, int version)
426{
427 CORE_ADDR vaddr = adi_normalize_address (start);
428
429 CORE_ADDR vstart = adi_align_address (vaddr);
430 int cnt = adi_convert_byte_count (vaddr, bcnt, vstart);
431 std::vector<unsigned char> buf (cnt, version);
432 int set_cnt = adi_write_versions (vstart, cnt, buf.data ());
433
434 if (set_cnt == -1)
435 error (_("No ADI information"));
436 else if (set_cnt < cnt)
654670a4 437 error(_("No ADI information at %s"), paddress (target_gdbarch (), vaddr));
58afddc6
WP
438
439}
440
441/* ADI examine version tag command.
442
443 Command syntax:
444
65e65158 445 adi (examine|x)[/COUNT] [ADDR] */
58afddc6
WP
446
447static void
5fed81ff 448adi_examine_command (const char *args, int from_tty)
58afddc6
WP
449{
450 /* make sure program is active and adi is available */
55f6301a 451 if (!target_has_execution ())
58afddc6
WP
452 error (_("ADI command requires a live process/thread"));
453
454 if (!adi_available ())
455 error (_("No ADI information"));
456
58afddc6 457 int cnt = 1;
5fed81ff 458 const char *p = args;
58afddc6
WP
459 if (p && *p == '/')
460 {
461 p++;
462 cnt = get_number (&p);
463 }
464
465 CORE_ADDR next_address = 0;
466 if (p != 0 && *p != 0)
467 next_address = parse_and_eval_address (p);
468 if (!cnt || !next_address)
65e65158 469 error (_("Usage: adi examine|x[/COUNT] [ADDR]"));
58afddc6
WP
470
471 do_examine (next_address, cnt);
472}
473
474/* ADI assign version tag command.
475
476 Command syntax:
477
65e65158 478 adi (assign|a)[/COUNT] ADDR = VERSION */
58afddc6
WP
479
480static void
5fed81ff 481adi_assign_command (const char *args, int from_tty)
58afddc6 482{
65e65158
TT
483 static const char *adi_usage
484 = N_("Usage: adi assign|a[/COUNT] ADDR = VERSION");
485
58afddc6 486 /* make sure program is active and adi is available */
55f6301a 487 if (!target_has_execution ())
58afddc6
WP
488 error (_("ADI command requires a live process/thread"));
489
490 if (!adi_available ())
491 error (_("No ADI information"));
492
5fed81ff 493 const char *exp = args;
58afddc6 494 if (exp == 0)
65e65158 495 error_no_arg (_(adi_usage));
58afddc6
WP
496
497 char *q = (char *) strchr (exp, '=');
498 if (q)
499 *q++ = 0;
500 else
65e65158 501 error ("%s", _(adi_usage));
58afddc6
WP
502
503 size_t cnt = 1;
5fed81ff 504 const char *p = args;
58afddc6
WP
505 if (exp && *exp == '/')
506 {
507 p = exp + 1;
508 cnt = get_number (&p);
509 }
510
511 CORE_ADDR next_address = 0;
512 if (p != 0 && *p != 0)
513 next_address = parse_and_eval_address (p);
514 else
65e65158 515 error ("%s", _(adi_usage));
58afddc6
WP
516
517 int version = 0;
518 if (q != NULL) /* parse version tag */
519 {
e99b03dc 520 adi_stat_t ast = get_adi_info (inferior_ptid.pid ());
58afddc6
WP
521 version = parse_and_eval_long (q);
522 if (version < 0 || version > ast.max_version)
dda83cd7 523 error (_("Invalid ADI version tag %d"), version);
58afddc6
WP
524 }
525
526 do_assign (next_address, cnt, version);
527}
528
6c265988 529void _initialize_sparc64_adi_tdep ();
58afddc6 530void
6c265988 531_initialize_sparc64_adi_tdep ()
58afddc6 532{
0743fc83
TT
533 add_basic_prefix_cmd ("adi", class_support,
534 _("ADI version related commands."),
2f822da5 535 &sparc64adilist, 0, &cmdlist);
5e84b7ee
SM
536 cmd_list_element *adi_examine_cmd
537 = add_cmd ("examine", class_support, adi_examine_command,
538 _("Examine ADI versions."), &sparc64adilist);
539 add_alias_cmd ("x", adi_examine_cmd, no_class, 1, &sparc64adilist);
58afddc6 540 add_cmd ("assign", class_support, adi_assign_command,
dda83cd7 541 _("Assign ADI versions."), &sparc64adilist);
58afddc6
WP
542
543}
544\f
545
8b39fe56
MK
546/* The functions on this page are intended to be used to classify
547 function arguments. */
548
8b39fe56
MK
549/* Check whether TYPE is "Integral or Pointer". */
550
551static int
552sparc64_integral_or_pointer_p (const struct type *type)
553{
78134374 554 switch (type->code ())
8b39fe56
MK
555 {
556 case TYPE_CODE_INT:
557 case TYPE_CODE_BOOL:
558 case TYPE_CODE_CHAR:
559 case TYPE_CODE_ENUM:
560 case TYPE_CODE_RANGE:
561 {
df86565b 562 int len = type->length ();
8b39fe56
MK
563 gdb_assert (len == 1 || len == 2 || len == 4 || len == 8);
564 }
565 return 1;
566 case TYPE_CODE_PTR:
567 case TYPE_CODE_REF:
aa006118 568 case TYPE_CODE_RVALUE_REF:
8b39fe56 569 {
df86565b 570 int len = type->length ();
8b39fe56
MK
571 gdb_assert (len == 8);
572 }
573 return 1;
574 default:
575 break;
576 }
577
578 return 0;
579}
580
581/* Check whether TYPE is "Floating". */
582
583static int
584sparc64_floating_p (const struct type *type)
585{
78134374 586 switch (type->code ())
8b39fe56
MK
587 {
588 case TYPE_CODE_FLT:
589 {
df86565b 590 int len = type->length ();
8b39fe56
MK
591 gdb_assert (len == 4 || len == 8 || len == 16);
592 }
593 return 1;
594 default:
595 break;
596 }
597
598 return 0;
599}
600
fe10a582
DM
601/* Check whether TYPE is "Complex Floating". */
602
603static int
604sparc64_complex_floating_p (const struct type *type)
605{
78134374 606 switch (type->code ())
fe10a582
DM
607 {
608 case TYPE_CODE_COMPLEX:
609 {
df86565b 610 int len = type->length ();
fe10a582
DM
611 gdb_assert (len == 8 || len == 16 || len == 32);
612 }
613 return 1;
614 default:
615 break;
616 }
617
618 return 0;
619}
620
0497f5b0
JB
621/* Check whether TYPE is "Structure or Union".
622
623 In terms of Ada subprogram calls, arrays are treated the same as
624 struct and union types. So this function also returns non-zero
625 for array types. */
8b39fe56
MK
626
627static int
628sparc64_structure_or_union_p (const struct type *type)
629{
78134374 630 switch (type->code ())
8b39fe56
MK
631 {
632 case TYPE_CODE_STRUCT:
633 case TYPE_CODE_UNION:
0497f5b0 634 case TYPE_CODE_ARRAY:
8b39fe56
MK
635 return 1;
636 default:
637 break;
638 }
639
640 return 0;
641}
fd936806
MK
642\f
643
209bd28e 644/* Construct types for ISA-specific registers. */
fd936806 645
209bd28e
UW
646static struct type *
647sparc64_pstate_type (struct gdbarch *gdbarch)
648{
08106042 649 sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
fd936806 650
209bd28e
UW
651 if (!tdep->sparc64_pstate_type)
652 {
653 struct type *type;
654
77b7c781 655 type = arch_flags_type (gdbarch, "builtin_type_sparc64_pstate", 64);
209bd28e
UW
656 append_flags_type_flag (type, 0, "AG");
657 append_flags_type_flag (type, 1, "IE");
658 append_flags_type_flag (type, 2, "PRIV");
659 append_flags_type_flag (type, 3, "AM");
660 append_flags_type_flag (type, 4, "PEF");
661 append_flags_type_flag (type, 5, "RED");
662 append_flags_type_flag (type, 8, "TLE");
663 append_flags_type_flag (type, 9, "CLE");
664 append_flags_type_flag (type, 10, "PID0");
665 append_flags_type_flag (type, 11, "PID1");
666
667 tdep->sparc64_pstate_type = type;
668 }
fd936806 669
209bd28e
UW
670 return tdep->sparc64_pstate_type;
671}
fd936806 672
5badf10a
IR
673static struct type *
674sparc64_ccr_type (struct gdbarch *gdbarch)
675{
08106042 676 sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
5badf10a
IR
677
678 if (tdep->sparc64_ccr_type == NULL)
679 {
680 struct type *type;
681
77b7c781 682 type = arch_flags_type (gdbarch, "builtin_type_sparc64_ccr", 64);
5badf10a
IR
683 append_flags_type_flag (type, 0, "icc.c");
684 append_flags_type_flag (type, 1, "icc.v");
685 append_flags_type_flag (type, 2, "icc.z");
686 append_flags_type_flag (type, 3, "icc.n");
687 append_flags_type_flag (type, 4, "xcc.c");
688 append_flags_type_flag (type, 5, "xcc.v");
689 append_flags_type_flag (type, 6, "xcc.z");
690 append_flags_type_flag (type, 7, "xcc.n");
691
692 tdep->sparc64_ccr_type = type;
693 }
694
695 return tdep->sparc64_ccr_type;
696}
697
209bd28e
UW
698static struct type *
699sparc64_fsr_type (struct gdbarch *gdbarch)
700{
08106042 701 sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
209bd28e
UW
702
703 if (!tdep->sparc64_fsr_type)
704 {
705 struct type *type;
706
77b7c781 707 type = arch_flags_type (gdbarch, "builtin_type_sparc64_fsr", 64);
5badf10a
IR
708 append_flags_type_flag (type, 0, "NXC");
709 append_flags_type_flag (type, 1, "DZC");
710 append_flags_type_flag (type, 2, "UFC");
711 append_flags_type_flag (type, 3, "OFC");
712 append_flags_type_flag (type, 4, "NVC");
713 append_flags_type_flag (type, 5, "NXA");
714 append_flags_type_flag (type, 6, "DZA");
715 append_flags_type_flag (type, 7, "UFA");
716 append_flags_type_flag (type, 8, "OFA");
717 append_flags_type_flag (type, 9, "NVA");
209bd28e
UW
718 append_flags_type_flag (type, 22, "NS");
719 append_flags_type_flag (type, 23, "NXM");
720 append_flags_type_flag (type, 24, "DZM");
721 append_flags_type_flag (type, 25, "UFM");
722 append_flags_type_flag (type, 26, "OFM");
723 append_flags_type_flag (type, 27, "NVM");
724
725 tdep->sparc64_fsr_type = type;
726 }
727
728 return tdep->sparc64_fsr_type;
729}
730
731static struct type *
732sparc64_fprs_type (struct gdbarch *gdbarch)
fd936806 733{
08106042 734 sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
209bd28e
UW
735
736 if (!tdep->sparc64_fprs_type)
737 {
738 struct type *type;
739
77b7c781 740 type = arch_flags_type (gdbarch, "builtin_type_sparc64_fprs", 64);
209bd28e
UW
741 append_flags_type_flag (type, 0, "DL");
742 append_flags_type_flag (type, 1, "DU");
743 append_flags_type_flag (type, 2, "FEF");
744
745 tdep->sparc64_fprs_type = type;
746 }
747
748 return tdep->sparc64_fprs_type;
fd936806 749}
8b39fe56 750
209bd28e 751
8b39fe56 752/* Register information. */
7a36499a
IR
753#define SPARC64_FPU_REGISTERS \
754 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
755 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \
756 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \
757 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \
758 "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46", \
759 "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62"
760#define SPARC64_CP0_REGISTERS \
761 "pc", "npc", \
762 /* FIXME: Give "state" a name until we start using register groups. */ \
763 "state", \
764 "fsr", \
765 "fprs", \
766 "y"
8b39fe56 767
27087b7f
TT
768static const char * const sparc64_fpu_register_names[] = {
769 SPARC64_FPU_REGISTERS
770};
771static const char * const sparc64_cp0_register_names[] = {
772 SPARC64_CP0_REGISTERS
773};
3f7b46f2 774
27087b7f 775static const char * const sparc64_register_names[] =
8b39fe56 776{
7a36499a
IR
777 SPARC_CORE_REGISTERS,
778 SPARC64_FPU_REGISTERS,
779 SPARC64_CP0_REGISTERS
8b39fe56
MK
780};
781
782/* Total number of registers. */
6707b003 783#define SPARC64_NUM_REGS ARRAY_SIZE (sparc64_register_names)
8b39fe56
MK
784
785/* We provide the aliases %d0..%d62 and %q0..%q60 for the floating
786 registers as "psuedo" registers. */
787
27087b7f 788static const char * const sparc64_pseudo_register_names[] =
8b39fe56 789{
6707b003
UW
790 "cwp", "pstate", "asi", "ccr",
791
792 "d0", "d2", "d4", "d6", "d8", "d10", "d12", "d14",
793 "d16", "d18", "d20", "d22", "d24", "d26", "d28", "d30",
794 "d32", "d34", "d36", "d38", "d40", "d42", "d44", "d46",
795 "d48", "d50", "d52", "d54", "d56", "d58", "d60", "d62",
796
797 "q0", "q4", "q8", "q12", "q16", "q20", "q24", "q28",
798 "q32", "q36", "q40", "q44", "q48", "q52", "q56", "q60",
8b39fe56
MK
799};
800
801/* Total number of pseudo registers. */
6707b003 802#define SPARC64_NUM_PSEUDO_REGS ARRAY_SIZE (sparc64_pseudo_register_names)
8b39fe56 803
7a36499a
IR
804/* Return the name of pseudo register REGNUM. */
805
806static const char *
807sparc64_pseudo_register_name (struct gdbarch *gdbarch, int regnum)
808{
809 regnum -= gdbarch_num_regs (gdbarch);
810
9b9e61c7
AB
811 gdb_assert (regnum < SPARC64_NUM_PSEUDO_REGS);
812 return sparc64_pseudo_register_names[regnum];
7a36499a
IR
813}
814
8b39fe56
MK
815/* Return the name of register REGNUM. */
816
817static const char *
d93859e2 818sparc64_register_name (struct gdbarch *gdbarch, int regnum)
8b39fe56 819{
3f7b46f2
IR
820 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
821 return tdesc_register_name (gdbarch, regnum);
822
7a36499a 823 if (regnum >= 0 && regnum < gdbarch_num_regs (gdbarch))
6707b003 824 return sparc64_register_names[regnum];
8b39fe56 825
7a36499a
IR
826 return sparc64_pseudo_register_name (gdbarch, regnum);
827}
828
829/* Return the GDB type object for the "standard" data type of data in
830 pseudo register REGNUM. */
831
832static struct type *
833sparc64_pseudo_register_type (struct gdbarch *gdbarch, int regnum)
834{
835 regnum -= gdbarch_num_regs (gdbarch);
836
837 if (regnum == SPARC64_CWP_REGNUM)
838 return builtin_type (gdbarch)->builtin_int64;
839 if (regnum == SPARC64_PSTATE_REGNUM)
840 return sparc64_pstate_type (gdbarch);
841 if (regnum == SPARC64_ASI_REGNUM)
842 return builtin_type (gdbarch)->builtin_int64;
843 if (regnum == SPARC64_CCR_REGNUM)
5badf10a 844 return sparc64_ccr_type (gdbarch);
7a36499a
IR
845 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D62_REGNUM)
846 return builtin_type (gdbarch)->builtin_double;
847 if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q60_REGNUM)
848 return builtin_type (gdbarch)->builtin_long_double;
8b39fe56 849
f34652de 850 internal_error (_("sparc64_pseudo_register_type: bad register number %d"),
dda83cd7 851 regnum);
8b39fe56
MK
852}
853
854/* Return the GDB type object for the "standard" data type of data in
c378eb4e 855 register REGNUM. */
8b39fe56
MK
856
857static struct type *
858sparc64_register_type (struct gdbarch *gdbarch, int regnum)
859{
3f7b46f2
IR
860 if (tdesc_has_registers (gdbarch_target_desc (gdbarch)))
861 return tdesc_register_type (gdbarch, regnum);
862
6707b003 863 /* Raw registers. */
6707b003 864 if (regnum == SPARC_SP_REGNUM || regnum == SPARC_FP_REGNUM)
0dfff4cb 865 return builtin_type (gdbarch)->builtin_data_ptr;
6707b003 866 if (regnum >= SPARC_G0_REGNUM && regnum <= SPARC_I7_REGNUM)
df4df182 867 return builtin_type (gdbarch)->builtin_int64;
6707b003 868 if (regnum >= SPARC_F0_REGNUM && regnum <= SPARC_F31_REGNUM)
0dfff4cb 869 return builtin_type (gdbarch)->builtin_float;
6707b003 870 if (regnum >= SPARC64_F32_REGNUM && regnum <= SPARC64_F62_REGNUM)
0dfff4cb 871 return builtin_type (gdbarch)->builtin_double;
6707b003 872 if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
0dfff4cb 873 return builtin_type (gdbarch)->builtin_func_ptr;
6707b003
UW
874 /* This raw register contains the contents of %cwp, %pstate, %asi
875 and %ccr as laid out in a %tstate register. */
876 if (regnum == SPARC64_STATE_REGNUM)
df4df182 877 return builtin_type (gdbarch)->builtin_int64;
6707b003 878 if (regnum == SPARC64_FSR_REGNUM)
209bd28e 879 return sparc64_fsr_type (gdbarch);
6707b003 880 if (regnum == SPARC64_FPRS_REGNUM)
209bd28e 881 return sparc64_fprs_type (gdbarch);
6707b003
UW
882 /* "Although Y is a 64-bit register, its high-order 32 bits are
883 reserved and always read as 0." */
884 if (regnum == SPARC64_Y_REGNUM)
df4df182 885 return builtin_type (gdbarch)->builtin_int64;
6707b003
UW
886
887 /* Pseudo registers. */
7a36499a
IR
888 if (regnum >= gdbarch_num_regs (gdbarch))
889 return sparc64_pseudo_register_type (gdbarch, regnum);
6707b003 890
f34652de 891 internal_error (_("invalid regnum"));
8b39fe56
MK
892}
893
05d1431c 894static enum register_status
8b39fe56 895sparc64_pseudo_register_read (struct gdbarch *gdbarch,
849d0ba8 896 readable_regcache *regcache,
e1613aba 897 int regnum, gdb_byte *buf)
8b39fe56 898{
e17a4113 899 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
05d1431c
PA
900 enum register_status status;
901
7a36499a 902 regnum -= gdbarch_num_regs (gdbarch);
8b39fe56
MK
903
904 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
905 {
906 regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
03f50fc8 907 status = regcache->raw_read (regnum, buf);
05d1431c 908 if (status == REG_VALID)
03f50fc8 909 status = regcache->raw_read (regnum + 1, buf + 4);
05d1431c 910 return status;
8b39fe56
MK
911 }
912 else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
913 {
914 regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
03f50fc8 915 return regcache->raw_read (regnum, buf);
8b39fe56
MK
916 }
917 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
918 {
919 regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
05d1431c 920
03f50fc8 921 status = regcache->raw_read (regnum, buf);
05d1431c 922 if (status == REG_VALID)
03f50fc8 923 status = regcache->raw_read (regnum + 1, buf + 4);
05d1431c 924 if (status == REG_VALID)
03f50fc8 925 status = regcache->raw_read (regnum + 2, buf + 8);
05d1431c 926 if (status == REG_VALID)
03f50fc8 927 status = regcache->raw_read (regnum + 3, buf + 12);
05d1431c
PA
928
929 return status;
8b39fe56
MK
930 }
931 else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
932 {
933 regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
05d1431c 934
03f50fc8 935 status = regcache->raw_read (regnum, buf);
05d1431c 936 if (status == REG_VALID)
03f50fc8 937 status = regcache->raw_read (regnum + 1, buf + 8);
05d1431c
PA
938
939 return status;
8b39fe56
MK
940 }
941 else if (regnum == SPARC64_CWP_REGNUM
942 || regnum == SPARC64_PSTATE_REGNUM
943 || regnum == SPARC64_ASI_REGNUM
944 || regnum == SPARC64_CCR_REGNUM)
945 {
946 ULONGEST state;
947
03f50fc8 948 status = regcache->raw_read (SPARC64_STATE_REGNUM, &state);
05d1431c
PA
949 if (status != REG_VALID)
950 return status;
951
8b39fe56
MK
952 switch (regnum)
953 {
3567a8ea 954 case SPARC64_CWP_REGNUM:
8b39fe56
MK
955 state = (state >> 0) & ((1 << 5) - 1);
956 break;
3567a8ea 957 case SPARC64_PSTATE_REGNUM:
8b39fe56
MK
958 state = (state >> 8) & ((1 << 12) - 1);
959 break;
3567a8ea 960 case SPARC64_ASI_REGNUM:
8b39fe56
MK
961 state = (state >> 24) & ((1 << 8) - 1);
962 break;
3567a8ea 963 case SPARC64_CCR_REGNUM:
8b39fe56
MK
964 state = (state >> 32) & ((1 << 8) - 1);
965 break;
966 }
e17a4113 967 store_unsigned_integer (buf, 8, byte_order, state);
8b39fe56 968 }
05d1431c
PA
969
970 return REG_VALID;
8b39fe56
MK
971}
972
973static void
974sparc64_pseudo_register_write (struct gdbarch *gdbarch,
975 struct regcache *regcache,
e1613aba 976 int regnum, const gdb_byte *buf)
8b39fe56 977{
e17a4113 978 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
7a36499a
IR
979
980 regnum -= gdbarch_num_regs (gdbarch);
8b39fe56
MK
981
982 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D30_REGNUM)
983 {
984 regnum = SPARC_F0_REGNUM + 2 * (regnum - SPARC64_D0_REGNUM);
10eaee5f
SM
985 regcache->raw_write (regnum, buf);
986 regcache->raw_write (regnum + 1, buf + 4);
8b39fe56
MK
987 }
988 else if (regnum >= SPARC64_D32_REGNUM && regnum <= SPARC64_D62_REGNUM)
989 {
990 regnum = SPARC64_F32_REGNUM + (regnum - SPARC64_D32_REGNUM);
10eaee5f 991 regcache->raw_write (regnum, buf);
8b39fe56
MK
992 }
993 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q28_REGNUM)
994 {
995 regnum = SPARC_F0_REGNUM + 4 * (regnum - SPARC64_Q0_REGNUM);
10eaee5f
SM
996 regcache->raw_write (regnum, buf);
997 regcache->raw_write (regnum + 1, buf + 4);
998 regcache->raw_write (regnum + 2, buf + 8);
999 regcache->raw_write (regnum + 3, buf + 12);
8b39fe56
MK
1000 }
1001 else if (regnum >= SPARC64_Q32_REGNUM && regnum <= SPARC64_Q60_REGNUM)
1002 {
1003 regnum = SPARC64_F32_REGNUM + 2 * (regnum - SPARC64_Q32_REGNUM);
10eaee5f
SM
1004 regcache->raw_write (regnum, buf);
1005 regcache->raw_write (regnum + 1, buf + 8);
8b39fe56 1006 }
3567a8ea
MK
1007 else if (regnum == SPARC64_CWP_REGNUM
1008 || regnum == SPARC64_PSTATE_REGNUM
1009 || regnum == SPARC64_ASI_REGNUM
1010 || regnum == SPARC64_CCR_REGNUM)
1011 {
1012 ULONGEST state, bits;
1013
1014 regcache_raw_read_unsigned (regcache, SPARC64_STATE_REGNUM, &state);
e17a4113 1015 bits = extract_unsigned_integer (buf, 8, byte_order);
3567a8ea
MK
1016 switch (regnum)
1017 {
1018 case SPARC64_CWP_REGNUM:
1019 state |= ((bits & ((1 << 5) - 1)) << 0);
1020 break;
1021 case SPARC64_PSTATE_REGNUM:
1022 state |= ((bits & ((1 << 12) - 1)) << 8);
1023 break;
1024 case SPARC64_ASI_REGNUM:
1025 state |= ((bits & ((1 << 8) - 1)) << 24);
1026 break;
1027 case SPARC64_CCR_REGNUM:
1028 state |= ((bits & ((1 << 8) - 1)) << 32);
1029 break;
1030 }
1031 regcache_raw_write_unsigned (regcache, SPARC64_STATE_REGNUM, state);
1032 }
8b39fe56 1033}
8b39fe56
MK
1034\f
1035
8b39fe56
MK
1036/* Return PC of first real instruction of the function starting at
1037 START_PC. */
1038
1039static CORE_ADDR
6093d2eb 1040sparc64_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR start_pc)
8b39fe56
MK
1041{
1042 struct symtab_and_line sal;
1043 CORE_ADDR func_start, func_end;
386c036b 1044 struct sparc_frame_cache cache;
8b39fe56
MK
1045
1046 /* This is the preferred method, find the end of the prologue by
1047 using the debugging information. */
1048 if (find_pc_partial_function (start_pc, NULL, &func_start, &func_end))
1049 {
1050 sal = find_pc_line (func_start, 0);
1051
1052 if (sal.end < func_end
1053 && start_pc <= sal.end)
1054 return sal.end;
1055 }
1056
be8626e0
MD
1057 return sparc_analyze_prologue (gdbarch, start_pc, 0xffffffffffffffffULL,
1058 &cache);
8b39fe56
MK
1059}
1060
1061/* Normal frames. */
1062
386c036b 1063static struct sparc_frame_cache *
bd2b40ac 1064sparc64_frame_cache (frame_info_ptr this_frame, void **this_cache)
8b39fe56 1065{
236369e7 1066 return sparc_frame_cache (this_frame, this_cache);
8b39fe56
MK
1067}
1068
1069static void
bd2b40ac 1070sparc64_frame_this_id (frame_info_ptr this_frame, void **this_cache,
8b39fe56
MK
1071 struct frame_id *this_id)
1072{
386c036b 1073 struct sparc_frame_cache *cache =
236369e7 1074 sparc64_frame_cache (this_frame, this_cache);
8b39fe56
MK
1075
1076 /* This marks the outermost frame. */
1077 if (cache->base == 0)
1078 return;
1079
1080 (*this_id) = frame_id_build (cache->base, cache->pc);
1081}
1082
236369e7 1083static struct value *
bd2b40ac 1084sparc64_frame_prev_register (frame_info_ptr this_frame, void **this_cache,
236369e7 1085 int regnum)
8b39fe56 1086{
e17a4113 1087 struct gdbarch *gdbarch = get_frame_arch (this_frame);
386c036b 1088 struct sparc_frame_cache *cache =
236369e7 1089 sparc64_frame_cache (this_frame, this_cache);
8b39fe56
MK
1090
1091 if (regnum == SPARC64_PC_REGNUM || regnum == SPARC64_NPC_REGNUM)
1092 {
236369e7 1093 CORE_ADDR pc = (regnum == SPARC64_NPC_REGNUM) ? 4 : 0;
8b39fe56 1094
369c397b
JB
1095 regnum =
1096 (cache->copied_regs_mask & 0x80) ? SPARC_I7_REGNUM : SPARC_O7_REGNUM;
236369e7
JB
1097 pc += get_frame_register_unsigned (this_frame, regnum) + 8;
1098 return frame_unwind_got_constant (this_frame, regnum, pc);
8b39fe56
MK
1099 }
1100
f700a364
MK
1101 /* Handle StackGhost. */
1102 {
e17a4113 1103 ULONGEST wcookie = sparc_fetch_wcookie (gdbarch);
f700a364
MK
1104
1105 if (wcookie != 0 && !cache->frameless_p && regnum == SPARC_I7_REGNUM)
1106 {
dda83cd7
SM
1107 CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
1108 ULONGEST i7;
236369e7 1109
dda83cd7
SM
1110 /* Read the value in from memory. */
1111 i7 = get_frame_memory_unsigned (this_frame, addr, 8);
1112 return frame_unwind_got_constant (this_frame, regnum, i7 ^ wcookie);
f700a364
MK
1113 }
1114 }
1115
369c397b 1116 /* The previous frame's `local' and `in' registers may have been saved
8b39fe56 1117 in the register save area. */
369c397b
JB
1118 if (regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM
1119 && (cache->saved_regs_mask & (1 << (regnum - SPARC_L0_REGNUM))))
8b39fe56 1120 {
236369e7 1121 CORE_ADDR addr = cache->base + (regnum - SPARC_L0_REGNUM) * 8;
8b39fe56 1122
236369e7 1123 return frame_unwind_got_memory (this_frame, regnum, addr);
8b39fe56
MK
1124 }
1125
369c397b
JB
1126 /* The previous frame's `out' registers may be accessible as the current
1127 frame's `in' registers. */
1128 if (regnum >= SPARC_O0_REGNUM && regnum <= SPARC_O7_REGNUM
1129 && (cache->copied_regs_mask & (1 << (regnum - SPARC_O0_REGNUM))))
8b39fe56
MK
1130 regnum += (SPARC_I0_REGNUM - SPARC_O0_REGNUM);
1131
236369e7 1132 return frame_unwind_got_register (this_frame, regnum, regnum);
8b39fe56
MK
1133}
1134
1135static const struct frame_unwind sparc64_frame_unwind =
1136{
a154d838 1137 "sparc64 prologue",
8b39fe56 1138 NORMAL_FRAME,
8fbca658 1139 default_frame_unwind_stop_reason,
8b39fe56 1140 sparc64_frame_this_id,
236369e7
JB
1141 sparc64_frame_prev_register,
1142 NULL,
1143 default_frame_sniffer
8b39fe56 1144};
8b39fe56
MK
1145\f
1146
1147static CORE_ADDR
bd2b40ac 1148sparc64_frame_base_address (frame_info_ptr this_frame, void **this_cache)
8b39fe56 1149{
386c036b 1150 struct sparc_frame_cache *cache =
236369e7 1151 sparc64_frame_cache (this_frame, this_cache);
8b39fe56 1152
5b2d44a0 1153 return cache->base;
8b39fe56
MK
1154}
1155
1156static const struct frame_base sparc64_frame_base =
1157{
1158 &sparc64_frame_unwind,
1159 sparc64_frame_base_address,
1160 sparc64_frame_base_address,
1161 sparc64_frame_base_address
1162};
8b39fe56
MK
1163\f
1164/* Check whether TYPE must be 16-byte aligned. */
1165
1166static int
1167sparc64_16_byte_align_p (struct type *type)
1168{
78134374 1169 if (type->code () == TYPE_CODE_ARRAY)
1933fd8e 1170 {
27710edb 1171 struct type *t = check_typedef (type->target_type ());
1933fd8e
VM
1172
1173 if (sparc64_floating_p (t))
dda83cd7 1174 return 1;
1933fd8e 1175 }
df86565b 1176 if (sparc64_floating_p (type) && type->length () == 16)
8b39fe56
MK
1177 return 1;
1178
1179 if (sparc64_structure_or_union_p (type))
1180 {
1181 int i;
1182
1f704f76 1183 for (i = 0; i < type->num_fields (); i++)
60af1db2 1184 {
940da03e 1185 struct type *subtype = check_typedef (type->field (i).type ());
60af1db2
MK
1186
1187 if (sparc64_16_byte_align_p (subtype))
1188 return 1;
1189 }
8b39fe56
MK
1190 }
1191
1192 return 0;
1193}
1194
1195/* Store floating fields of element ELEMENT of an "parameter array"
1196 that has type TYPE and is stored at BITPOS in VALBUF in the
30baf67b 1197 appropriate registers of REGCACHE. This function can be called
8b39fe56
MK
1198 recursively and therefore handles floating types in addition to
1199 structures. */
1200
1201static void
1202sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
e1613aba 1203 const gdb_byte *valbuf, int element, int bitpos)
8b39fe56 1204{
ac7936df 1205 struct gdbarch *gdbarch = regcache->arch ();
df86565b 1206 int len = type->length ();
fe10a582 1207
8b39fe56
MK
1208 gdb_assert (element < 16);
1209
78134374 1210 if (type->code () == TYPE_CODE_ARRAY)
1933fd8e
VM
1211 {
1212 gdb_byte buf[8];
1213 int regnum = SPARC_F0_REGNUM + element * 2 + bitpos / 32;
1214
1215 valbuf += bitpos / 8;
1216 if (len < 8)
dda83cd7
SM
1217 {
1218 memset (buf, 0, 8 - len);
1219 memcpy (buf + 8 - len, valbuf, len);
1220 valbuf = buf;
1221 len = 8;
1222 }
1933fd8e 1223 for (int n = 0; n < (len + 3) / 4; n++)
dda83cd7 1224 regcache->cooked_write (regnum + n, valbuf + n * 4);
1933fd8e
VM
1225 }
1226 else if (sparc64_floating_p (type)
fe10a582 1227 || (sparc64_complex_floating_p (type) && len <= 16))
8b39fe56 1228 {
8b39fe56
MK
1229 int regnum;
1230
1231 if (len == 16)
1232 {
1233 gdb_assert (bitpos == 0);
1234 gdb_assert ((element % 2) == 0);
1235
7a36499a 1236 regnum = gdbarch_num_regs (gdbarch) + SPARC64_Q0_REGNUM + element / 2;
b66f5587 1237 regcache->cooked_write (regnum, valbuf);
8b39fe56
MK
1238 }
1239 else if (len == 8)
1240 {
1241 gdb_assert (bitpos == 0 || bitpos == 64);
1242
7a36499a 1243 regnum = gdbarch_num_regs (gdbarch) + SPARC64_D0_REGNUM
dda83cd7 1244 + element + bitpos / 64;
b66f5587 1245 regcache->cooked_write (regnum, valbuf + (bitpos / 8));
8b39fe56
MK
1246 }
1247 else
1248 {
1249 gdb_assert (len == 4);
1250 gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 128);
1251
1252 regnum = SPARC_F0_REGNUM + element * 2 + bitpos / 32;
b66f5587 1253 regcache->cooked_write (regnum, valbuf + (bitpos / 8));
8b39fe56
MK
1254 }
1255 }
1256 else if (sparc64_structure_or_union_p (type))
1257 {
1258 int i;
1259
1f704f76 1260 for (i = 0; i < type->num_fields (); i++)
60af1db2 1261 {
940da03e 1262 struct type *subtype = check_typedef (type->field (i).type ());
b610c045 1263 int subpos = bitpos + type->field (i).loc_bitpos ();
60af1db2
MK
1264
1265 sparc64_store_floating_fields (regcache, subtype, valbuf,
1266 element, subpos);
1267 }
200cc553
MK
1268
1269 /* GCC has an interesting bug. If TYPE is a structure that has
dda83cd7
SM
1270 a single `float' member, GCC doesn't treat it as a structure
1271 at all, but rather as an ordinary `float' argument. This
1272 argument will be stored in %f1, as required by the psABI.
1273 However, as a member of a structure the psABI requires it to
1274 be stored in %f0. This bug is present in GCC 3.3.2, but
1275 probably in older releases to. To appease GCC, if a
1276 structure has only a single `float' member, we store its
1277 value in %f1 too (we already have stored in %f0). */
1f704f76 1278 if (type->num_fields () == 1)
200cc553 1279 {
940da03e 1280 struct type *subtype = check_typedef (type->field (0).type ());
200cc553 1281
df86565b 1282 if (sparc64_floating_p (subtype) && subtype->length () == 4)
b66f5587 1283 regcache->cooked_write (SPARC_F1_REGNUM, valbuf);
200cc553 1284 }
8b39fe56
MK
1285 }
1286}
1287
1288/* Fetch floating fields from a variable of type TYPE from the
1289 appropriate registers for BITPOS in REGCACHE and store it at BITPOS
1290 in VALBUF. This function can be called recursively and therefore
1291 handles floating types in addition to structures. */
1292
1293static void
1294sparc64_extract_floating_fields (struct regcache *regcache, struct type *type,
e1613aba 1295 gdb_byte *valbuf, int bitpos)
8b39fe56 1296{
ac7936df 1297 struct gdbarch *gdbarch = regcache->arch ();
7a36499a 1298
78134374 1299 if (type->code () == TYPE_CODE_ARRAY)
1933fd8e 1300 {
df86565b 1301 int len = type->length ();
1933fd8e
VM
1302 int regnum = SPARC_F0_REGNUM + bitpos / 32;
1303
1304 valbuf += bitpos / 8;
1305 if (len < 4)
dda83cd7
SM
1306 {
1307 gdb_byte buf[4];
1308 regcache->cooked_read (regnum, buf);
1309 memcpy (valbuf, buf + 4 - len, len);
1310 }
1933fd8e 1311 else
dda83cd7
SM
1312 for (int i = 0; i < (len + 3) / 4; i++)
1313 regcache->cooked_read (regnum + i, valbuf + i * 4);
1933fd8e
VM
1314 }
1315 else if (sparc64_floating_p (type))
8b39fe56 1316 {
df86565b 1317 int len = type->length ();
8b39fe56
MK
1318 int regnum;
1319
1320 if (len == 16)
1321 {
1322 gdb_assert (bitpos == 0 || bitpos == 128);
1323
7a36499a 1324 regnum = gdbarch_num_regs (gdbarch) + SPARC64_Q0_REGNUM
dda83cd7 1325 + bitpos / 128;
dca08e1f 1326 regcache->cooked_read (regnum, valbuf + (bitpos / 8));
8b39fe56
MK
1327 }
1328 else if (len == 8)
1329 {
1330 gdb_assert (bitpos % 64 == 0 && bitpos >= 0 && bitpos < 256);
1331
7a36499a 1332 regnum = gdbarch_num_regs (gdbarch) + SPARC64_D0_REGNUM + bitpos / 64;
dca08e1f 1333 regcache->cooked_read (regnum, valbuf + (bitpos / 8));
8b39fe56
MK
1334 }
1335 else
1336 {
1337 gdb_assert (len == 4);
1338 gdb_assert (bitpos % 32 == 0 && bitpos >= 0 && bitpos < 256);
1339
1340 regnum = SPARC_F0_REGNUM + bitpos / 32;
dca08e1f 1341 regcache->cooked_read (regnum, valbuf + (bitpos / 8));
8b39fe56
MK
1342 }
1343 }
1344 else if (sparc64_structure_or_union_p (type))
1345 {
1346 int i;
1347
1f704f76 1348 for (i = 0; i < type->num_fields (); i++)
60af1db2 1349 {
940da03e 1350 struct type *subtype = check_typedef (type->field (i).type ());
b610c045 1351 int subpos = bitpos + type->field (i).loc_bitpos ();
60af1db2
MK
1352
1353 sparc64_extract_floating_fields (regcache, subtype, valbuf, subpos);
1354 }
8b39fe56
MK
1355 }
1356}
1357
1358/* Store the NARGS arguments ARGS and STRUCT_ADDR (if STRUCT_RETURN is
1359 non-zero) in REGCACHE and on the stack (starting from address SP). */
1360
1361static CORE_ADDR
1362sparc64_store_arguments (struct regcache *regcache, int nargs,
1363 struct value **args, CORE_ADDR sp,
cf84fa6b
AH
1364 function_call_return_method return_method,
1365 CORE_ADDR struct_addr)
8b39fe56 1366{
ac7936df 1367 struct gdbarch *gdbarch = regcache->arch ();
8b39fe56
MK
1368 /* Number of extended words in the "parameter array". */
1369 int num_elements = 0;
1370 int element = 0;
1371 int i;
1372
1373 /* Take BIAS into account. */
1374 sp += BIAS;
1375
1376 /* First we calculate the number of extended words in the "parameter
1377 array". While doing so we also convert some of the arguments. */
1378
cf84fa6b 1379 if (return_method == return_method_struct)
8b39fe56
MK
1380 num_elements++;
1381
1382 for (i = 0; i < nargs; i++)
1383 {
4991999e 1384 struct type *type = value_type (args[i]);
df86565b 1385 int len = type->length ();
8b39fe56 1386
fb57d452
MK
1387 if (sparc64_structure_or_union_p (type)
1388 || (sparc64_complex_floating_p (type) && len == 32))
8b39fe56
MK
1389 {
1390 /* Structure or Union arguments. */
1391 if (len <= 16)
1392 {
1393 if (num_elements % 2 && sparc64_16_byte_align_p (type))
1394 num_elements++;
1395 num_elements += ((len + 7) / 8);
1396 }
1397 else
1398 {
1399 /* The psABI says that "Structures or unions larger than
1400 sixteen bytes are copied by the caller and passed
1401 indirectly; the caller will pass the address of a
1402 correctly aligned structure value. This sixty-four
1403 bit address will occupy one word in the parameter
1404 array, and may be promoted to an %o register like any
1405 other pointer value." Allocate memory for these
1406 values on the stack. */
1407 sp -= len;
1408
1409 /* Use 16-byte alignment for these values. That's
dda83cd7
SM
1410 always correct, and wasting a few bytes shouldn't be
1411 a problem. */
8b39fe56
MK
1412 sp &= ~0xf;
1413
50888e42 1414 write_memory (sp, value_contents (args[i]).data (), len);
8b39fe56
MK
1415 args[i] = value_from_pointer (lookup_pointer_type (type), sp);
1416 num_elements++;
1417 }
1418 }
cdc7b32f 1419 else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type))
8b39fe56
MK
1420 {
1421 /* Floating arguments. */
8b39fe56
MK
1422 if (len == 16)
1423 {
1424 /* The psABI says that "Each quad-precision parameter
dda83cd7
SM
1425 value will be assigned to two extended words in the
1426 parameter array. */
8b39fe56
MK
1427 num_elements += 2;
1428
1429 /* The psABI says that "Long doubles must be
dda83cd7
SM
1430 quad-aligned, and thus a hole might be introduced
1431 into the parameter array to force alignment." Skip
1432 an element if necessary. */
49caec94 1433 if ((num_elements % 2) && sparc64_16_byte_align_p (type))
8b39fe56
MK
1434 num_elements++;
1435 }
1436 else
1437 num_elements++;
1438 }
1439 else
1440 {
1441 /* Integral and pointer arguments. */
1442 gdb_assert (sparc64_integral_or_pointer_p (type));
1443
1444 /* The psABI says that "Each argument value of integral type
1445 smaller than an extended word will be widened by the
1446 caller to an extended word according to the signed-ness
1447 of the argument type." */
1448 if (len < 8)
df4df182
UW
1449 args[i] = value_cast (builtin_type (gdbarch)->builtin_int64,
1450 args[i]);
8b39fe56
MK
1451 num_elements++;
1452 }
1453 }
1454
1455 /* Allocate the "parameter array". */
1456 sp -= num_elements * 8;
1457
1458 /* The psABI says that "Every stack frame must be 16-byte aligned." */
1459 sp &= ~0xf;
1460
85102364 1461 /* Now we store the arguments in to the "parameter array". Some
8b39fe56
MK
1462 Integer or Pointer arguments and Structure or Union arguments
1463 will be passed in %o registers. Some Floating arguments and
1464 floating members of structures are passed in floating-point
1465 registers. However, for functions with variable arguments,
1466 floating arguments are stored in an %0 register, and for
1467 functions without a prototype floating arguments are stored in
1468 both a floating-point and an %o registers, or a floating-point
1469 register and memory. To simplify the logic here we always pass
1470 arguments in memory, an %o register, and a floating-point
1471 register if appropriate. This should be no problem since the
1472 contents of any unused memory or registers in the "parameter
1473 array" are undefined. */
1474
cf84fa6b 1475 if (return_method == return_method_struct)
8b39fe56
MK
1476 {
1477 regcache_cooked_write_unsigned (regcache, SPARC_O0_REGNUM, struct_addr);
1478 element++;
1479 }
1480
1481 for (i = 0; i < nargs; i++)
1482 {
50888e42 1483 const gdb_byte *valbuf = value_contents (args[i]).data ();
4991999e 1484 struct type *type = value_type (args[i]);
df86565b 1485 int len = type->length ();
8b39fe56 1486 int regnum = -1;
e1613aba 1487 gdb_byte buf[16];
8b39fe56 1488
fb57d452
MK
1489 if (sparc64_structure_or_union_p (type)
1490 || (sparc64_complex_floating_p (type) && len == 32))
8b39fe56 1491 {
49caec94 1492 /* Structure, Union or long double Complex arguments. */
8b39fe56
MK
1493 gdb_assert (len <= 16);
1494 memset (buf, 0, sizeof (buf));
cfcb22a5
SM
1495 memcpy (buf, valbuf, len);
1496 valbuf = buf;
8b39fe56
MK
1497
1498 if (element % 2 && sparc64_16_byte_align_p (type))
1499 element++;
1500
1501 if (element < 6)
1502 {
1503 regnum = SPARC_O0_REGNUM + element;
1504 if (len > 8 && element < 5)
b66f5587 1505 regcache->cooked_write (regnum + 1, valbuf + 8);
8b39fe56
MK
1506 }
1507
1508 if (element < 16)
1509 sparc64_store_floating_fields (regcache, type, valbuf, element, 0);
1510 }
49caec94
JM
1511 else if (sparc64_complex_floating_p (type))
1512 {
1513 /* Float Complex or double Complex arguments. */
1514 if (element < 16)
1515 {
7a36499a 1516 regnum = gdbarch_num_regs (gdbarch) + SPARC64_D0_REGNUM + element;
49caec94
JM
1517
1518 if (len == 16)
1519 {
7a36499a 1520 if (regnum < gdbarch_num_regs (gdbarch) + SPARC64_D30_REGNUM)
b66f5587 1521 regcache->cooked_write (regnum + 1, valbuf + 8);
7a36499a 1522 if (regnum < gdbarch_num_regs (gdbarch) + SPARC64_D10_REGNUM)
b66f5587
SM
1523 regcache->cooked_write (SPARC_O0_REGNUM + element + 1,
1524 valbuf + 8);
49caec94
JM
1525 }
1526 }
1527 }
1528 else if (sparc64_floating_p (type))
8b39fe56
MK
1529 {
1530 /* Floating arguments. */
1531 if (len == 16)
1532 {
1533 if (element % 2)
1534 element++;
1535 if (element < 16)
7a36499a 1536 regnum = gdbarch_num_regs (gdbarch) + SPARC64_Q0_REGNUM
dda83cd7 1537 + element / 2;
8b39fe56
MK
1538 }
1539 else if (len == 8)
1540 {
1541 if (element < 16)
7a36499a 1542 regnum = gdbarch_num_regs (gdbarch) + SPARC64_D0_REGNUM
dda83cd7 1543 + element;
8b39fe56 1544 }
fe10a582 1545 else if (len == 4)
8b39fe56
MK
1546 {
1547 /* The psABI says "Each single-precision parameter value
dda83cd7
SM
1548 will be assigned to one extended word in the
1549 parameter array, and right-justified within that
1550 word; the left half (even float register) is
1551 undefined." Even though the psABI says that "the
1552 left half is undefined", set it to zero here. */
8b39fe56 1553 memset (buf, 0, 4);
8ada74e3
MK
1554 memcpy (buf + 4, valbuf, 4);
1555 valbuf = buf;
8b39fe56
MK
1556 len = 8;
1557 if (element < 16)
7a36499a 1558 regnum = gdbarch_num_regs (gdbarch) + SPARC64_D0_REGNUM
dda83cd7 1559 + element;
8b39fe56
MK
1560 }
1561 }
1562 else
1563 {
1564 /* Integral and pointer arguments. */
1565 gdb_assert (len == 8);
1566 if (element < 6)
1567 regnum = SPARC_O0_REGNUM + element;
1568 }
1569
1570 if (regnum != -1)
1571 {
b66f5587 1572 regcache->cooked_write (regnum, valbuf);
8b39fe56
MK
1573
1574 /* If we're storing the value in a floating-point register,
dda83cd7 1575 also store it in the corresponding %0 register(s). */
7a36499a 1576 if (regnum >= gdbarch_num_regs (gdbarch))
dda83cd7
SM
1577 {
1578 regnum -= gdbarch_num_regs (gdbarch);
1579
1580 if (regnum >= SPARC64_D0_REGNUM && regnum <= SPARC64_D10_REGNUM)
1581 {
1582 gdb_assert (element < 6);
1583 regnum = SPARC_O0_REGNUM + element;
1584 regcache->cooked_write (regnum, valbuf);
1585 }
1586 else if (regnum >= SPARC64_Q0_REGNUM && regnum <= SPARC64_Q8_REGNUM)
1587 {
1588 gdb_assert (element < 5);
1589 regnum = SPARC_O0_REGNUM + element;
1590 regcache->cooked_write (regnum, valbuf);
1591 regcache->cooked_write (regnum + 1, valbuf + 8);
1592 }
1593 }
8b39fe56
MK
1594 }
1595
c4f2d4d7 1596 /* Always store the argument in memory. */
8b39fe56
MK
1597 write_memory (sp + element * 8, valbuf, len);
1598 element += ((len + 7) / 8);
1599 }
1600
1601 gdb_assert (element == num_elements);
1602
1603 /* Take BIAS into account. */
1604 sp -= BIAS;
1605 return sp;
1606}
1607
49a45ecf
JB
1608static CORE_ADDR
1609sparc64_frame_align (struct gdbarch *gdbarch, CORE_ADDR address)
1610{
1611 /* The ABI requires 16-byte alignment. */
1612 return address & ~0xf;
1613}
1614
8b39fe56 1615static CORE_ADDR
7d9b040b 1616sparc64_push_dummy_call (struct gdbarch *gdbarch, struct value *function,
8b39fe56
MK
1617 struct regcache *regcache, CORE_ADDR bp_addr,
1618 int nargs, struct value **args, CORE_ADDR sp,
cf84fa6b
AH
1619 function_call_return_method return_method,
1620 CORE_ADDR struct_addr)
8b39fe56
MK
1621{
1622 /* Set return address. */
1623 regcache_cooked_write_unsigned (regcache, SPARC_O7_REGNUM, bp_addr - 8);
1624
1625 /* Set up function arguments. */
cf84fa6b
AH
1626 sp = sparc64_store_arguments (regcache, nargs, args, sp, return_method,
1627 struct_addr);
8b39fe56
MK
1628
1629 /* Allocate the register save area. */
1630 sp -= 16 * 8;
1631
1632 /* Stack should be 16-byte aligned at this point. */
3567a8ea 1633 gdb_assert ((sp + BIAS) % 16 == 0);
8b39fe56
MK
1634
1635 /* Finally, update the stack pointer. */
1636 regcache_cooked_write_unsigned (regcache, SPARC_SP_REGNUM, sp);
1637
5b2d44a0 1638 return sp + BIAS;
8b39fe56
MK
1639}
1640\f
1641
1642/* Extract from an array REGBUF containing the (raw) register state, a
1643 function return value of TYPE, and copy that into VALBUF. */
1644
1645static void
1646sparc64_extract_return_value (struct type *type, struct regcache *regcache,
e1613aba 1647 gdb_byte *valbuf)
8b39fe56 1648{
df86565b 1649 int len = type->length ();
e1613aba 1650 gdb_byte buf[32];
8b39fe56
MK
1651 int i;
1652
1653 if (sparc64_structure_or_union_p (type))
1654 {
1655 /* Structure or Union return values. */
1656 gdb_assert (len <= 32);
1657
1658 for (i = 0; i < ((len + 7) / 8); i++)
dca08e1f 1659 regcache->cooked_read (SPARC_O0_REGNUM + i, buf + i * 8);
78134374 1660 if (type->code () != TYPE_CODE_UNION)
8b39fe56
MK
1661 sparc64_extract_floating_fields (regcache, type, buf, 0);
1662 memcpy (valbuf, buf, len);
1663 }
cdc7b32f 1664 else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type))
8b39fe56
MK
1665 {
1666 /* Floating return values. */
1667 for (i = 0; i < len / 4; i++)
dca08e1f 1668 regcache->cooked_read (SPARC_F0_REGNUM + i, buf + i * 4);
8b39fe56
MK
1669 memcpy (valbuf, buf, len);
1670 }
78134374 1671 else if (type->code () == TYPE_CODE_ARRAY)
4bd87714
JB
1672 {
1673 /* Small arrays are returned the same way as small structures. */
1674 gdb_assert (len <= 32);
1675
1676 for (i = 0; i < ((len + 7) / 8); i++)
dca08e1f 1677 regcache->cooked_read (SPARC_O0_REGNUM + i, buf + i * 8);
4bd87714
JB
1678 memcpy (valbuf, buf, len);
1679 }
8b39fe56
MK
1680 else
1681 {
1682 /* Integral and pointer return values. */
1683 gdb_assert (sparc64_integral_or_pointer_p (type));
1684
1685 /* Just stripping off any unused bytes should preserve the
dda83cd7 1686 signed-ness just fine. */
dca08e1f 1687 regcache->cooked_read (SPARC_O0_REGNUM, buf);
8b39fe56
MK
1688 memcpy (valbuf, buf + 8 - len, len);
1689 }
1690}
1691
1692/* Write into the appropriate registers a function return value stored
1693 in VALBUF of type TYPE. */
1694
1695static void
1696sparc64_store_return_value (struct type *type, struct regcache *regcache,
e1613aba 1697 const gdb_byte *valbuf)
8b39fe56 1698{
df86565b 1699 int len = type->length ();
e1613aba 1700 gdb_byte buf[16];
8b39fe56
MK
1701 int i;
1702
1703 if (sparc64_structure_or_union_p (type))
1704 {
1705 /* Structure or Union return values. */
1706 gdb_assert (len <= 32);
1707
1708 /* Simplify matters by storing the complete value (including
dda83cd7
SM
1709 floating members) into %o0 and %o1. Floating members are
1710 also store in the appropriate floating-point registers. */
8b39fe56
MK
1711 memset (buf, 0, sizeof (buf));
1712 memcpy (buf, valbuf, len);
1713 for (i = 0; i < ((len + 7) / 8); i++)
b66f5587 1714 regcache->cooked_write (SPARC_O0_REGNUM + i, buf + i * 8);
78134374 1715 if (type->code () != TYPE_CODE_UNION)
8b39fe56
MK
1716 sparc64_store_floating_fields (regcache, type, buf, 0, 0);
1717 }
fe10a582 1718 else if (sparc64_floating_p (type) || sparc64_complex_floating_p (type))
8b39fe56
MK
1719 {
1720 /* Floating return values. */
1721 memcpy (buf, valbuf, len);
1722 for (i = 0; i < len / 4; i++)
b66f5587 1723 regcache->cooked_write (SPARC_F0_REGNUM + i, buf + i * 4);
8b39fe56 1724 }
78134374 1725 else if (type->code () == TYPE_CODE_ARRAY)
4bd87714
JB
1726 {
1727 /* Small arrays are returned the same way as small structures. */
1728 gdb_assert (len <= 32);
1729
1730 memset (buf, 0, sizeof (buf));
1731 memcpy (buf, valbuf, len);
1732 for (i = 0; i < ((len + 7) / 8); i++)
b66f5587 1733 regcache->cooked_write (SPARC_O0_REGNUM + i, buf + i * 8);
4bd87714 1734 }
8b39fe56
MK
1735 else
1736 {
1737 /* Integral and pointer return values. */
1738 gdb_assert (sparc64_integral_or_pointer_p (type));
1739
1740 /* ??? Do we need to do any sign-extension here? */
1741 memset (buf, 0, 8);
1742 memcpy (buf + 8 - len, valbuf, len);
b66f5587 1743 regcache->cooked_write (SPARC_O0_REGNUM, buf);
8b39fe56
MK
1744 }
1745}
1746
60af1db2 1747static enum return_value_convention
6a3a010b 1748sparc64_return_value (struct gdbarch *gdbarch, struct value *function,
c055b101
CV
1749 struct type *type, struct regcache *regcache,
1750 gdb_byte *readbuf, const gdb_byte *writebuf)
8b39fe56 1751{
df86565b 1752 if (type->length () > 32)
60af1db2
MK
1753 return RETURN_VALUE_STRUCT_CONVENTION;
1754
1755 if (readbuf)
1756 sparc64_extract_return_value (type, regcache, readbuf);
1757 if (writebuf)
1758 sparc64_store_return_value (type, regcache, writebuf);
1759
1760 return RETURN_VALUE_REGISTER_CONVENTION;
8b39fe56 1761}
8b39fe56 1762\f
8b39fe56 1763
02a71ae8
MK
1764static void
1765sparc64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
aff37fc1 1766 struct dwarf2_frame_state_reg *reg,
bd2b40ac 1767 frame_info_ptr this_frame)
02a71ae8
MK
1768{
1769 switch (regnum)
1770 {
1771 case SPARC_G0_REGNUM:
1772 /* Since %g0 is always zero, there is no point in saving it, and
1773 people will be inclined omit it from the CFI. Make sure we
1774 don't warn about that. */
1775 reg->how = DWARF2_FRAME_REG_SAME_VALUE;
1776 break;
1777 case SPARC_SP_REGNUM:
1778 reg->how = DWARF2_FRAME_REG_CFA;
1779 break;
1780 case SPARC64_PC_REGNUM:
1781 reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1782 reg->loc.offset = 8;
1783 break;
1784 case SPARC64_NPC_REGNUM:
1785 reg->how = DWARF2_FRAME_REG_RA_OFFSET;
1786 reg->loc.offset = 12;
1787 break;
1788 }
1789}
1790
58afddc6
WP
1791/* sparc64_addr_bits_remove - remove useless address bits */
1792
1793static CORE_ADDR
1794sparc64_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
1795{
1796 return adi_normalize_address (addr);
1797}
1798
8b39fe56 1799void
386c036b 1800sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
8b39fe56 1801{
08106042 1802 sparc_gdbarch_tdep *tdep = gdbarch_tdep<sparc_gdbarch_tdep> (gdbarch);
8b39fe56 1803
386c036b
MK
1804 tdep->pc_regnum = SPARC64_PC_REGNUM;
1805 tdep->npc_regnum = SPARC64_NPC_REGNUM;
3f7b46f2
IR
1806 tdep->fpu_register_names = sparc64_fpu_register_names;
1807 tdep->fpu_registers_num = ARRAY_SIZE (sparc64_fpu_register_names);
1808 tdep->cp0_register_names = sparc64_cp0_register_names;
1809 tdep->cp0_registers_num = ARRAY_SIZE (sparc64_cp0_register_names);
8b39fe56 1810
386c036b 1811 /* This is what all the fuss is about. */
8b39fe56
MK
1812 set_gdbarch_long_bit (gdbarch, 64);
1813 set_gdbarch_long_long_bit (gdbarch, 64);
1814 set_gdbarch_ptr_bit (gdbarch, 64);
8b39fe56 1815
53375380
PA
1816 set_gdbarch_wchar_bit (gdbarch, 16);
1817 set_gdbarch_wchar_signed (gdbarch, 0);
1818
8b39fe56
MK
1819 set_gdbarch_num_regs (gdbarch, SPARC64_NUM_REGS);
1820 set_gdbarch_register_name (gdbarch, sparc64_register_name);
1821 set_gdbarch_register_type (gdbarch, sparc64_register_type);
1822 set_gdbarch_num_pseudo_regs (gdbarch, SPARC64_NUM_PSEUDO_REGS);
3f7b46f2
IR
1823 set_tdesc_pseudo_register_name (gdbarch, sparc64_pseudo_register_name);
1824 set_tdesc_pseudo_register_type (gdbarch, sparc64_pseudo_register_type);
8b39fe56
MK
1825 set_gdbarch_pseudo_register_read (gdbarch, sparc64_pseudo_register_read);
1826 set_gdbarch_pseudo_register_write (gdbarch, sparc64_pseudo_register_write);
1827
1828 /* Register numbers of various important registers. */
8b39fe56 1829 set_gdbarch_pc_regnum (gdbarch, SPARC64_PC_REGNUM); /* %pc */
8b39fe56
MK
1830
1831 /* Call dummy code. */
49a45ecf 1832 set_gdbarch_frame_align (gdbarch, sparc64_frame_align);
386c036b
MK
1833 set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT);
1834 set_gdbarch_push_dummy_code (gdbarch, NULL);
8b39fe56
MK
1835 set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
1836
60af1db2 1837 set_gdbarch_return_value (gdbarch, sparc64_return_value);
386c036b
MK
1838 set_gdbarch_stabs_argument_has_addr
1839 (gdbarch, default_stabs_argument_has_addr);
8b39fe56
MK
1840
1841 set_gdbarch_skip_prologue (gdbarch, sparc64_skip_prologue);
c9cf6e20 1842 set_gdbarch_stack_frame_destroyed_p (gdbarch, sparc_stack_frame_destroyed_p);
8b39fe56 1843
02a71ae8
MK
1844 /* Hook in the DWARF CFI frame unwinder. */
1845 dwarf2_frame_set_init_reg (gdbarch, sparc64_dwarf2_frame_init_reg);
1846 /* FIXME: kettenis/20050423: Don't enable the unwinder until the
1847 StackGhost issues have been resolved. */
1848
236369e7 1849 frame_unwind_append_unwinder (gdbarch, &sparc64_frame_unwind);
8b39fe56 1850 frame_base_set_default (gdbarch, &sparc64_frame_base);
58afddc6
WP
1851
1852 set_gdbarch_addr_bits_remove (gdbarch, sparc64_addr_bits_remove);
386c036b
MK
1853}
1854\f
8b39fe56 1855
386c036b 1856/* Helper functions for dealing with register sets. */
8b39fe56 1857
386c036b
MK
1858#define TSTATE_CWP 0x000000000000001fULL
1859#define TSTATE_ICC 0x0000000f00000000ULL
1860#define TSTATE_XCC 0x000000f000000000ULL
8b39fe56 1861
386c036b 1862#define PSR_S 0x00000080
39b06c20 1863#ifndef PSR_ICC
386c036b 1864#define PSR_ICC 0x00f00000
39b06c20 1865#endif
386c036b 1866#define PSR_VERS 0x0f000000
39b06c20 1867#ifndef PSR_IMPL
386c036b 1868#define PSR_IMPL 0xf0000000
39b06c20 1869#endif
386c036b
MK
1870#define PSR_V8PLUS 0xff000000
1871#define PSR_XCC 0x000f0000
8b39fe56 1872
3567a8ea 1873void
b4fd25c9 1874sparc64_supply_gregset (const struct sparc_gregmap *gregmap,
386c036b
MK
1875 struct regcache *regcache,
1876 int regnum, const void *gregs)
8b39fe56 1877{
ac7936df 1878 struct gdbarch *gdbarch = regcache->arch ();
e17a4113
UW
1879 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1880 int sparc32 = (gdbarch_ptr_bit (gdbarch) == 32);
19ba03f4 1881 const gdb_byte *regs = (const gdb_byte *) gregs;
22e74ef9 1882 gdb_byte zero[8] = { 0 };
8b39fe56
MK
1883 int i;
1884
386c036b 1885 if (sparc32)
8b39fe56 1886 {
386c036b
MK
1887 if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
1888 {
b4fd25c9 1889 int offset = gregmap->r_tstate_offset;
386c036b 1890 ULONGEST tstate, psr;
e1613aba 1891 gdb_byte buf[4];
386c036b 1892
e17a4113 1893 tstate = extract_unsigned_integer (regs + offset, 8, byte_order);
386c036b
MK
1894 psr = ((tstate & TSTATE_CWP) | PSR_S | ((tstate & TSTATE_ICC) >> 12)
1895 | ((tstate & TSTATE_XCC) >> 20) | PSR_V8PLUS);
e17a4113 1896 store_unsigned_integer (buf, 4, byte_order, psr);
73e1c03f 1897 regcache->raw_supply (SPARC32_PSR_REGNUM, buf);
386c036b
MK
1898 }
1899
1900 if (regnum == SPARC32_PC_REGNUM || regnum == -1)
73e1c03f
SM
1901 regcache->raw_supply (SPARC32_PC_REGNUM,
1902 regs + gregmap->r_pc_offset + 4);
386c036b
MK
1903
1904 if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
73e1c03f
SM
1905 regcache->raw_supply (SPARC32_NPC_REGNUM,
1906 regs + gregmap->r_npc_offset + 4);
8b39fe56 1907
386c036b 1908 if (regnum == SPARC32_Y_REGNUM || regnum == -1)
8b39fe56 1909 {
b4fd25c9 1910 int offset = gregmap->r_y_offset + 8 - gregmap->r_y_size;
73e1c03f 1911 regcache->raw_supply (SPARC32_Y_REGNUM, regs + offset);
8b39fe56
MK
1912 }
1913 }
1914 else
1915 {
386c036b 1916 if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
73e1c03f
SM
1917 regcache->raw_supply (SPARC64_STATE_REGNUM,
1918 regs + gregmap->r_tstate_offset);
8b39fe56 1919
386c036b 1920 if (regnum == SPARC64_PC_REGNUM || regnum == -1)
73e1c03f
SM
1921 regcache->raw_supply (SPARC64_PC_REGNUM,
1922 regs + gregmap->r_pc_offset);
386c036b
MK
1923
1924 if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
73e1c03f
SM
1925 regcache->raw_supply (SPARC64_NPC_REGNUM,
1926 regs + gregmap->r_npc_offset);
386c036b
MK
1927
1928 if (regnum == SPARC64_Y_REGNUM || regnum == -1)
3567a8ea 1929 {
e1613aba 1930 gdb_byte buf[8];
386c036b
MK
1931
1932 memset (buf, 0, 8);
b4fd25c9
AA
1933 memcpy (buf + 8 - gregmap->r_y_size,
1934 regs + gregmap->r_y_offset, gregmap->r_y_size);
73e1c03f 1935 regcache->raw_supply (SPARC64_Y_REGNUM, buf);
3567a8ea 1936 }
8b39fe56 1937
386c036b 1938 if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
b4fd25c9 1939 && gregmap->r_fprs_offset != -1)
73e1c03f
SM
1940 regcache->raw_supply (SPARC64_FPRS_REGNUM,
1941 regs + gregmap->r_fprs_offset);
386c036b
MK
1942 }
1943
1944 if (regnum == SPARC_G0_REGNUM || regnum == -1)
73e1c03f 1945 regcache->raw_supply (SPARC_G0_REGNUM, &zero);
386c036b
MK
1946
1947 if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
1948 {
b4fd25c9 1949 int offset = gregmap->r_g1_offset;
386c036b
MK
1950
1951 if (sparc32)
1952 offset += 4;
1953
1954 for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
8b39fe56 1955 {
3567a8ea 1956 if (regnum == i || regnum == -1)
73e1c03f 1957 regcache->raw_supply (i, regs + offset);
386c036b
MK
1958 offset += 8;
1959 }
1960 }
1961
1962 if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
1963 {
1964 /* Not all of the register set variants include Locals and
dda83cd7 1965 Inputs. For those that don't, we read them off the stack. */
b4fd25c9 1966 if (gregmap->r_l0_offset == -1)
386c036b
MK
1967 {
1968 ULONGEST sp;
1969
1970 regcache_cooked_read_unsigned (regcache, SPARC_SP_REGNUM, &sp);
1971 sparc_supply_rwindow (regcache, sp, regnum);
1972 }
1973 else
1974 {
b4fd25c9 1975 int offset = gregmap->r_l0_offset;
386c036b
MK
1976
1977 if (sparc32)
1978 offset += 4;
1979
1980 for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
3567a8ea 1981 {
386c036b 1982 if (regnum == i || regnum == -1)
73e1c03f 1983 regcache->raw_supply (i, regs + offset);
386c036b 1984 offset += 8;
3567a8ea 1985 }
8b39fe56
MK
1986 }
1987 }
1988}
1989
1990void
b4fd25c9 1991sparc64_collect_gregset (const struct sparc_gregmap *gregmap,
386c036b
MK
1992 const struct regcache *regcache,
1993 int regnum, void *gregs)
8b39fe56 1994{
ac7936df 1995 struct gdbarch *gdbarch = regcache->arch ();
e17a4113
UW
1996 enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
1997 int sparc32 = (gdbarch_ptr_bit (gdbarch) == 32);
19ba03f4 1998 gdb_byte *regs = (gdb_byte *) gregs;
3567a8ea
MK
1999 int i;
2000
386c036b 2001 if (sparc32)
8b39fe56 2002 {
386c036b
MK
2003 if (regnum == SPARC32_PSR_REGNUM || regnum == -1)
2004 {
b4fd25c9 2005 int offset = gregmap->r_tstate_offset;
386c036b 2006 ULONGEST tstate, psr;
e1613aba 2007 gdb_byte buf[8];
386c036b 2008
e17a4113 2009 tstate = extract_unsigned_integer (regs + offset, 8, byte_order);
34a79281 2010 regcache->raw_collect (SPARC32_PSR_REGNUM, buf);
e17a4113 2011 psr = extract_unsigned_integer (buf, 4, byte_order);
386c036b
MK
2012 tstate |= (psr & PSR_ICC) << 12;
2013 if ((psr & (PSR_VERS | PSR_IMPL)) == PSR_V8PLUS)
2014 tstate |= (psr & PSR_XCC) << 20;
e17a4113 2015 store_unsigned_integer (buf, 8, byte_order, tstate);
386c036b
MK
2016 memcpy (regs + offset, buf, 8);
2017 }
8b39fe56 2018
386c036b 2019 if (regnum == SPARC32_PC_REGNUM || regnum == -1)
34a79281
SM
2020 regcache->raw_collect (SPARC32_PC_REGNUM,
2021 regs + gregmap->r_pc_offset + 4);
386c036b
MK
2022
2023 if (regnum == SPARC32_NPC_REGNUM || regnum == -1)
34a79281
SM
2024 regcache->raw_collect (SPARC32_NPC_REGNUM,
2025 regs + gregmap->r_npc_offset + 4);
386c036b
MK
2026
2027 if (regnum == SPARC32_Y_REGNUM || regnum == -1)
8b39fe56 2028 {
b4fd25c9 2029 int offset = gregmap->r_y_offset + 8 - gregmap->r_y_size;
34a79281 2030 regcache->raw_collect (SPARC32_Y_REGNUM, regs + offset);
8b39fe56
MK
2031 }
2032 }
2033 else
2034 {
386c036b 2035 if (regnum == SPARC64_STATE_REGNUM || regnum == -1)
34a79281
SM
2036 regcache->raw_collect (SPARC64_STATE_REGNUM,
2037 regs + gregmap->r_tstate_offset);
386c036b
MK
2038
2039 if (regnum == SPARC64_PC_REGNUM || regnum == -1)
34a79281
SM
2040 regcache->raw_collect (SPARC64_PC_REGNUM,
2041 regs + gregmap->r_pc_offset);
3567a8ea 2042
386c036b 2043 if (regnum == SPARC64_NPC_REGNUM || regnum == -1)
34a79281
SM
2044 regcache->raw_collect (SPARC64_NPC_REGNUM,
2045 regs + gregmap->r_npc_offset);
3567a8ea 2046
386c036b 2047 if (regnum == SPARC64_Y_REGNUM || regnum == -1)
3567a8ea 2048 {
e1613aba 2049 gdb_byte buf[8];
386c036b 2050
34a79281 2051 regcache->raw_collect (SPARC64_Y_REGNUM, buf);
b4fd25c9
AA
2052 memcpy (regs + gregmap->r_y_offset,
2053 buf + 8 - gregmap->r_y_size, gregmap->r_y_size);
386c036b
MK
2054 }
2055
2056 if ((regnum == SPARC64_FPRS_REGNUM || regnum == -1)
b4fd25c9 2057 && gregmap->r_fprs_offset != -1)
34a79281
SM
2058 regcache->raw_collect (SPARC64_FPRS_REGNUM,
2059 regs + gregmap->r_fprs_offset);
386c036b
MK
2060
2061 }
2062
2063 if ((regnum >= SPARC_G1_REGNUM && regnum <= SPARC_O7_REGNUM) || regnum == -1)
2064 {
b4fd25c9 2065 int offset = gregmap->r_g1_offset;
386c036b
MK
2066
2067 if (sparc32)
2068 offset += 4;
2069
2070 /* %g0 is always zero. */
2071 for (i = SPARC_G1_REGNUM; i <= SPARC_O7_REGNUM; i++)
2072 {
2073 if (regnum == i || regnum == -1)
34a79281 2074 regcache->raw_collect (i, regs + offset);
386c036b
MK
2075 offset += 8;
2076 }
2077 }
2078
2079 if ((regnum >= SPARC_L0_REGNUM && regnum <= SPARC_I7_REGNUM) || regnum == -1)
2080 {
2081 /* Not all of the register set variants include Locals and
dda83cd7 2082 Inputs. For those that don't, we read them off the stack. */
b4fd25c9 2083 if (gregmap->r_l0_offset != -1)
386c036b 2084 {
b4fd25c9 2085 int offset = gregmap->r_l0_offset;
386c036b
MK
2086
2087 if (sparc32)
2088 offset += 4;
2089
2090 for (i = SPARC_L0_REGNUM; i <= SPARC_I7_REGNUM; i++)
3567a8ea 2091 {
386c036b 2092 if (regnum == i || regnum == -1)
34a79281 2093 regcache->raw_collect (i, regs + offset);
386c036b 2094 offset += 8;
3567a8ea
MK
2095 }
2096 }
8b39fe56
MK
2097 }
2098}
8b39fe56 2099
386c036b 2100void
b4fd25c9 2101sparc64_supply_fpregset (const struct sparc_fpregmap *fpregmap,
db75c717 2102 struct regcache *regcache,
386c036b
MK
2103 int regnum, const void *fpregs)
2104{
ac7936df 2105 int sparc32 = (gdbarch_ptr_bit (regcache->arch ()) == 32);
19ba03f4 2106 const gdb_byte *regs = (const gdb_byte *) fpregs;
386c036b
MK
2107 int i;
2108
2109 for (i = 0; i < 32; i++)
2110 {
2111 if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
73e1c03f 2112 regcache->raw_supply (SPARC_F0_REGNUM + i,
34a79281 2113 regs + fpregmap->r_f0_offset + (i * 4));
386c036b
MK
2114 }
2115
2116 if (sparc32)
2117 {
2118 if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
73e1c03f 2119 regcache->raw_supply (SPARC32_FSR_REGNUM,
b4fd25c9 2120 regs + fpregmap->r_fsr_offset);
386c036b
MK
2121 }
2122 else
2123 {
2124 for (i = 0; i < 16; i++)
2125 {
2126 if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
73e1c03f
SM
2127 regcache->raw_supply
2128 (SPARC64_F32_REGNUM + i,
2129 regs + fpregmap->r_f0_offset + (32 * 4) + (i * 8));
386c036b
MK
2130 }
2131
2132 if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
73e1c03f
SM
2133 regcache->raw_supply (SPARC64_FSR_REGNUM,
2134 regs + fpregmap->r_fsr_offset);
386c036b
MK
2135 }
2136}
8b39fe56
MK
2137
2138void
b4fd25c9 2139sparc64_collect_fpregset (const struct sparc_fpregmap *fpregmap,
db75c717 2140 const struct regcache *regcache,
386c036b 2141 int regnum, void *fpregs)
8b39fe56 2142{
ac7936df 2143 int sparc32 = (gdbarch_ptr_bit (regcache->arch ()) == 32);
19ba03f4 2144 gdb_byte *regs = (gdb_byte *) fpregs;
386c036b
MK
2145 int i;
2146
2147 for (i = 0; i < 32; i++)
2148 {
2149 if (regnum == (SPARC_F0_REGNUM + i) || regnum == -1)
34a79281
SM
2150 regcache->raw_collect (SPARC_F0_REGNUM + i,
2151 regs + fpregmap->r_f0_offset + (i * 4));
386c036b
MK
2152 }
2153
2154 if (sparc32)
2155 {
2156 if (regnum == SPARC32_FSR_REGNUM || regnum == -1)
34a79281
SM
2157 regcache->raw_collect (SPARC32_FSR_REGNUM,
2158 regs + fpregmap->r_fsr_offset);
386c036b
MK
2159 }
2160 else
2161 {
2162 for (i = 0; i < 16; i++)
2163 {
2164 if (regnum == (SPARC64_F32_REGNUM + i) || regnum == -1)
34a79281
SM
2165 regcache->raw_collect (SPARC64_F32_REGNUM + i,
2166 (regs + fpregmap->r_f0_offset
2167 + (32 * 4) + (i * 8)));
386c036b
MK
2168 }
2169
2170 if (regnum == SPARC64_FSR_REGNUM || regnum == -1)
34a79281
SM
2171 regcache->raw_collect (SPARC64_FSR_REGNUM,
2172 regs + fpregmap->r_fsr_offset);
386c036b 2173 }
8b39fe56 2174}
fd936806 2175
b4fd25c9 2176const struct sparc_fpregmap sparc64_bsd_fpregmap =
db75c717
DM
2177{
2178 0 * 8, /* %f0 */
2179 32 * 8, /* %fsr */
2180};