xref: /openbsd-src/gnu/usr.bin/binutils/gdb/ppc-linux-nat.c (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis /* PPC GNU/Linux native support.
2b725ae77Skettenis 
3b725ae77Skettenis    Copyright 1988, 1989, 1991, 1992, 1994, 1996, 2000, 2001, 2002,
4b725ae77Skettenis    2003 Free Software Foundation, Inc.
5b725ae77Skettenis 
6b725ae77Skettenis    This file is part of GDB.
7b725ae77Skettenis 
8b725ae77Skettenis    This program is free software; you can redistribute it and/or modify
9b725ae77Skettenis    it under the terms of the GNU General Public License as published by
10b725ae77Skettenis    the Free Software Foundation; either version 2 of the License, or
11b725ae77Skettenis    (at your option) any later version.
12b725ae77Skettenis 
13b725ae77Skettenis    This program is distributed in the hope that it will be useful,
14b725ae77Skettenis    but WITHOUT ANY WARRANTY; without even the implied warranty of
15b725ae77Skettenis    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16b725ae77Skettenis    GNU General Public License for more details.
17b725ae77Skettenis 
18b725ae77Skettenis    You should have received a copy of the GNU General Public License
19b725ae77Skettenis    along with this program; if not, write to the Free Software
20b725ae77Skettenis    Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis    Boston, MA 02111-1307, USA.  */
22b725ae77Skettenis 
23b725ae77Skettenis #include "defs.h"
24b725ae77Skettenis #include "gdb_string.h"
25b725ae77Skettenis #include "frame.h"
26b725ae77Skettenis #include "inferior.h"
27b725ae77Skettenis #include "gdbcore.h"
28b725ae77Skettenis #include "regcache.h"
29*11efff7fSkettenis #include "gdb_assert.h"
30b725ae77Skettenis 
31b725ae77Skettenis #include <sys/types.h>
32b725ae77Skettenis #include <sys/param.h>
33b725ae77Skettenis #include <signal.h>
34b725ae77Skettenis #include <sys/user.h>
35b725ae77Skettenis #include <sys/ioctl.h>
36b725ae77Skettenis #include "gdb_wait.h"
37b725ae77Skettenis #include <fcntl.h>
38b725ae77Skettenis #include <sys/procfs.h>
39b725ae77Skettenis #include <sys/ptrace.h>
40b725ae77Skettenis 
41b725ae77Skettenis /* Prototypes for supply_gregset etc. */
42b725ae77Skettenis #include "gregset.h"
43b725ae77Skettenis #include "ppc-tdep.h"
44b725ae77Skettenis 
45b725ae77Skettenis #ifndef PT_READ_U
46b725ae77Skettenis #define PT_READ_U PTRACE_PEEKUSR
47b725ae77Skettenis #endif
48b725ae77Skettenis #ifndef PT_WRITE_U
49b725ae77Skettenis #define PT_WRITE_U PTRACE_POKEUSR
50b725ae77Skettenis #endif
51b725ae77Skettenis 
52b725ae77Skettenis /* Default the type of the ptrace transfer to int.  */
53b725ae77Skettenis #ifndef PTRACE_XFER_TYPE
54b725ae77Skettenis #define PTRACE_XFER_TYPE int
55b725ae77Skettenis #endif
56b725ae77Skettenis 
57b725ae77Skettenis /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a
58b725ae77Skettenis    configure time check.  Some older glibc's (for instance 2.2.1)
59b725ae77Skettenis    don't have a specific powerpc version of ptrace.h, and fall back on
60b725ae77Skettenis    a generic one.  In such cases, sys/ptrace.h defines
61b725ae77Skettenis    PTRACE_GETFPXREGS and PTRACE_SETFPXREGS to the same numbers that
62b725ae77Skettenis    ppc kernel's asm/ptrace.h defines PTRACE_GETVRREGS and
63b725ae77Skettenis    PTRACE_SETVRREGS to be.  This also makes a configury check pretty
64b725ae77Skettenis    much useless.  */
65b725ae77Skettenis 
66b725ae77Skettenis /* These definitions should really come from the glibc header files,
67b725ae77Skettenis    but Glibc doesn't know about the vrregs yet.  */
68b725ae77Skettenis #ifndef PTRACE_GETVRREGS
69b725ae77Skettenis #define PTRACE_GETVRREGS 18
70b725ae77Skettenis #define PTRACE_SETVRREGS 19
71b725ae77Skettenis #endif
72b725ae77Skettenis 
73*11efff7fSkettenis 
74*11efff7fSkettenis /* Similarly for the ptrace requests for getting / setting the SPE
75*11efff7fSkettenis    registers (ev0 -- ev31, acc, and spefscr).  See the description of
76*11efff7fSkettenis    gdb_evrregset_t for details.  */
77*11efff7fSkettenis #ifndef PTRACE_GETEVRREGS
78*11efff7fSkettenis #define PTRACE_GETEVRREGS 20
79*11efff7fSkettenis #define PTRACE_SETEVRREGS 21
80*11efff7fSkettenis #endif
81*11efff7fSkettenis 
82*11efff7fSkettenis 
83b725ae77Skettenis /* This oddity is because the Linux kernel defines elf_vrregset_t as
84b725ae77Skettenis    an array of 33 16 bytes long elements.  I.e. it leaves out vrsave.
85b725ae77Skettenis    However the PTRACE_GETVRREGS and PTRACE_SETVRREGS requests return
86b725ae77Skettenis    the vrsave as an extra 4 bytes at the end.  I opted for creating a
87b725ae77Skettenis    flat array of chars, so that it is easier to manipulate for gdb.
88b725ae77Skettenis 
89b725ae77Skettenis    There are 32 vector registers 16 bytes longs, plus a VSCR register
90b725ae77Skettenis    which is only 4 bytes long, but is fetched as a 16 bytes
91b725ae77Skettenis    quantity. Up to here we have the elf_vrregset_t structure.
92b725ae77Skettenis    Appended to this there is space for the VRSAVE register: 4 bytes.
93b725ae77Skettenis    Even though this vrsave register is not included in the regset
94b725ae77Skettenis    typedef, it is handled by the ptrace requests.
95b725ae77Skettenis 
96b725ae77Skettenis    Note that GNU/Linux doesn't support little endian PPC hardware,
97b725ae77Skettenis    therefore the offset at which the real value of the VSCR register
98b725ae77Skettenis    is located will be always 12 bytes.
99b725ae77Skettenis 
100b725ae77Skettenis    The layout is like this (where x is the actual value of the vscr reg): */
101b725ae77Skettenis 
102b725ae77Skettenis /* *INDENT-OFF* */
103b725ae77Skettenis /*
104b725ae77Skettenis    |.|.|.|.|.....|.|.|.|.||.|.|.|x||.|
105b725ae77Skettenis    <------->     <-------><-------><->
106b725ae77Skettenis      VR0           VR31     VSCR    VRSAVE
107b725ae77Skettenis */
108b725ae77Skettenis /* *INDENT-ON* */
109b725ae77Skettenis 
110b725ae77Skettenis #define SIZEOF_VRREGS 33*16+4
111b725ae77Skettenis 
112b725ae77Skettenis typedef char gdb_vrregset_t[SIZEOF_VRREGS];
113b725ae77Skettenis 
114*11efff7fSkettenis 
115*11efff7fSkettenis /* On PPC processors that support the the Signal Processing Extension
116*11efff7fSkettenis    (SPE) APU, the general-purpose registers are 64 bits long.
117*11efff7fSkettenis    However, the ordinary Linux kernel PTRACE_PEEKUSR / PTRACE_POKEUSR
118*11efff7fSkettenis    / PT_READ_U / PT_WRITE_U ptrace calls only access the lower half of
119*11efff7fSkettenis    each register, to allow them to behave the same way they do on
120*11efff7fSkettenis    non-SPE systems.  There's a separate pair of calls,
121*11efff7fSkettenis    PTRACE_GETEVRREGS / PTRACE_SETEVRREGS, that read and write the top
122*11efff7fSkettenis    halves of all the general-purpose registers at once, along with
123*11efff7fSkettenis    some SPE-specific registers.
124*11efff7fSkettenis 
125*11efff7fSkettenis    GDB itself continues to claim the general-purpose registers are 32
126*11efff7fSkettenis    bits long.  It has unnamed raw registers that hold the upper halves
127*11efff7fSkettenis    of the gprs, and the the full 64-bit SIMD views of the registers,
128*11efff7fSkettenis    'ev0' -- 'ev31', are pseudo-registers that splice the top and
129*11efff7fSkettenis    bottom halves together.
130*11efff7fSkettenis 
131*11efff7fSkettenis    This is the structure filled in by PTRACE_GETEVRREGS and written to
132*11efff7fSkettenis    the inferior's registers by PTRACE_SETEVRREGS.  */
133*11efff7fSkettenis struct gdb_evrregset_t
134*11efff7fSkettenis {
135*11efff7fSkettenis   unsigned long evr[32];
136*11efff7fSkettenis   unsigned long long acc;
137*11efff7fSkettenis   unsigned long spefscr;
138*11efff7fSkettenis };
139*11efff7fSkettenis 
140*11efff7fSkettenis 
141*11efff7fSkettenis /* Non-zero if our kernel may support the PTRACE_GETVRREGS and
142*11efff7fSkettenis    PTRACE_SETVRREGS requests, for reading and writing the Altivec
143*11efff7fSkettenis    registers.  Zero if we've tried one of them and gotten an
144*11efff7fSkettenis    error.  */
145b725ae77Skettenis int have_ptrace_getvrregs = 1;
146b725ae77Skettenis 
147*11efff7fSkettenis 
148*11efff7fSkettenis /* Non-zero if our kernel may support the PTRACE_GETEVRREGS and
149*11efff7fSkettenis    PTRACE_SETEVRREGS requests, for reading and writing the SPE
150*11efff7fSkettenis    registers.  Zero if we've tried one of them and gotten an
151*11efff7fSkettenis    error.  */
152*11efff7fSkettenis int have_ptrace_getsetevrregs = 1;
153*11efff7fSkettenis 
154*11efff7fSkettenis 
155b725ae77Skettenis int
kernel_u_size(void)156b725ae77Skettenis kernel_u_size (void)
157b725ae77Skettenis {
158b725ae77Skettenis   return (sizeof (struct user));
159b725ae77Skettenis }
160b725ae77Skettenis 
161b725ae77Skettenis /* *INDENT-OFF* */
162b725ae77Skettenis /* registers layout, as presented by the ptrace interface:
163b725ae77Skettenis PT_R0, PT_R1, PT_R2, PT_R3, PT_R4, PT_R5, PT_R6, PT_R7,
164b725ae77Skettenis PT_R8, PT_R9, PT_R10, PT_R11, PT_R12, PT_R13, PT_R14, PT_R15,
165b725ae77Skettenis PT_R16, PT_R17, PT_R18, PT_R19, PT_R20, PT_R21, PT_R22, PT_R23,
166b725ae77Skettenis PT_R24, PT_R25, PT_R26, PT_R27, PT_R28, PT_R29, PT_R30, PT_R31,
167b725ae77Skettenis PT_FPR0, PT_FPR0 + 2, PT_FPR0 + 4, PT_FPR0 + 6, PT_FPR0 + 8, PT_FPR0 + 10, PT_FPR0 + 12, PT_FPR0 + 14,
168b725ae77Skettenis PT_FPR0 + 16, PT_FPR0 + 18, PT_FPR0 + 20, PT_FPR0 + 22, PT_FPR0 + 24, PT_FPR0 + 26, PT_FPR0 + 28, PT_FPR0 + 30,
169b725ae77Skettenis PT_FPR0 + 32, PT_FPR0 + 34, PT_FPR0 + 36, PT_FPR0 + 38, PT_FPR0 + 40, PT_FPR0 + 42, PT_FPR0 + 44, PT_FPR0 + 46,
170b725ae77Skettenis PT_FPR0 + 48, PT_FPR0 + 50, PT_FPR0 + 52, PT_FPR0 + 54, PT_FPR0 + 56, PT_FPR0 + 58, PT_FPR0 + 60, PT_FPR0 + 62,
171b725ae77Skettenis PT_NIP, PT_MSR, PT_CCR, PT_LNK, PT_CTR, PT_XER, PT_MQ */
172b725ae77Skettenis /* *INDENT_ON * */
173b725ae77Skettenis 
174b725ae77Skettenis static int
ppc_register_u_addr(int regno)175b725ae77Skettenis ppc_register_u_addr (int regno)
176b725ae77Skettenis {
177b725ae77Skettenis   int u_addr = -1;
178b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
179b725ae77Skettenis   /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace
180b725ae77Skettenis      interface, and not the wordsize of the program's ABI.  */
181b725ae77Skettenis   int wordsize = sizeof (PTRACE_XFER_TYPE);
182b725ae77Skettenis 
183b725ae77Skettenis   /* General purpose registers occupy 1 slot each in the buffer */
184*11efff7fSkettenis   if (regno >= tdep->ppc_gp0_regnum
185*11efff7fSkettenis       && regno < tdep->ppc_gp0_regnum + ppc_num_gprs)
186*11efff7fSkettenis     u_addr = ((regno - tdep->ppc_gp0_regnum + PT_R0) * wordsize);
187b725ae77Skettenis 
188b725ae77Skettenis   /* Floating point regs: eight bytes each in both 32- and 64-bit
189b725ae77Skettenis      ptrace interfaces.  Thus, two slots each in 32-bit interface, one
190b725ae77Skettenis      slot each in 64-bit interface.  */
191*11efff7fSkettenis   if (tdep->ppc_fp0_regnum >= 0
192*11efff7fSkettenis       && regno >= tdep->ppc_fp0_regnum
193*11efff7fSkettenis       && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)
194*11efff7fSkettenis     u_addr = (PT_FPR0 * wordsize) + ((regno - tdep->ppc_fp0_regnum) * 8);
195b725ae77Skettenis 
196b725ae77Skettenis   /* UISA special purpose registers: 1 slot each */
197b725ae77Skettenis   if (regno == PC_REGNUM)
198b725ae77Skettenis     u_addr = PT_NIP * wordsize;
199b725ae77Skettenis   if (regno == tdep->ppc_lr_regnum)
200b725ae77Skettenis     u_addr = PT_LNK * wordsize;
201b725ae77Skettenis   if (regno == tdep->ppc_cr_regnum)
202b725ae77Skettenis     u_addr = PT_CCR * wordsize;
203b725ae77Skettenis   if (regno == tdep->ppc_xer_regnum)
204b725ae77Skettenis     u_addr = PT_XER * wordsize;
205b725ae77Skettenis   if (regno == tdep->ppc_ctr_regnum)
206b725ae77Skettenis     u_addr = PT_CTR * wordsize;
207b725ae77Skettenis #ifdef PT_MQ
208b725ae77Skettenis   if (regno == tdep->ppc_mq_regnum)
209b725ae77Skettenis     u_addr = PT_MQ * wordsize;
210b725ae77Skettenis #endif
211b725ae77Skettenis   if (regno == tdep->ppc_ps_regnum)
212b725ae77Skettenis     u_addr = PT_MSR * wordsize;
213*11efff7fSkettenis   if (tdep->ppc_fpscr_regnum >= 0
214*11efff7fSkettenis       && regno == tdep->ppc_fpscr_regnum)
215b725ae77Skettenis     u_addr = PT_FPSCR * wordsize;
216b725ae77Skettenis 
217b725ae77Skettenis   return u_addr;
218b725ae77Skettenis }
219b725ae77Skettenis 
220b725ae77Skettenis /* The Linux kernel ptrace interface for AltiVec registers uses the
221b725ae77Skettenis    registers set mechanism, as opposed to the interface for all the
222b725ae77Skettenis    other registers, that stores/fetches each register individually.  */
223b725ae77Skettenis static void
fetch_altivec_register(int tid,int regno)224b725ae77Skettenis fetch_altivec_register (int tid, int regno)
225b725ae77Skettenis {
226b725ae77Skettenis   int ret;
227b725ae77Skettenis   int offset = 0;
228b725ae77Skettenis   gdb_vrregset_t regs;
229b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
230*11efff7fSkettenis   int vrregsize = register_size (current_gdbarch, tdep->ppc_vr0_regnum);
231b725ae77Skettenis 
232b725ae77Skettenis   ret = ptrace (PTRACE_GETVRREGS, tid, 0, &regs);
233b725ae77Skettenis   if (ret < 0)
234b725ae77Skettenis     {
235b725ae77Skettenis       if (errno == EIO)
236b725ae77Skettenis         {
237b725ae77Skettenis           have_ptrace_getvrregs = 0;
238b725ae77Skettenis           return;
239b725ae77Skettenis         }
240b725ae77Skettenis       perror_with_name ("Unable to fetch AltiVec register");
241b725ae77Skettenis     }
242b725ae77Skettenis 
243b725ae77Skettenis   /* VSCR is fetched as a 16 bytes quantity, but it is really 4 bytes
244b725ae77Skettenis      long on the hardware.  We deal only with the lower 4 bytes of the
245b725ae77Skettenis      vector.  VRSAVE is at the end of the array in a 4 bytes slot, so
246b725ae77Skettenis      there is no need to define an offset for it.  */
247b725ae77Skettenis   if (regno == (tdep->ppc_vrsave_regnum - 1))
248*11efff7fSkettenis     offset = vrregsize - register_size (current_gdbarch, tdep->ppc_vrsave_regnum);
249b725ae77Skettenis 
250*11efff7fSkettenis   regcache_raw_supply (current_regcache, regno,
251b725ae77Skettenis 		       regs + (regno - tdep->ppc_vr0_regnum) * vrregsize + offset);
252b725ae77Skettenis }
253b725ae77Skettenis 
254*11efff7fSkettenis /* Fetch the top 32 bits of TID's general-purpose registers and the
255*11efff7fSkettenis    SPE-specific registers, and place the results in EVRREGSET.  If we
256*11efff7fSkettenis    don't support PTRACE_GETEVRREGS, then just fill EVRREGSET with
257*11efff7fSkettenis    zeros.
258*11efff7fSkettenis 
259*11efff7fSkettenis    All the logic to deal with whether or not the PTRACE_GETEVRREGS and
260*11efff7fSkettenis    PTRACE_SETEVRREGS requests are supported is isolated here, and in
261*11efff7fSkettenis    set_spe_registers.  */
262*11efff7fSkettenis static void
get_spe_registers(int tid,struct gdb_evrregset_t * evrregset)263*11efff7fSkettenis get_spe_registers (int tid, struct gdb_evrregset_t *evrregset)
264*11efff7fSkettenis {
265*11efff7fSkettenis   if (have_ptrace_getsetevrregs)
266*11efff7fSkettenis     {
267*11efff7fSkettenis       if (ptrace (PTRACE_GETEVRREGS, tid, 0, evrregset) >= 0)
268*11efff7fSkettenis         return;
269*11efff7fSkettenis       else
270*11efff7fSkettenis         {
271*11efff7fSkettenis           /* EIO means that the PTRACE_GETEVRREGS request isn't supported;
272*11efff7fSkettenis              we just return zeros.  */
273*11efff7fSkettenis           if (errno == EIO)
274*11efff7fSkettenis             have_ptrace_getsetevrregs = 0;
275*11efff7fSkettenis           else
276*11efff7fSkettenis             /* Anything else needs to be reported.  */
277*11efff7fSkettenis             perror_with_name ("Unable to fetch SPE registers");
278*11efff7fSkettenis         }
279*11efff7fSkettenis     }
280*11efff7fSkettenis 
281*11efff7fSkettenis   memset (evrregset, 0, sizeof (*evrregset));
282*11efff7fSkettenis }
283*11efff7fSkettenis 
284*11efff7fSkettenis /* Supply values from TID for SPE-specific raw registers: the upper
285*11efff7fSkettenis    halves of the GPRs, the accumulator, and the spefscr.  REGNO must
286*11efff7fSkettenis    be the number of an upper half register, acc, spefscr, or -1 to
287*11efff7fSkettenis    supply the values of all registers.  */
288*11efff7fSkettenis static void
fetch_spe_register(int tid,int regno)289*11efff7fSkettenis fetch_spe_register (int tid, int regno)
290*11efff7fSkettenis {
291*11efff7fSkettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
292*11efff7fSkettenis   struct gdb_evrregset_t evrregs;
293*11efff7fSkettenis 
294*11efff7fSkettenis   gdb_assert (sizeof (evrregs.evr[0])
295*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_ev0_upper_regnum));
296*11efff7fSkettenis   gdb_assert (sizeof (evrregs.acc)
297*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_acc_regnum));
298*11efff7fSkettenis   gdb_assert (sizeof (evrregs.spefscr)
299*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_spefscr_regnum));
300*11efff7fSkettenis 
301*11efff7fSkettenis   get_spe_registers (tid, &evrregs);
302*11efff7fSkettenis 
303*11efff7fSkettenis   if (regno == -1)
304*11efff7fSkettenis     {
305*11efff7fSkettenis       int i;
306*11efff7fSkettenis 
307*11efff7fSkettenis       for (i = 0; i < ppc_num_gprs; i++)
308*11efff7fSkettenis         regcache_raw_supply (current_regcache, tdep->ppc_ev0_upper_regnum + i,
309*11efff7fSkettenis                              &evrregs.evr[i]);
310*11efff7fSkettenis     }
311*11efff7fSkettenis   else if (tdep->ppc_ev0_upper_regnum <= regno
312*11efff7fSkettenis            && regno < tdep->ppc_ev0_upper_regnum + ppc_num_gprs)
313*11efff7fSkettenis     regcache_raw_supply (current_regcache, regno,
314*11efff7fSkettenis                          &evrregs.evr[regno - tdep->ppc_ev0_upper_regnum]);
315*11efff7fSkettenis 
316*11efff7fSkettenis   if (regno == -1
317*11efff7fSkettenis       || regno == tdep->ppc_acc_regnum)
318*11efff7fSkettenis     regcache_raw_supply (current_regcache, tdep->ppc_acc_regnum, &evrregs.acc);
319*11efff7fSkettenis 
320*11efff7fSkettenis   if (regno == -1
321*11efff7fSkettenis       || regno == tdep->ppc_spefscr_regnum)
322*11efff7fSkettenis     regcache_raw_supply (current_regcache, tdep->ppc_spefscr_regnum,
323*11efff7fSkettenis                          &evrregs.spefscr);
324*11efff7fSkettenis }
325*11efff7fSkettenis 
326b725ae77Skettenis static void
fetch_register(int tid,int regno)327b725ae77Skettenis fetch_register (int tid, int regno)
328b725ae77Skettenis {
329*11efff7fSkettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
330b725ae77Skettenis   /* This isn't really an address.  But ptrace thinks of it as one.  */
331*11efff7fSkettenis   CORE_ADDR regaddr = ppc_register_u_addr (regno);
332*11efff7fSkettenis   int bytes_transferred;
333b725ae77Skettenis   unsigned int offset;         /* Offset of registers within the u area. */
334b725ae77Skettenis   char buf[MAX_REGISTER_SIZE];
335b725ae77Skettenis 
336b725ae77Skettenis   if (altivec_register_p (regno))
337b725ae77Skettenis     {
338b725ae77Skettenis       /* If this is the first time through, or if it is not the first
339b725ae77Skettenis          time through, and we have comfirmed that there is kernel
340b725ae77Skettenis          support for such a ptrace request, then go and fetch the
341b725ae77Skettenis          register.  */
342b725ae77Skettenis       if (have_ptrace_getvrregs)
343b725ae77Skettenis        {
344b725ae77Skettenis          fetch_altivec_register (tid, regno);
345b725ae77Skettenis          return;
346b725ae77Skettenis        }
347b725ae77Skettenis      /* If we have discovered that there is no ptrace support for
348b725ae77Skettenis         AltiVec registers, fall through and return zeroes, because
349b725ae77Skettenis         regaddr will be -1 in this case.  */
350b725ae77Skettenis     }
351*11efff7fSkettenis   else if (spe_register_p (regno))
352*11efff7fSkettenis     {
353*11efff7fSkettenis       fetch_spe_register (tid, regno);
354*11efff7fSkettenis       return;
355*11efff7fSkettenis     }
356b725ae77Skettenis 
357b725ae77Skettenis   if (regaddr == -1)
358b725ae77Skettenis     {
359*11efff7fSkettenis       memset (buf, '\0', register_size (current_gdbarch, regno));   /* Supply zeroes */
360*11efff7fSkettenis       regcache_raw_supply (current_regcache, regno, buf);
361b725ae77Skettenis       return;
362b725ae77Skettenis     }
363b725ae77Skettenis 
364b725ae77Skettenis   /* Read the raw register using PTRACE_XFER_TYPE sized chunks.  On a
365b725ae77Skettenis      32-bit platform, 64-bit floating-point registers will require two
366b725ae77Skettenis      transfers.  */
367*11efff7fSkettenis   for (bytes_transferred = 0;
368*11efff7fSkettenis        bytes_transferred < register_size (current_gdbarch, regno);
369*11efff7fSkettenis        bytes_transferred += sizeof (PTRACE_XFER_TYPE))
370b725ae77Skettenis     {
371b725ae77Skettenis       errno = 0;
372*11efff7fSkettenis       *(PTRACE_XFER_TYPE *) & buf[bytes_transferred]
373*11efff7fSkettenis         = ptrace (PT_READ_U, tid, (PTRACE_ARG3_TYPE) regaddr, 0);
374b725ae77Skettenis       regaddr += sizeof (PTRACE_XFER_TYPE);
375b725ae77Skettenis       if (errno != 0)
376b725ae77Skettenis 	{
377*11efff7fSkettenis           char message[128];
378*11efff7fSkettenis 	  sprintf (message, "reading register %s (#%d)",
379b725ae77Skettenis 		   REGISTER_NAME (regno), regno);
380*11efff7fSkettenis 	  perror_with_name (message);
381b725ae77Skettenis 	}
382b725ae77Skettenis     }
383b725ae77Skettenis 
384*11efff7fSkettenis   /* Now supply the register.  Keep in mind that the regcache's idea
385*11efff7fSkettenis      of the register's size may not be a multiple of sizeof
386*11efff7fSkettenis      (PTRACE_XFER_TYPE).  */
387*11efff7fSkettenis   if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_LITTLE)
388*11efff7fSkettenis     {
389*11efff7fSkettenis       /* Little-endian values are always found at the left end of the
390*11efff7fSkettenis          bytes transferred.  */
391b725ae77Skettenis       regcache_raw_supply (current_regcache, regno, buf);
392*11efff7fSkettenis     }
393*11efff7fSkettenis   else if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_BIG)
394*11efff7fSkettenis     {
395*11efff7fSkettenis       /* Big-endian values are found at the right end of the bytes
396*11efff7fSkettenis          transferred.  */
397*11efff7fSkettenis       size_t padding = (bytes_transferred
398*11efff7fSkettenis                         - register_size (current_gdbarch, regno));
399*11efff7fSkettenis       regcache_raw_supply (current_regcache, regno, buf + padding);
400*11efff7fSkettenis     }
401b725ae77Skettenis   else
402*11efff7fSkettenis     internal_error (__FILE__, __LINE__,
403*11efff7fSkettenis                     "fetch_register: unexpected byte order: %d",
404*11efff7fSkettenis                     gdbarch_byte_order (current_gdbarch));
405b725ae77Skettenis }
406b725ae77Skettenis 
407b725ae77Skettenis static void
supply_vrregset(gdb_vrregset_t * vrregsetp)408b725ae77Skettenis supply_vrregset (gdb_vrregset_t *vrregsetp)
409b725ae77Skettenis {
410b725ae77Skettenis   int i;
411b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
412b725ae77Skettenis   int num_of_vrregs = tdep->ppc_vrsave_regnum - tdep->ppc_vr0_regnum + 1;
413*11efff7fSkettenis   int vrregsize = register_size (current_gdbarch, tdep->ppc_vr0_regnum);
414*11efff7fSkettenis   int offset = vrregsize - register_size (current_gdbarch, tdep->ppc_vrsave_regnum);
415b725ae77Skettenis 
416b725ae77Skettenis   for (i = 0; i < num_of_vrregs; i++)
417b725ae77Skettenis     {
418b725ae77Skettenis       /* The last 2 registers of this set are only 32 bit long, not
419b725ae77Skettenis          128.  However an offset is necessary only for VSCR because it
420b725ae77Skettenis          occupies a whole vector, while VRSAVE occupies a full 4 bytes
421b725ae77Skettenis          slot.  */
422b725ae77Skettenis       if (i == (num_of_vrregs - 2))
423*11efff7fSkettenis         regcache_raw_supply (current_regcache, tdep->ppc_vr0_regnum + i,
424b725ae77Skettenis 			     *vrregsetp + i * vrregsize + offset);
425b725ae77Skettenis       else
426*11efff7fSkettenis         regcache_raw_supply (current_regcache, tdep->ppc_vr0_regnum + i,
427*11efff7fSkettenis 			     *vrregsetp + i * vrregsize);
428b725ae77Skettenis     }
429b725ae77Skettenis }
430b725ae77Skettenis 
431b725ae77Skettenis static void
fetch_altivec_registers(int tid)432b725ae77Skettenis fetch_altivec_registers (int tid)
433b725ae77Skettenis {
434b725ae77Skettenis   int ret;
435b725ae77Skettenis   gdb_vrregset_t regs;
436b725ae77Skettenis 
437b725ae77Skettenis   ret = ptrace (PTRACE_GETVRREGS, tid, 0, &regs);
438b725ae77Skettenis   if (ret < 0)
439b725ae77Skettenis     {
440b725ae77Skettenis       if (errno == EIO)
441b725ae77Skettenis 	{
442b725ae77Skettenis           have_ptrace_getvrregs = 0;
443b725ae77Skettenis 	  return;
444b725ae77Skettenis 	}
445b725ae77Skettenis       perror_with_name ("Unable to fetch AltiVec registers");
446b725ae77Skettenis     }
447b725ae77Skettenis   supply_vrregset (&regs);
448b725ae77Skettenis }
449b725ae77Skettenis 
450b725ae77Skettenis static void
fetch_ppc_registers(int tid)451b725ae77Skettenis fetch_ppc_registers (int tid)
452b725ae77Skettenis {
453b725ae77Skettenis   int i;
454b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
455b725ae77Skettenis 
456*11efff7fSkettenis   for (i = 0; i < ppc_num_gprs; i++)
457*11efff7fSkettenis     fetch_register (tid, tdep->ppc_gp0_regnum + i);
458*11efff7fSkettenis   if (tdep->ppc_fp0_regnum >= 0)
459*11efff7fSkettenis     for (i = 0; i < ppc_num_fprs; i++)
460*11efff7fSkettenis       fetch_register (tid, tdep->ppc_fp0_regnum + i);
461*11efff7fSkettenis   fetch_register (tid, PC_REGNUM);
462*11efff7fSkettenis   if (tdep->ppc_ps_regnum != -1)
463*11efff7fSkettenis     fetch_register (tid, tdep->ppc_ps_regnum);
464*11efff7fSkettenis   if (tdep->ppc_cr_regnum != -1)
465*11efff7fSkettenis     fetch_register (tid, tdep->ppc_cr_regnum);
466*11efff7fSkettenis   if (tdep->ppc_lr_regnum != -1)
467*11efff7fSkettenis     fetch_register (tid, tdep->ppc_lr_regnum);
468*11efff7fSkettenis   if (tdep->ppc_ctr_regnum != -1)
469*11efff7fSkettenis     fetch_register (tid, tdep->ppc_ctr_regnum);
470*11efff7fSkettenis   if (tdep->ppc_xer_regnum != -1)
471*11efff7fSkettenis     fetch_register (tid, tdep->ppc_xer_regnum);
472b725ae77Skettenis   if (tdep->ppc_mq_regnum != -1)
473b725ae77Skettenis     fetch_register (tid, tdep->ppc_mq_regnum);
474*11efff7fSkettenis   if (tdep->ppc_fpscr_regnum != -1)
475*11efff7fSkettenis     fetch_register (tid, tdep->ppc_fpscr_regnum);
476b725ae77Skettenis   if (have_ptrace_getvrregs)
477b725ae77Skettenis     if (tdep->ppc_vr0_regnum != -1 && tdep->ppc_vrsave_regnum != -1)
478b725ae77Skettenis       fetch_altivec_registers (tid);
479*11efff7fSkettenis   if (tdep->ppc_ev0_upper_regnum >= 0)
480*11efff7fSkettenis     fetch_spe_register (tid, -1);
481b725ae77Skettenis }
482b725ae77Skettenis 
483b725ae77Skettenis /* Fetch registers from the child process.  Fetch all registers if
484b725ae77Skettenis    regno == -1, otherwise fetch all general registers or all floating
485b725ae77Skettenis    point registers depending upon the value of regno.  */
486b725ae77Skettenis void
fetch_inferior_registers(int regno)487b725ae77Skettenis fetch_inferior_registers (int regno)
488b725ae77Skettenis {
489b725ae77Skettenis   /* Overload thread id onto process id */
490b725ae77Skettenis   int tid = TIDGET (inferior_ptid);
491b725ae77Skettenis 
492b725ae77Skettenis   /* No thread id, just use process id */
493b725ae77Skettenis   if (tid == 0)
494b725ae77Skettenis     tid = PIDGET (inferior_ptid);
495b725ae77Skettenis 
496b725ae77Skettenis   if (regno == -1)
497b725ae77Skettenis     fetch_ppc_registers (tid);
498b725ae77Skettenis   else
499b725ae77Skettenis     fetch_register (tid, regno);
500b725ae77Skettenis }
501b725ae77Skettenis 
502b725ae77Skettenis /* Store one register. */
503b725ae77Skettenis static void
store_altivec_register(int tid,int regno)504b725ae77Skettenis store_altivec_register (int tid, int regno)
505b725ae77Skettenis {
506b725ae77Skettenis   int ret;
507b725ae77Skettenis   int offset = 0;
508b725ae77Skettenis   gdb_vrregset_t regs;
509b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
510*11efff7fSkettenis   int vrregsize = register_size (current_gdbarch, tdep->ppc_vr0_regnum);
511b725ae77Skettenis 
512b725ae77Skettenis   ret = ptrace (PTRACE_GETVRREGS, tid, 0, &regs);
513b725ae77Skettenis   if (ret < 0)
514b725ae77Skettenis     {
515b725ae77Skettenis       if (errno == EIO)
516b725ae77Skettenis         {
517b725ae77Skettenis           have_ptrace_getvrregs = 0;
518b725ae77Skettenis           return;
519b725ae77Skettenis         }
520b725ae77Skettenis       perror_with_name ("Unable to fetch AltiVec register");
521b725ae77Skettenis     }
522b725ae77Skettenis 
523b725ae77Skettenis   /* VSCR is fetched as a 16 bytes quantity, but it is really 4 bytes
524b725ae77Skettenis      long on the hardware.  */
525b725ae77Skettenis   if (regno == (tdep->ppc_vrsave_regnum - 1))
526*11efff7fSkettenis     offset = vrregsize - register_size (current_gdbarch, tdep->ppc_vrsave_regnum);
527b725ae77Skettenis 
528*11efff7fSkettenis   regcache_raw_collect (current_regcache, regno,
529b725ae77Skettenis 			regs + (regno - tdep->ppc_vr0_regnum) * vrregsize + offset);
530b725ae77Skettenis 
531b725ae77Skettenis   ret = ptrace (PTRACE_SETVRREGS, tid, 0, &regs);
532b725ae77Skettenis   if (ret < 0)
533b725ae77Skettenis     perror_with_name ("Unable to store AltiVec register");
534b725ae77Skettenis }
535b725ae77Skettenis 
536*11efff7fSkettenis /* Assuming TID referrs to an SPE process, set the top halves of TID's
537*11efff7fSkettenis    general-purpose registers and its SPE-specific registers to the
538*11efff7fSkettenis    values in EVRREGSET.  If we don't support PTRACE_SETEVRREGS, do
539*11efff7fSkettenis    nothing.
540*11efff7fSkettenis 
541*11efff7fSkettenis    All the logic to deal with whether or not the PTRACE_GETEVRREGS and
542*11efff7fSkettenis    PTRACE_SETEVRREGS requests are supported is isolated here, and in
543*11efff7fSkettenis    get_spe_registers.  */
544*11efff7fSkettenis static void
set_spe_registers(int tid,struct gdb_evrregset_t * evrregset)545*11efff7fSkettenis set_spe_registers (int tid, struct gdb_evrregset_t *evrregset)
546*11efff7fSkettenis {
547*11efff7fSkettenis   if (have_ptrace_getsetevrregs)
548*11efff7fSkettenis     {
549*11efff7fSkettenis       if (ptrace (PTRACE_SETEVRREGS, tid, 0, evrregset) >= 0)
550*11efff7fSkettenis         return;
551*11efff7fSkettenis       else
552*11efff7fSkettenis         {
553*11efff7fSkettenis           /* EIO means that the PTRACE_SETEVRREGS request isn't
554*11efff7fSkettenis              supported; we fail silently, and don't try the call
555*11efff7fSkettenis              again.  */
556*11efff7fSkettenis           if (errno == EIO)
557*11efff7fSkettenis             have_ptrace_getsetevrregs = 0;
558*11efff7fSkettenis           else
559*11efff7fSkettenis             /* Anything else needs to be reported.  */
560*11efff7fSkettenis             perror_with_name ("Unable to set SPE registers");
561*11efff7fSkettenis         }
562*11efff7fSkettenis     }
563*11efff7fSkettenis }
564*11efff7fSkettenis 
565*11efff7fSkettenis /* Write GDB's value for the SPE-specific raw register REGNO to TID.
566*11efff7fSkettenis    If REGNO is -1, write the values of all the SPE-specific
567*11efff7fSkettenis    registers.  */
568*11efff7fSkettenis static void
store_spe_register(int tid,int regno)569*11efff7fSkettenis store_spe_register (int tid, int regno)
570*11efff7fSkettenis {
571*11efff7fSkettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
572*11efff7fSkettenis   struct gdb_evrregset_t evrregs;
573*11efff7fSkettenis 
574*11efff7fSkettenis   gdb_assert (sizeof (evrregs.evr[0])
575*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_ev0_upper_regnum));
576*11efff7fSkettenis   gdb_assert (sizeof (evrregs.acc)
577*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_acc_regnum));
578*11efff7fSkettenis   gdb_assert (sizeof (evrregs.spefscr)
579*11efff7fSkettenis               == register_size (current_gdbarch, tdep->ppc_spefscr_regnum));
580*11efff7fSkettenis 
581*11efff7fSkettenis   if (regno == -1)
582*11efff7fSkettenis     /* Since we're going to write out every register, the code below
583*11efff7fSkettenis        should store to every field of evrregs; if that doesn't happen,
584*11efff7fSkettenis        make it obvious by initializing it with suspicious values.  */
585*11efff7fSkettenis     memset (&evrregs, 42, sizeof (evrregs));
586*11efff7fSkettenis   else
587*11efff7fSkettenis     /* We can only read and write the entire EVR register set at a
588*11efff7fSkettenis        time, so to write just a single register, we do a
589*11efff7fSkettenis        read-modify-write maneuver.  */
590*11efff7fSkettenis     get_spe_registers (tid, &evrregs);
591*11efff7fSkettenis 
592*11efff7fSkettenis   if (regno == -1)
593*11efff7fSkettenis     {
594*11efff7fSkettenis       int i;
595*11efff7fSkettenis 
596*11efff7fSkettenis       for (i = 0; i < ppc_num_gprs; i++)
597*11efff7fSkettenis         regcache_raw_collect (current_regcache,
598*11efff7fSkettenis                               tdep->ppc_ev0_upper_regnum + i,
599*11efff7fSkettenis                               &evrregs.evr[i]);
600*11efff7fSkettenis     }
601*11efff7fSkettenis   else if (tdep->ppc_ev0_upper_regnum <= regno
602*11efff7fSkettenis            && regno < tdep->ppc_ev0_upper_regnum + ppc_num_gprs)
603*11efff7fSkettenis     regcache_raw_collect (current_regcache, regno,
604*11efff7fSkettenis                           &evrregs.evr[regno - tdep->ppc_ev0_upper_regnum]);
605*11efff7fSkettenis 
606*11efff7fSkettenis   if (regno == -1
607*11efff7fSkettenis       || regno == tdep->ppc_acc_regnum)
608*11efff7fSkettenis     regcache_raw_collect (current_regcache,
609*11efff7fSkettenis                           tdep->ppc_acc_regnum,
610*11efff7fSkettenis                           &evrregs.acc);
611*11efff7fSkettenis 
612*11efff7fSkettenis   if (regno == -1
613*11efff7fSkettenis       || regno == tdep->ppc_spefscr_regnum)
614*11efff7fSkettenis     regcache_raw_collect (current_regcache,
615*11efff7fSkettenis                           tdep->ppc_spefscr_regnum,
616*11efff7fSkettenis                           &evrregs.spefscr);
617*11efff7fSkettenis 
618*11efff7fSkettenis   /* Write back the modified register set.  */
619*11efff7fSkettenis   set_spe_registers (tid, &evrregs);
620*11efff7fSkettenis }
621*11efff7fSkettenis 
622b725ae77Skettenis static void
store_register(int tid,int regno)623b725ae77Skettenis store_register (int tid, int regno)
624b725ae77Skettenis {
625*11efff7fSkettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
626b725ae77Skettenis   /* This isn't really an address.  But ptrace thinks of it as one.  */
627b725ae77Skettenis   CORE_ADDR regaddr = ppc_register_u_addr (regno);
628b725ae77Skettenis   int i;
629*11efff7fSkettenis   size_t bytes_to_transfer;
630b725ae77Skettenis   char buf[MAX_REGISTER_SIZE];
631b725ae77Skettenis 
632b725ae77Skettenis   if (altivec_register_p (regno))
633b725ae77Skettenis     {
634b725ae77Skettenis       store_altivec_register (tid, regno);
635b725ae77Skettenis       return;
636b725ae77Skettenis     }
637*11efff7fSkettenis   else if (spe_register_p (regno))
638*11efff7fSkettenis     {
639*11efff7fSkettenis       store_spe_register (tid, regno);
640*11efff7fSkettenis       return;
641*11efff7fSkettenis     }
642b725ae77Skettenis 
643b725ae77Skettenis   if (regaddr == -1)
644b725ae77Skettenis     return;
645b725ae77Skettenis 
646*11efff7fSkettenis   /* First collect the register.  Keep in mind that the regcache's
647*11efff7fSkettenis      idea of the register's size may not be a multiple of sizeof
648*11efff7fSkettenis      (PTRACE_XFER_TYPE).  */
649b725ae77Skettenis   memset (buf, 0, sizeof buf);
650*11efff7fSkettenis   bytes_to_transfer = align_up (register_size (current_gdbarch, regno),
651*11efff7fSkettenis                                 sizeof (PTRACE_XFER_TYPE));
652*11efff7fSkettenis   if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE)
653*11efff7fSkettenis     {
654*11efff7fSkettenis       /* Little-endian values always sit at the left end of the buffer.  */
655b725ae77Skettenis       regcache_raw_collect (current_regcache, regno, buf);
656*11efff7fSkettenis     }
657*11efff7fSkettenis   else if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
658*11efff7fSkettenis     {
659*11efff7fSkettenis       /* Big-endian values sit at the right end of the buffer.  */
660*11efff7fSkettenis       size_t padding = (bytes_to_transfer
661*11efff7fSkettenis                         - register_size (current_gdbarch, regno));
662*11efff7fSkettenis       regcache_raw_collect (current_regcache, regno, buf + padding);
663*11efff7fSkettenis     }
664b725ae77Skettenis 
665*11efff7fSkettenis   for (i = 0; i < bytes_to_transfer; i += sizeof (PTRACE_XFER_TYPE))
666b725ae77Skettenis     {
667b725ae77Skettenis       errno = 0;
668b725ae77Skettenis       ptrace (PT_WRITE_U, tid, (PTRACE_ARG3_TYPE) regaddr,
669b725ae77Skettenis 	      *(PTRACE_XFER_TYPE *) & buf[i]);
670b725ae77Skettenis       regaddr += sizeof (PTRACE_XFER_TYPE);
671b725ae77Skettenis 
672b725ae77Skettenis       if (errno == EIO
673*11efff7fSkettenis           && regno == tdep->ppc_fpscr_regnum)
674b725ae77Skettenis 	{
675b725ae77Skettenis 	  /* Some older kernel versions don't allow fpscr to be written.  */
676b725ae77Skettenis 	  continue;
677b725ae77Skettenis 	}
678b725ae77Skettenis 
679b725ae77Skettenis       if (errno != 0)
680b725ae77Skettenis 	{
681*11efff7fSkettenis           char message[128];
682*11efff7fSkettenis 	  sprintf (message, "writing register %s (#%d)",
683b725ae77Skettenis 		   REGISTER_NAME (regno), regno);
684*11efff7fSkettenis 	  perror_with_name (message);
685b725ae77Skettenis 	}
686b725ae77Skettenis     }
687b725ae77Skettenis }
688b725ae77Skettenis 
689b725ae77Skettenis static void
fill_vrregset(gdb_vrregset_t * vrregsetp)690b725ae77Skettenis fill_vrregset (gdb_vrregset_t *vrregsetp)
691b725ae77Skettenis {
692b725ae77Skettenis   int i;
693b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
694b725ae77Skettenis   int num_of_vrregs = tdep->ppc_vrsave_regnum - tdep->ppc_vr0_regnum + 1;
695*11efff7fSkettenis   int vrregsize = register_size (current_gdbarch, tdep->ppc_vr0_regnum);
696*11efff7fSkettenis   int offset = vrregsize - register_size (current_gdbarch, tdep->ppc_vrsave_regnum);
697b725ae77Skettenis 
698b725ae77Skettenis   for (i = 0; i < num_of_vrregs; i++)
699b725ae77Skettenis     {
700b725ae77Skettenis       /* The last 2 registers of this set are only 32 bit long, not
701b725ae77Skettenis          128, but only VSCR is fetched as a 16 bytes quantity.  */
702b725ae77Skettenis       if (i == (num_of_vrregs - 2))
703*11efff7fSkettenis         regcache_raw_collect (current_regcache, tdep->ppc_vr0_regnum + i,
704b725ae77Skettenis 			      *vrregsetp + i * vrregsize + offset);
705b725ae77Skettenis       else
706*11efff7fSkettenis         regcache_raw_collect (current_regcache, tdep->ppc_vr0_regnum + i,
707*11efff7fSkettenis 			      *vrregsetp + i * vrregsize);
708b725ae77Skettenis     }
709b725ae77Skettenis }
710b725ae77Skettenis 
711b725ae77Skettenis static void
store_altivec_registers(int tid)712b725ae77Skettenis store_altivec_registers (int tid)
713b725ae77Skettenis {
714b725ae77Skettenis   int ret;
715b725ae77Skettenis   gdb_vrregset_t regs;
716b725ae77Skettenis 
717b725ae77Skettenis   ret = ptrace (PTRACE_GETVRREGS, tid, 0, &regs);
718b725ae77Skettenis   if (ret < 0)
719b725ae77Skettenis     {
720b725ae77Skettenis       if (errno == EIO)
721b725ae77Skettenis         {
722b725ae77Skettenis           have_ptrace_getvrregs = 0;
723b725ae77Skettenis           return;
724b725ae77Skettenis         }
725b725ae77Skettenis       perror_with_name ("Couldn't get AltiVec registers");
726b725ae77Skettenis     }
727b725ae77Skettenis 
728b725ae77Skettenis   fill_vrregset (&regs);
729b725ae77Skettenis 
730b725ae77Skettenis   if (ptrace (PTRACE_SETVRREGS, tid, 0, &regs) < 0)
731b725ae77Skettenis     perror_with_name ("Couldn't write AltiVec registers");
732b725ae77Skettenis }
733b725ae77Skettenis 
734b725ae77Skettenis static void
store_ppc_registers(int tid)735b725ae77Skettenis store_ppc_registers (int tid)
736b725ae77Skettenis {
737b725ae77Skettenis   int i;
738b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
739b725ae77Skettenis 
740*11efff7fSkettenis   for (i = 0; i < ppc_num_gprs; i++)
741*11efff7fSkettenis     store_register (tid, tdep->ppc_gp0_regnum + i);
742*11efff7fSkettenis   if (tdep->ppc_fp0_regnum >= 0)
743*11efff7fSkettenis     for (i = 0; i < ppc_num_fprs; i++)
744*11efff7fSkettenis       store_register (tid, tdep->ppc_fp0_regnum + i);
745*11efff7fSkettenis   store_register (tid, PC_REGNUM);
746*11efff7fSkettenis   if (tdep->ppc_ps_regnum != -1)
747*11efff7fSkettenis     store_register (tid, tdep->ppc_ps_regnum);
748*11efff7fSkettenis   if (tdep->ppc_cr_regnum != -1)
749*11efff7fSkettenis     store_register (tid, tdep->ppc_cr_regnum);
750*11efff7fSkettenis   if (tdep->ppc_lr_regnum != -1)
751*11efff7fSkettenis     store_register (tid, tdep->ppc_lr_regnum);
752*11efff7fSkettenis   if (tdep->ppc_ctr_regnum != -1)
753*11efff7fSkettenis     store_register (tid, tdep->ppc_ctr_regnum);
754*11efff7fSkettenis   if (tdep->ppc_xer_regnum != -1)
755*11efff7fSkettenis     store_register (tid, tdep->ppc_xer_regnum);
756b725ae77Skettenis   if (tdep->ppc_mq_regnum != -1)
757b725ae77Skettenis     store_register (tid, tdep->ppc_mq_regnum);
758*11efff7fSkettenis   if (tdep->ppc_fpscr_regnum != -1)
759*11efff7fSkettenis     store_register (tid, tdep->ppc_fpscr_regnum);
760b725ae77Skettenis   if (have_ptrace_getvrregs)
761b725ae77Skettenis     if (tdep->ppc_vr0_regnum != -1 && tdep->ppc_vrsave_regnum != -1)
762b725ae77Skettenis       store_altivec_registers (tid);
763*11efff7fSkettenis   if (tdep->ppc_ev0_upper_regnum >= 0)
764*11efff7fSkettenis     store_spe_register (tid, -1);
765b725ae77Skettenis }
766b725ae77Skettenis 
767b725ae77Skettenis void
store_inferior_registers(int regno)768b725ae77Skettenis store_inferior_registers (int regno)
769b725ae77Skettenis {
770b725ae77Skettenis   /* Overload thread id onto process id */
771b725ae77Skettenis   int tid = TIDGET (inferior_ptid);
772b725ae77Skettenis 
773b725ae77Skettenis   /* No thread id, just use process id */
774b725ae77Skettenis   if (tid == 0)
775b725ae77Skettenis     tid = PIDGET (inferior_ptid);
776b725ae77Skettenis 
777b725ae77Skettenis   if (regno >= 0)
778b725ae77Skettenis     store_register (tid, regno);
779b725ae77Skettenis   else
780b725ae77Skettenis     store_ppc_registers (tid);
781b725ae77Skettenis }
782b725ae77Skettenis 
783b725ae77Skettenis void
supply_gregset(gdb_gregset_t * gregsetp)784b725ae77Skettenis supply_gregset (gdb_gregset_t *gregsetp)
785b725ae77Skettenis {
786*11efff7fSkettenis   /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace
787*11efff7fSkettenis      interface, and not the wordsize of the program's ABI.  */
788*11efff7fSkettenis   int wordsize = sizeof (PTRACE_XFER_TYPE);
789*11efff7fSkettenis   ppc_linux_supply_gregset (current_regcache, -1, gregsetp,
790*11efff7fSkettenis 			    sizeof (gdb_gregset_t), wordsize);
791*11efff7fSkettenis }
792*11efff7fSkettenis 
793*11efff7fSkettenis static void
right_fill_reg(int regnum,void * reg)794*11efff7fSkettenis right_fill_reg (int regnum, void *reg)
795*11efff7fSkettenis {
796*11efff7fSkettenis   /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace
797*11efff7fSkettenis      interface, and not the wordsize of the program's ABI.  */
798*11efff7fSkettenis   int wordsize = sizeof (PTRACE_XFER_TYPE);
799*11efff7fSkettenis   /* Right fill the register.  */
800*11efff7fSkettenis   regcache_raw_collect (current_regcache, regnum,
801*11efff7fSkettenis 			((bfd_byte *) reg
802*11efff7fSkettenis 			 + wordsize
803*11efff7fSkettenis 			 - register_size (current_gdbarch, regnum)));
804b725ae77Skettenis }
805b725ae77Skettenis 
806b725ae77Skettenis void
fill_gregset(gdb_gregset_t * gregsetp,int regno)807b725ae77Skettenis fill_gregset (gdb_gregset_t *gregsetp, int regno)
808b725ae77Skettenis {
809b725ae77Skettenis   int regi;
810b725ae77Skettenis   elf_greg_t *regp = (elf_greg_t *) gregsetp;
811b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
812*11efff7fSkettenis   const int elf_ngreg = 48;
813b725ae77Skettenis 
814*11efff7fSkettenis 
815*11efff7fSkettenis   /* Start with zeros.  */
816*11efff7fSkettenis   memset (regp, 0, elf_ngreg * sizeof (*regp));
817*11efff7fSkettenis 
818*11efff7fSkettenis   for (regi = 0; regi < ppc_num_gprs; regi++)
819b725ae77Skettenis     {
820*11efff7fSkettenis       if ((regno == -1) || regno == tdep->ppc_gp0_regnum + regi)
821*11efff7fSkettenis 	right_fill_reg (tdep->ppc_gp0_regnum + regi, (regp + PT_R0 + regi));
822b725ae77Skettenis     }
823b725ae77Skettenis 
824b725ae77Skettenis   if ((regno == -1) || regno == PC_REGNUM)
825*11efff7fSkettenis     right_fill_reg (PC_REGNUM, regp + PT_NIP);
826b725ae77Skettenis   if ((regno == -1) || regno == tdep->ppc_lr_regnum)
827*11efff7fSkettenis     right_fill_reg (tdep->ppc_lr_regnum, regp + PT_LNK);
828b725ae77Skettenis   if ((regno == -1) || regno == tdep->ppc_cr_regnum)
829*11efff7fSkettenis     regcache_raw_collect (current_regcache, tdep->ppc_cr_regnum,
830*11efff7fSkettenis 			  regp + PT_CCR);
831b725ae77Skettenis   if ((regno == -1) || regno == tdep->ppc_xer_regnum)
832*11efff7fSkettenis     regcache_raw_collect (current_regcache, tdep->ppc_xer_regnum,
833*11efff7fSkettenis 			  regp + PT_XER);
834b725ae77Skettenis   if ((regno == -1) || regno == tdep->ppc_ctr_regnum)
835*11efff7fSkettenis     right_fill_reg (tdep->ppc_ctr_regnum, regp + PT_CTR);
836b725ae77Skettenis #ifdef PT_MQ
837b725ae77Skettenis   if (((regno == -1) || regno == tdep->ppc_mq_regnum)
838b725ae77Skettenis       && (tdep->ppc_mq_regnum != -1))
839*11efff7fSkettenis     right_fill_reg (tdep->ppc_mq_regnum, regp + PT_MQ);
840b725ae77Skettenis #endif
841b725ae77Skettenis   if ((regno == -1) || regno == tdep->ppc_ps_regnum)
842*11efff7fSkettenis     right_fill_reg (tdep->ppc_ps_regnum, regp + PT_MSR);
843b725ae77Skettenis }
844b725ae77Skettenis 
845b725ae77Skettenis void
supply_fpregset(gdb_fpregset_t * fpregsetp)846b725ae77Skettenis supply_fpregset (gdb_fpregset_t * fpregsetp)
847b725ae77Skettenis {
848*11efff7fSkettenis   ppc_linux_supply_fpregset (NULL, current_regcache, -1, fpregsetp,
849*11efff7fSkettenis 			     sizeof (gdb_fpregset_t));
850b725ae77Skettenis }
851b725ae77Skettenis 
852b725ae77Skettenis /* Given a pointer to a floating point register set in /proc format
853b725ae77Skettenis    (fpregset_t *), update the register specified by REGNO from gdb's
854b725ae77Skettenis    idea of the current floating point register set.  If REGNO is -1,
855b725ae77Skettenis    update them all.  */
856b725ae77Skettenis void
fill_fpregset(gdb_fpregset_t * fpregsetp,int regno)857b725ae77Skettenis fill_fpregset (gdb_fpregset_t *fpregsetp, int regno)
858b725ae77Skettenis {
859b725ae77Skettenis   int regi;
860b725ae77Skettenis   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
861*11efff7fSkettenis   bfd_byte *fpp = (void *) fpregsetp;
862b725ae77Skettenis 
863*11efff7fSkettenis   if (ppc_floating_point_unit_p (current_gdbarch))
864b725ae77Skettenis     {
865*11efff7fSkettenis       for (regi = 0; regi < ppc_num_fprs; regi++)
866*11efff7fSkettenis         {
867*11efff7fSkettenis           if ((regno == -1) || (regno == tdep->ppc_fp0_regnum + regi))
868*11efff7fSkettenis             regcache_raw_collect (current_regcache, tdep->ppc_fp0_regnum + regi,
869*11efff7fSkettenis 				  fpp + 8 * regi);
870b725ae77Skettenis         }
871*11efff7fSkettenis       if (regno == -1 || regno == tdep->ppc_fpscr_regnum)
872*11efff7fSkettenis         right_fill_reg (tdep->ppc_fpscr_regnum, (fpp + 8 * 32));
873*11efff7fSkettenis     }
874b725ae77Skettenis }
875