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, ®s);
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, ®s);
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 (®s);
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, ®s);
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, ®s);
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, ®s);
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 (®s);
729b725ae77Skettenis
730b725ae77Skettenis if (ptrace (PTRACE_SETVRREGS, tid, 0, ®s) < 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