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