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