xref: /openbsd-src/gnu/usr.bin/binutils/gdb/ia64-aix-nat.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* Low level interface to IA-64 running AIX for GDB, the GNU debugger.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 2000, 2001, 2003 Free Software Foundation, Inc.
4b725ae77Skettenis 
5b725ae77Skettenis    This file is part of GDB.
6b725ae77Skettenis 
7b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis    it under the terms of the GNU General Public License as published by
9b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis    (at your option) any later version.
11b725ae77Skettenis 
12b725ae77Skettenis    This program is distributed in the hope that it will be useful,
13b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15b725ae77Skettenis    GNU General Public License for more details.
16b725ae77Skettenis 
17b725ae77Skettenis    You should have received a copy of the GNU General Public License
18b725ae77Skettenis    along with this program; if not, write to the Free Software
19b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
21b725ae77Skettenis 
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis #include "inferior.h"
24b725ae77Skettenis #include "target.h"
25b725ae77Skettenis #include "gdbcore.h"
26b725ae77Skettenis #include "regcache.h"
27b725ae77Skettenis #include <sys/procfs.h>
28b725ae77Skettenis 
29b725ae77Skettenis #include "symtab.h"
30b725ae77Skettenis #include "bfd.h"
31b725ae77Skettenis #include "symfile.h"
32b725ae77Skettenis #include "objfiles.h"
33b725ae77Skettenis 
34b725ae77Skettenis #include <sys/types.h>
35b725ae77Skettenis #include <fcntl.h>
36b725ae77Skettenis #include "gdb_stat.h"
37b725ae77Skettenis 
38b725ae77Skettenis void
supply_gregset(prgregset_t * gregsetp)39b725ae77Skettenis supply_gregset (prgregset_t *gregsetp)
40b725ae77Skettenis {
41b725ae77Skettenis   int regi;
42b725ae77Skettenis 
43b725ae77Skettenis   for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++)
44b725ae77Skettenis     {
45*11efff7fSkettenis       regcache_raw_supply (current_regcache, regi,
46b725ae77Skettenis 			   (char *) &(gregsetp->__gpr[regi - IA64_GR0_REGNUM]));
47b725ae77Skettenis     }
48b725ae77Skettenis 
49b725ae77Skettenis   for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++)
50b725ae77Skettenis     {
51*11efff7fSkettenis       regcache_raw_supply (current_regcache, regi,
52b725ae77Skettenis 			   (char *) &(gregsetp->__br[regi - IA64_BR0_REGNUM]));
53b725ae77Skettenis     }
54b725ae77Skettenis 
55*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_PSR_REGNUM,
56*11efff7fSkettenis 		       (char *) &(gregsetp->__psr));
57*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_IP_REGNUM,
58*11efff7fSkettenis 		       (char *) &(gregsetp->__ip));
59*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_CFM_REGNUM,
60*11efff7fSkettenis 		       (char *) &(gregsetp->__ifs));
61*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_RSC_REGNUM,
62*11efff7fSkettenis 		       (char *) &(gregsetp->__rsc));
63*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_BSP_REGNUM,
64*11efff7fSkettenis 		       (char *) &(gregsetp->__bsp));
65*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_BSPSTORE_REGNUM,
66*11efff7fSkettenis 		       (char *) &(gregsetp->__bspstore));
67*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_RNAT_REGNUM,
68*11efff7fSkettenis 		       (char *) &(gregsetp->__rnat));
69*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_PFS_REGNUM,
70*11efff7fSkettenis 		       (char *) &(gregsetp->__pfs));
71*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_UNAT_REGNUM,
72*11efff7fSkettenis 		       (char *) &(gregsetp->__unat));
73*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_PR_REGNUM,
74*11efff7fSkettenis 		       (char *) &(gregsetp->__preds));
75*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_CCV_REGNUM,
76*11efff7fSkettenis 		       (char *) &(gregsetp->__ccv));
77*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_LC_REGNUM,
78*11efff7fSkettenis 		       (char *) &(gregsetp->__lc));
79*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_EC_REGNUM,
80*11efff7fSkettenis 		       (char *) &(gregsetp->__ec));
81b725ae77Skettenis   /* FIXME: __nats */
82*11efff7fSkettenis   regcache_raw_supply (current_regcache, IA64_FPSR_REGNUM,
83*11efff7fSkettenis 		       (char *) &(gregsetp->__fpsr));
84b725ae77Skettenis 
85b725ae77Skettenis   /* These (for the most part) are pseudo registers and are obtained
86b725ae77Skettenis      by other means.  Those that aren't are already handled by the
87b725ae77Skettenis      code above.  */
88b725ae77Skettenis   for (regi = IA64_GR32_REGNUM; regi <= IA64_GR127_REGNUM; regi++)
89b725ae77Skettenis     deprecated_register_valid[regi] = 1;
90b725ae77Skettenis   for (regi = IA64_PR0_REGNUM; regi <= IA64_PR63_REGNUM; regi++)
91b725ae77Skettenis     deprecated_register_valid[regi] = 1;
92b725ae77Skettenis   for (regi = IA64_VFP_REGNUM; regi <= NUM_REGS; regi++)
93b725ae77Skettenis     deprecated_register_valid[regi] = 1;
94b725ae77Skettenis }
95b725ae77Skettenis 
96b725ae77Skettenis void
fill_gregset(prgregset_t * gregsetp,int regno)97b725ae77Skettenis fill_gregset (prgregset_t *gregsetp, int regno)
98b725ae77Skettenis {
99b725ae77Skettenis   int regi;
100b725ae77Skettenis 
101b725ae77Skettenis #define COPY_REG(_fld_,_regi_) \
102b725ae77Skettenis   if ((regno == -1) || regno == _regi_) \
103b725ae77Skettenis     memcpy (&(gregsetp->_fld_), &deprecated_registers[DEPRECATED_REGISTER_BYTE (_regi_)], \
104*11efff7fSkettenis 	    register_size (current_gdbarch, _regi_))
105b725ae77Skettenis 
106b725ae77Skettenis   for (regi = IA64_GR0_REGNUM; regi <= IA64_GR31_REGNUM; regi++)
107b725ae77Skettenis     {
108b725ae77Skettenis       COPY_REG (__gpr[regi - IA64_GR0_REGNUM], regi);
109b725ae77Skettenis     }
110b725ae77Skettenis 
111b725ae77Skettenis   for (regi = IA64_BR0_REGNUM; regi <= IA64_BR7_REGNUM; regi++)
112b725ae77Skettenis     {
113b725ae77Skettenis       COPY_REG (__br[regi - IA64_BR0_REGNUM], regi);
114b725ae77Skettenis     }
115b725ae77Skettenis   COPY_REG (__psr, IA64_PSR_REGNUM);
116b725ae77Skettenis   COPY_REG (__ip, IA64_IP_REGNUM);
117b725ae77Skettenis   COPY_REG (__ifs, IA64_CFM_REGNUM);
118b725ae77Skettenis   COPY_REG (__rsc, IA64_RSC_REGNUM);
119b725ae77Skettenis   COPY_REG (__bsp, IA64_BSP_REGNUM);
120b725ae77Skettenis 
121b725ae77Skettenis   /* Bad things happen if we don't update both bsp and bspstore at the
122b725ae77Skettenis      same time.  */
123b725ae77Skettenis   if (regno == IA64_BSP_REGNUM || regno == -1)
124b725ae77Skettenis     {
125b725ae77Skettenis       memcpy (&(gregsetp->__bspstore),
126b725ae77Skettenis 	      &deprecated_registers[DEPRECATED_REGISTER_BYTE (IA64_BSP_REGNUM)],
127*11efff7fSkettenis 	      register_size (current_gdbarch, IA64_BSP_REGNUM));
128b725ae77Skettenis       memcpy (&deprecated_registers[DEPRECATED_REGISTER_BYTE (IA64_BSPSTORE_REGNUM)],
129b725ae77Skettenis 	      &deprecated_registers[DEPRECATED_REGISTER_BYTE (IA64_BSP_REGNUM)],
130*11efff7fSkettenis 	      register_size (current_gdbarch, IA64_BSP_REGNUM));
131b725ae77Skettenis     }
132b725ae77Skettenis 
133b725ae77Skettenis #if 0
134b725ae77Skettenis   /* We never actually write to bspstore, or we'd have to do the same thing
135b725ae77Skettenis      here too.  */
136b725ae77Skettenis   COPY_REG (__bspstore, IA64_BSPSTORE_REGNUM);
137b725ae77Skettenis #endif
138b725ae77Skettenis   COPY_REG (__rnat, IA64_RNAT_REGNUM);
139b725ae77Skettenis   COPY_REG (__pfs, IA64_PFS_REGNUM);
140b725ae77Skettenis   COPY_REG (__unat, IA64_UNAT_REGNUM);
141b725ae77Skettenis   COPY_REG (__preds, IA64_PR_REGNUM);
142b725ae77Skettenis   COPY_REG (__ccv, IA64_CCV_REGNUM);
143b725ae77Skettenis   COPY_REG (__lc, IA64_LC_REGNUM);
144b725ae77Skettenis   COPY_REG (__ec, IA64_EC_REGNUM);
145b725ae77Skettenis   /* FIXME: __nats */
146b725ae77Skettenis   COPY_REG (__fpsr, IA64_FPSR_REGNUM);
147b725ae77Skettenis #undef COPY_REG
148b725ae77Skettenis }
149b725ae77Skettenis 
150b725ae77Skettenis void
supply_fpregset(prfpregset_t * fpregsetp)151b725ae77Skettenis supply_fpregset (prfpregset_t *fpregsetp)
152b725ae77Skettenis {
153b725ae77Skettenis   int regi;
154b725ae77Skettenis 
155b725ae77Skettenis   for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++)
156*11efff7fSkettenis     regcache_raw_supply (current_regcache, regi,
157b725ae77Skettenis                      (char *) &(fpregsetp->__fpr[regi - IA64_FR0_REGNUM]));
158b725ae77Skettenis }
159b725ae77Skettenis 
160b725ae77Skettenis void
fill_fpregset(prfpregset_t * fpregsetp,int regno)161b725ae77Skettenis fill_fpregset (prfpregset_t *fpregsetp, int regno)
162b725ae77Skettenis {
163b725ae77Skettenis   int regi;
164b725ae77Skettenis   char *to;
165b725ae77Skettenis   char *from;
166b725ae77Skettenis 
167b725ae77Skettenis   for (regi = IA64_FR0_REGNUM; regi <= IA64_FR127_REGNUM; regi++)
168b725ae77Skettenis     {
169b725ae77Skettenis       if ((regno == -1) || (regno == regi))
170b725ae77Skettenis 	{
171b725ae77Skettenis 	  from = (char *) &deprecated_registers[DEPRECATED_REGISTER_BYTE (regi)];
172b725ae77Skettenis 	  to = (char *) &(fpregsetp->__fpr[regi - IA64_FR0_REGNUM]);
173*11efff7fSkettenis 	  memcpy (to, from, register_size (current_gdbarch, regi));
174b725ae77Skettenis 	}
175b725ae77Skettenis     }
176b725ae77Skettenis }
177