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