1*11efff7fSkettenis /* Native-dependent code for GNU/Linux i386.
2b725ae77Skettenis
3*11efff7fSkettenis Copyright 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
4b725ae77Skettenis
5b725ae77Skettenis This file is part of GDB.
6b725ae77Skettenis
7b725ae77Skettenis This program is free software; you can redistribute it and/or modify
8b725ae77Skettenis it under the terms of the GNU General Public License as published by
9b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or
10b725ae77Skettenis (at your option) any later version.
11b725ae77Skettenis
12b725ae77Skettenis This program is distributed in the hope that it will be useful,
13b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of
14b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15b725ae77Skettenis GNU General Public License for more details.
16b725ae77Skettenis
17b725ae77Skettenis You should have received a copy of the GNU General Public License
18b725ae77Skettenis along with this program; if not, write to the Free Software
19b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
20b725ae77Skettenis Boston, MA 02111-1307, USA. */
21b725ae77Skettenis
22b725ae77Skettenis #include "defs.h"
23b725ae77Skettenis #include "inferior.h"
24b725ae77Skettenis #include "gdbcore.h"
25b725ae77Skettenis #include "regcache.h"
26b725ae77Skettenis #include "linux-nat.h"
27b725ae77Skettenis
28b725ae77Skettenis #include "gdb_assert.h"
29b725ae77Skettenis #include "gdb_string.h"
30b725ae77Skettenis #include <sys/ptrace.h>
31b725ae77Skettenis #include <sys/user.h>
32b725ae77Skettenis #include <sys/procfs.h>
33b725ae77Skettenis
34b725ae77Skettenis #ifdef HAVE_SYS_REG_H
35b725ae77Skettenis #include <sys/reg.h>
36b725ae77Skettenis #endif
37b725ae77Skettenis
38b725ae77Skettenis #ifndef ORIG_EAX
39b725ae77Skettenis #define ORIG_EAX -1
40b725ae77Skettenis #endif
41b725ae77Skettenis
42b725ae77Skettenis #ifdef HAVE_SYS_DEBUGREG_H
43b725ae77Skettenis #include <sys/debugreg.h>
44b725ae77Skettenis #endif
45b725ae77Skettenis
46b725ae77Skettenis #ifndef DR_FIRSTADDR
47b725ae77Skettenis #define DR_FIRSTADDR 0
48b725ae77Skettenis #endif
49b725ae77Skettenis
50b725ae77Skettenis #ifndef DR_LASTADDR
51b725ae77Skettenis #define DR_LASTADDR 3
52b725ae77Skettenis #endif
53b725ae77Skettenis
54b725ae77Skettenis #ifndef DR_STATUS
55b725ae77Skettenis #define DR_STATUS 6
56b725ae77Skettenis #endif
57b725ae77Skettenis
58b725ae77Skettenis #ifndef DR_CONTROL
59b725ae77Skettenis #define DR_CONTROL 7
60b725ae77Skettenis #endif
61b725ae77Skettenis
62b725ae77Skettenis /* Prototypes for supply_gregset etc. */
63b725ae77Skettenis #include "gregset.h"
64b725ae77Skettenis
65b725ae77Skettenis #include "i387-tdep.h"
66b725ae77Skettenis #include "i386-tdep.h"
67b725ae77Skettenis #include "i386-linux-tdep.h"
68b725ae77Skettenis
69b725ae77Skettenis /* Defines ps_err_e, struct ps_prochandle. */
70b725ae77Skettenis #include "gdb_proc_service.h"
71b725ae77Skettenis
72b725ae77Skettenis
73b725ae77Skettenis /* The register sets used in GNU/Linux ELF core-dumps are identical to
74b725ae77Skettenis the register sets in `struct user' that is used for a.out
75b725ae77Skettenis core-dumps, and is also used by `ptrace'. The corresponding types
76b725ae77Skettenis are `elf_gregset_t' for the general-purpose registers (with
77b725ae77Skettenis `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
78b725ae77Skettenis for the floating-point registers.
79b725ae77Skettenis
80b725ae77Skettenis Those types used to be available under the names `gregset_t' and
81b725ae77Skettenis `fpregset_t' too, and this file used those names in the past. But
82b725ae77Skettenis those names are now used for the register sets used in the
83b725ae77Skettenis `mcontext_t' type, and have a different size and layout. */
84b725ae77Skettenis
85b725ae77Skettenis /* Mapping between the general-purpose registers in `struct user'
86b725ae77Skettenis format and GDB's register array layout. */
87b725ae77Skettenis static int regmap[] =
88b725ae77Skettenis {
89b725ae77Skettenis EAX, ECX, EDX, EBX,
90b725ae77Skettenis UESP, EBP, ESI, EDI,
91b725ae77Skettenis EIP, EFL, CS, SS,
92b725ae77Skettenis DS, ES, FS, GS,
93b725ae77Skettenis -1, -1, -1, -1, /* st0, st1, st2, st3 */
94b725ae77Skettenis -1, -1, -1, -1, /* st4, st5, st6, st7 */
95b725ae77Skettenis -1, -1, -1, -1, /* fctrl, fstat, ftag, fiseg */
96b725ae77Skettenis -1, -1, -1, -1, /* fioff, foseg, fooff, fop */
97b725ae77Skettenis -1, -1, -1, -1, /* xmm0, xmm1, xmm2, xmm3 */
98b725ae77Skettenis -1, -1, -1, -1, /* xmm4, xmm5, xmm6, xmm6 */
99b725ae77Skettenis -1, /* mxcsr */
100b725ae77Skettenis ORIG_EAX
101b725ae77Skettenis };
102b725ae77Skettenis
103b725ae77Skettenis /* Which ptrace request retrieves which registers?
104b725ae77Skettenis These apply to the corresponding SET requests as well. */
105b725ae77Skettenis
106b725ae77Skettenis #define GETREGS_SUPPLIES(regno) \
107b725ae77Skettenis ((0 <= (regno) && (regno) <= 15) || (regno) == I386_LINUX_ORIG_EAX_REGNUM)
108b725ae77Skettenis
109b725ae77Skettenis #define GETFPXREGS_SUPPLIES(regno) \
110*11efff7fSkettenis (I386_ST0_REGNUM <= (regno) && (regno) < I386_SSE_NUM_REGS)
111b725ae77Skettenis
112b725ae77Skettenis /* Does the current host support the GETREGS request? */
113b725ae77Skettenis int have_ptrace_getregs =
114b725ae77Skettenis #ifdef HAVE_PTRACE_GETREGS
115b725ae77Skettenis 1
116b725ae77Skettenis #else
117b725ae77Skettenis 0
118b725ae77Skettenis #endif
119b725ae77Skettenis ;
120b725ae77Skettenis
121b725ae77Skettenis /* Does the current host support the GETFPXREGS request? The header
122b725ae77Skettenis file may or may not define it, and even if it is defined, the
123b725ae77Skettenis kernel will return EIO if it's running on a pre-SSE processor.
124b725ae77Skettenis
125b725ae77Skettenis My instinct is to attach this to some architecture- or
126b725ae77Skettenis target-specific data structure, but really, a particular GDB
127b725ae77Skettenis process can only run on top of one kernel at a time. So it's okay
128b725ae77Skettenis for this to be a simple variable. */
129b725ae77Skettenis int have_ptrace_getfpxregs =
130b725ae77Skettenis #ifdef HAVE_PTRACE_GETFPXREGS
131b725ae77Skettenis 1
132b725ae77Skettenis #else
133b725ae77Skettenis 0
134b725ae77Skettenis #endif
135b725ae77Skettenis ;
136b725ae77Skettenis
137b725ae77Skettenis
138b725ae77Skettenis /* Support for the user struct. */
139b725ae77Skettenis
140b725ae77Skettenis /* Return the address of register REGNUM. BLOCKEND is the value of
141b725ae77Skettenis u.u_ar0, which should point to the registers. */
142b725ae77Skettenis
143b725ae77Skettenis CORE_ADDR
register_u_addr(CORE_ADDR blockend,int regnum)144b725ae77Skettenis register_u_addr (CORE_ADDR blockend, int regnum)
145b725ae77Skettenis {
146b725ae77Skettenis return (blockend + 4 * regmap[regnum]);
147b725ae77Skettenis }
148b725ae77Skettenis
149b725ae77Skettenis /* Return the size of the user struct. */
150b725ae77Skettenis
151b725ae77Skettenis int
kernel_u_size(void)152b725ae77Skettenis kernel_u_size (void)
153b725ae77Skettenis {
154b725ae77Skettenis return (sizeof (struct user));
155b725ae77Skettenis }
156b725ae77Skettenis
157b725ae77Skettenis
158b725ae77Skettenis /* Accessing registers through the U area, one at a time. */
159b725ae77Skettenis
160b725ae77Skettenis /* Fetch one register. */
161b725ae77Skettenis
162b725ae77Skettenis static void
fetch_register(int regno)163b725ae77Skettenis fetch_register (int regno)
164b725ae77Skettenis {
165b725ae77Skettenis int tid;
166b725ae77Skettenis int val;
167b725ae77Skettenis
168b725ae77Skettenis gdb_assert (!have_ptrace_getregs);
169b725ae77Skettenis if (cannot_fetch_register (regno))
170b725ae77Skettenis {
171*11efff7fSkettenis regcache_raw_supply (current_regcache, regno, NULL);
172b725ae77Skettenis return;
173b725ae77Skettenis }
174b725ae77Skettenis
175b725ae77Skettenis /* GNU/Linux LWP ID's are process ID's. */
176b725ae77Skettenis tid = TIDGET (inferior_ptid);
177b725ae77Skettenis if (tid == 0)
178b725ae77Skettenis tid = PIDGET (inferior_ptid); /* Not a threaded program. */
179b725ae77Skettenis
180b725ae77Skettenis errno = 0;
181b725ae77Skettenis val = ptrace (PTRACE_PEEKUSER, tid, register_addr (regno, 0), 0);
182b725ae77Skettenis if (errno != 0)
183b725ae77Skettenis error ("Couldn't read register %s (#%d): %s.", REGISTER_NAME (regno),
184b725ae77Skettenis regno, safe_strerror (errno));
185b725ae77Skettenis
186*11efff7fSkettenis regcache_raw_supply (current_regcache, regno, &val);
187b725ae77Skettenis }
188b725ae77Skettenis
189b725ae77Skettenis /* Store one register. */
190b725ae77Skettenis
191b725ae77Skettenis static void
store_register(int regno)192b725ae77Skettenis store_register (int regno)
193b725ae77Skettenis {
194b725ae77Skettenis int tid;
195b725ae77Skettenis int val;
196b725ae77Skettenis
197b725ae77Skettenis gdb_assert (!have_ptrace_getregs);
198b725ae77Skettenis if (cannot_store_register (regno))
199b725ae77Skettenis return;
200b725ae77Skettenis
201b725ae77Skettenis /* GNU/Linux LWP ID's are process ID's. */
202b725ae77Skettenis tid = TIDGET (inferior_ptid);
203b725ae77Skettenis if (tid == 0)
204b725ae77Skettenis tid = PIDGET (inferior_ptid); /* Not a threaded program. */
205b725ae77Skettenis
206b725ae77Skettenis errno = 0;
207*11efff7fSkettenis regcache_raw_collect (current_regcache, regno, &val);
208b725ae77Skettenis ptrace (PTRACE_POKEUSER, tid, register_addr (regno, 0), val);
209b725ae77Skettenis if (errno != 0)
210b725ae77Skettenis error ("Couldn't write register %s (#%d): %s.", REGISTER_NAME (regno),
211b725ae77Skettenis regno, safe_strerror (errno));
212b725ae77Skettenis }
213b725ae77Skettenis
214b725ae77Skettenis
215b725ae77Skettenis /* Transfering the general-purpose registers between GDB, inferiors
216b725ae77Skettenis and core files. */
217b725ae77Skettenis
218b725ae77Skettenis /* Fill GDB's register array with the general-purpose register values
219b725ae77Skettenis in *GREGSETP. */
220b725ae77Skettenis
221b725ae77Skettenis void
supply_gregset(elf_gregset_t * gregsetp)222b725ae77Skettenis supply_gregset (elf_gregset_t *gregsetp)
223b725ae77Skettenis {
224b725ae77Skettenis elf_greg_t *regp = (elf_greg_t *) gregsetp;
225b725ae77Skettenis int i;
226b725ae77Skettenis
227b725ae77Skettenis for (i = 0; i < I386_NUM_GREGS; i++)
228*11efff7fSkettenis regcache_raw_supply (current_regcache, i, regp + regmap[i]);
229b725ae77Skettenis
230b725ae77Skettenis if (I386_LINUX_ORIG_EAX_REGNUM < NUM_REGS)
231*11efff7fSkettenis regcache_raw_supply (current_regcache, I386_LINUX_ORIG_EAX_REGNUM,
232*11efff7fSkettenis regp + ORIG_EAX);
233b725ae77Skettenis }
234b725ae77Skettenis
235b725ae77Skettenis /* Fill register REGNO (if it is a general-purpose register) in
236b725ae77Skettenis *GREGSETPS with the value in GDB's register array. If REGNO is -1,
237b725ae77Skettenis do this for all registers. */
238b725ae77Skettenis
239b725ae77Skettenis void
fill_gregset(elf_gregset_t * gregsetp,int regno)240b725ae77Skettenis fill_gregset (elf_gregset_t *gregsetp, int regno)
241b725ae77Skettenis {
242b725ae77Skettenis elf_greg_t *regp = (elf_greg_t *) gregsetp;
243b725ae77Skettenis int i;
244b725ae77Skettenis
245b725ae77Skettenis for (i = 0; i < I386_NUM_GREGS; i++)
246b725ae77Skettenis if (regno == -1 || regno == i)
247*11efff7fSkettenis regcache_raw_collect (current_regcache, i, regp + regmap[i]);
248b725ae77Skettenis
249b725ae77Skettenis if ((regno == -1 || regno == I386_LINUX_ORIG_EAX_REGNUM)
250b725ae77Skettenis && I386_LINUX_ORIG_EAX_REGNUM < NUM_REGS)
251*11efff7fSkettenis regcache_raw_collect (current_regcache, I386_LINUX_ORIG_EAX_REGNUM,
252*11efff7fSkettenis regp + ORIG_EAX);
253b725ae77Skettenis }
254b725ae77Skettenis
255b725ae77Skettenis #ifdef HAVE_PTRACE_GETREGS
256b725ae77Skettenis
257b725ae77Skettenis /* Fetch all general-purpose registers from process/thread TID and
258b725ae77Skettenis store their values in GDB's register array. */
259b725ae77Skettenis
260b725ae77Skettenis static void
fetch_regs(int tid)261b725ae77Skettenis fetch_regs (int tid)
262b725ae77Skettenis {
263b725ae77Skettenis elf_gregset_t regs;
264b725ae77Skettenis
265b725ae77Skettenis if (ptrace (PTRACE_GETREGS, tid, 0, (int) ®s) < 0)
266b725ae77Skettenis {
267b725ae77Skettenis if (errno == EIO)
268b725ae77Skettenis {
269b725ae77Skettenis /* The kernel we're running on doesn't support the GETREGS
270b725ae77Skettenis request. Reset `have_ptrace_getregs'. */
271b725ae77Skettenis have_ptrace_getregs = 0;
272b725ae77Skettenis return;
273b725ae77Skettenis }
274b725ae77Skettenis
275b725ae77Skettenis perror_with_name ("Couldn't get registers");
276b725ae77Skettenis }
277b725ae77Skettenis
278b725ae77Skettenis supply_gregset (®s);
279b725ae77Skettenis }
280b725ae77Skettenis
281b725ae77Skettenis /* Store all valid general-purpose registers in GDB's register array
282b725ae77Skettenis into the process/thread specified by TID. */
283b725ae77Skettenis
284b725ae77Skettenis static void
store_regs(int tid,int regno)285b725ae77Skettenis store_regs (int tid, int regno)
286b725ae77Skettenis {
287b725ae77Skettenis elf_gregset_t regs;
288b725ae77Skettenis
289b725ae77Skettenis if (ptrace (PTRACE_GETREGS, tid, 0, (int) ®s) < 0)
290b725ae77Skettenis perror_with_name ("Couldn't get registers");
291b725ae77Skettenis
292b725ae77Skettenis fill_gregset (®s, regno);
293b725ae77Skettenis
294b725ae77Skettenis if (ptrace (PTRACE_SETREGS, tid, 0, (int) ®s) < 0)
295b725ae77Skettenis perror_with_name ("Couldn't write registers");
296b725ae77Skettenis }
297b725ae77Skettenis
298b725ae77Skettenis #else
299b725ae77Skettenis
fetch_regs(int tid)300b725ae77Skettenis static void fetch_regs (int tid) {}
store_regs(int tid,int regno)301b725ae77Skettenis static void store_regs (int tid, int regno) {}
302b725ae77Skettenis
303b725ae77Skettenis #endif
304b725ae77Skettenis
305b725ae77Skettenis
306b725ae77Skettenis /* Transfering floating-point registers between GDB, inferiors and cores. */
307b725ae77Skettenis
308b725ae77Skettenis /* Fill GDB's register array with the floating-point register values in
309b725ae77Skettenis *FPREGSETP. */
310b725ae77Skettenis
311b725ae77Skettenis void
supply_fpregset(elf_fpregset_t * fpregsetp)312b725ae77Skettenis supply_fpregset (elf_fpregset_t *fpregsetp)
313b725ae77Skettenis {
314b725ae77Skettenis i387_supply_fsave (current_regcache, -1, fpregsetp);
315b725ae77Skettenis }
316b725ae77Skettenis
317b725ae77Skettenis /* Fill register REGNO (if it is a floating-point register) in
318b725ae77Skettenis *FPREGSETP with the value in GDB's register array. If REGNO is -1,
319b725ae77Skettenis do this for all registers. */
320b725ae77Skettenis
321b725ae77Skettenis void
fill_fpregset(elf_fpregset_t * fpregsetp,int regno)322b725ae77Skettenis fill_fpregset (elf_fpregset_t *fpregsetp, int regno)
323b725ae77Skettenis {
324b725ae77Skettenis i387_fill_fsave ((char *) fpregsetp, regno);
325b725ae77Skettenis }
326b725ae77Skettenis
327b725ae77Skettenis #ifdef HAVE_PTRACE_GETREGS
328b725ae77Skettenis
329b725ae77Skettenis /* Fetch all floating-point registers from process/thread TID and store
330b725ae77Skettenis thier values in GDB's register array. */
331b725ae77Skettenis
332b725ae77Skettenis static void
fetch_fpregs(int tid)333b725ae77Skettenis fetch_fpregs (int tid)
334b725ae77Skettenis {
335b725ae77Skettenis elf_fpregset_t fpregs;
336b725ae77Skettenis
337b725ae77Skettenis if (ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs) < 0)
338b725ae77Skettenis perror_with_name ("Couldn't get floating point status");
339b725ae77Skettenis
340b725ae77Skettenis supply_fpregset (&fpregs);
341b725ae77Skettenis }
342b725ae77Skettenis
343b725ae77Skettenis /* Store all valid floating-point registers in GDB's register array
344b725ae77Skettenis into the process/thread specified by TID. */
345b725ae77Skettenis
346b725ae77Skettenis static void
store_fpregs(int tid,int regno)347b725ae77Skettenis store_fpregs (int tid, int regno)
348b725ae77Skettenis {
349b725ae77Skettenis elf_fpregset_t fpregs;
350b725ae77Skettenis
351b725ae77Skettenis if (ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs) < 0)
352b725ae77Skettenis perror_with_name ("Couldn't get floating point status");
353b725ae77Skettenis
354b725ae77Skettenis fill_fpregset (&fpregs, regno);
355b725ae77Skettenis
356b725ae77Skettenis if (ptrace (PTRACE_SETFPREGS, tid, 0, (int) &fpregs) < 0)
357b725ae77Skettenis perror_with_name ("Couldn't write floating point status");
358b725ae77Skettenis }
359b725ae77Skettenis
360b725ae77Skettenis #else
361b725ae77Skettenis
fetch_fpregs(int tid)362b725ae77Skettenis static void fetch_fpregs (int tid) {}
store_fpregs(int tid,int regno)363b725ae77Skettenis static void store_fpregs (int tid, int regno) {}
364b725ae77Skettenis
365b725ae77Skettenis #endif
366b725ae77Skettenis
367b725ae77Skettenis
368b725ae77Skettenis /* Transfering floating-point and SSE registers to and from GDB. */
369b725ae77Skettenis
370b725ae77Skettenis #ifdef HAVE_PTRACE_GETFPXREGS
371b725ae77Skettenis
372b725ae77Skettenis /* Fill GDB's register array with the floating-point and SSE register
373b725ae77Skettenis values in *FPXREGSETP. */
374b725ae77Skettenis
375b725ae77Skettenis void
supply_fpxregset(elf_fpxregset_t * fpxregsetp)376b725ae77Skettenis supply_fpxregset (elf_fpxregset_t *fpxregsetp)
377b725ae77Skettenis {
378b725ae77Skettenis i387_supply_fxsave (current_regcache, -1, fpxregsetp);
379b725ae77Skettenis }
380b725ae77Skettenis
381b725ae77Skettenis /* Fill register REGNO (if it is a floating-point or SSE register) in
382b725ae77Skettenis *FPXREGSETP with the value in GDB's register array. If REGNO is
383b725ae77Skettenis -1, do this for all registers. */
384b725ae77Skettenis
385b725ae77Skettenis void
fill_fpxregset(elf_fpxregset_t * fpxregsetp,int regno)386b725ae77Skettenis fill_fpxregset (elf_fpxregset_t *fpxregsetp, int regno)
387b725ae77Skettenis {
388b725ae77Skettenis i387_fill_fxsave ((char *) fpxregsetp, regno);
389b725ae77Skettenis }
390b725ae77Skettenis
391b725ae77Skettenis /* Fetch all registers covered by the PTRACE_GETFPXREGS request from
392b725ae77Skettenis process/thread TID and store their values in GDB's register array.
393b725ae77Skettenis Return non-zero if successful, zero otherwise. */
394b725ae77Skettenis
395b725ae77Skettenis static int
fetch_fpxregs(int tid)396b725ae77Skettenis fetch_fpxregs (int tid)
397b725ae77Skettenis {
398b725ae77Skettenis elf_fpxregset_t fpxregs;
399b725ae77Skettenis
400b725ae77Skettenis if (! have_ptrace_getfpxregs)
401b725ae77Skettenis return 0;
402b725ae77Skettenis
403b725ae77Skettenis if (ptrace (PTRACE_GETFPXREGS, tid, 0, (int) &fpxregs) < 0)
404b725ae77Skettenis {
405b725ae77Skettenis if (errno == EIO)
406b725ae77Skettenis {
407b725ae77Skettenis have_ptrace_getfpxregs = 0;
408b725ae77Skettenis return 0;
409b725ae77Skettenis }
410b725ae77Skettenis
411b725ae77Skettenis perror_with_name ("Couldn't read floating-point and SSE registers");
412b725ae77Skettenis }
413b725ae77Skettenis
414b725ae77Skettenis supply_fpxregset (&fpxregs);
415b725ae77Skettenis return 1;
416b725ae77Skettenis }
417b725ae77Skettenis
418b725ae77Skettenis /* Store all valid registers in GDB's register array covered by the
419b725ae77Skettenis PTRACE_SETFPXREGS request into the process/thread specified by TID.
420b725ae77Skettenis Return non-zero if successful, zero otherwise. */
421b725ae77Skettenis
422b725ae77Skettenis static int
store_fpxregs(int tid,int regno)423b725ae77Skettenis store_fpxregs (int tid, int regno)
424b725ae77Skettenis {
425b725ae77Skettenis elf_fpxregset_t fpxregs;
426b725ae77Skettenis
427b725ae77Skettenis if (! have_ptrace_getfpxregs)
428b725ae77Skettenis return 0;
429b725ae77Skettenis
430b725ae77Skettenis if (ptrace (PTRACE_GETFPXREGS, tid, 0, &fpxregs) == -1)
431b725ae77Skettenis {
432b725ae77Skettenis if (errno == EIO)
433b725ae77Skettenis {
434b725ae77Skettenis have_ptrace_getfpxregs = 0;
435b725ae77Skettenis return 0;
436b725ae77Skettenis }
437b725ae77Skettenis
438b725ae77Skettenis perror_with_name ("Couldn't read floating-point and SSE registers");
439b725ae77Skettenis }
440b725ae77Skettenis
441b725ae77Skettenis fill_fpxregset (&fpxregs, regno);
442b725ae77Skettenis
443b725ae77Skettenis if (ptrace (PTRACE_SETFPXREGS, tid, 0, &fpxregs) == -1)
444b725ae77Skettenis perror_with_name ("Couldn't write floating-point and SSE registers");
445b725ae77Skettenis
446b725ae77Skettenis return 1;
447b725ae77Skettenis }
448b725ae77Skettenis
449b725ae77Skettenis #else
450b725ae77Skettenis
fetch_fpxregs(int tid)451b725ae77Skettenis static int fetch_fpxregs (int tid) { return 0; }
store_fpxregs(int tid,int regno)452b725ae77Skettenis static int store_fpxregs (int tid, int regno) { return 0; }
453b725ae77Skettenis
454b725ae77Skettenis #endif /* HAVE_PTRACE_GETFPXREGS */
455b725ae77Skettenis
456b725ae77Skettenis
457b725ae77Skettenis /* Transferring arbitrary registers between GDB and inferior. */
458b725ae77Skettenis
459b725ae77Skettenis /* Check if register REGNO in the child process is accessible.
460b725ae77Skettenis If we are accessing registers directly via the U area, only the
461b725ae77Skettenis general-purpose registers are available.
462b725ae77Skettenis All registers should be accessible if we have GETREGS support. */
463b725ae77Skettenis
464b725ae77Skettenis int
cannot_fetch_register(int regno)465b725ae77Skettenis cannot_fetch_register (int regno)
466b725ae77Skettenis {
467b725ae77Skettenis gdb_assert (regno >= 0 && regno < NUM_REGS);
468b725ae77Skettenis return (!have_ptrace_getregs && regmap[regno] == -1);
469b725ae77Skettenis }
470b725ae77Skettenis
471b725ae77Skettenis int
cannot_store_register(int regno)472b725ae77Skettenis cannot_store_register (int regno)
473b725ae77Skettenis {
474b725ae77Skettenis gdb_assert (regno >= 0 && regno < NUM_REGS);
475b725ae77Skettenis return (!have_ptrace_getregs && regmap[regno] == -1);
476b725ae77Skettenis }
477b725ae77Skettenis
478b725ae77Skettenis /* Fetch register REGNO from the child process. If REGNO is -1, do
479b725ae77Skettenis this for all registers (including the floating point and SSE
480b725ae77Skettenis registers). */
481b725ae77Skettenis
482b725ae77Skettenis void
fetch_inferior_registers(int regno)483b725ae77Skettenis fetch_inferior_registers (int regno)
484b725ae77Skettenis {
485b725ae77Skettenis int tid;
486b725ae77Skettenis
487b725ae77Skettenis /* Use the old method of peeking around in `struct user' if the
488b725ae77Skettenis GETREGS request isn't available. */
489b725ae77Skettenis if (!have_ptrace_getregs)
490b725ae77Skettenis {
491b725ae77Skettenis int i;
492b725ae77Skettenis
493b725ae77Skettenis for (i = 0; i < NUM_REGS; i++)
494b725ae77Skettenis if (regno == -1 || regno == i)
495b725ae77Skettenis fetch_register (i);
496b725ae77Skettenis
497b725ae77Skettenis return;
498b725ae77Skettenis }
499b725ae77Skettenis
500b725ae77Skettenis /* GNU/Linux LWP ID's are process ID's. */
501b725ae77Skettenis tid = TIDGET (inferior_ptid);
502b725ae77Skettenis if (tid == 0)
503b725ae77Skettenis tid = PIDGET (inferior_ptid); /* Not a threaded program. */
504b725ae77Skettenis
505b725ae77Skettenis /* Use the PTRACE_GETFPXREGS request whenever possible, since it
506b725ae77Skettenis transfers more registers in one system call, and we'll cache the
507b725ae77Skettenis results. But remember that fetch_fpxregs can fail, and return
508b725ae77Skettenis zero. */
509b725ae77Skettenis if (regno == -1)
510b725ae77Skettenis {
511b725ae77Skettenis fetch_regs (tid);
512b725ae77Skettenis
513b725ae77Skettenis /* The call above might reset `have_ptrace_getregs'. */
514b725ae77Skettenis if (!have_ptrace_getregs)
515b725ae77Skettenis {
516b725ae77Skettenis fetch_inferior_registers (regno);
517b725ae77Skettenis return;
518b725ae77Skettenis }
519b725ae77Skettenis
520b725ae77Skettenis if (fetch_fpxregs (tid))
521b725ae77Skettenis return;
522b725ae77Skettenis fetch_fpregs (tid);
523b725ae77Skettenis return;
524b725ae77Skettenis }
525b725ae77Skettenis
526b725ae77Skettenis if (GETREGS_SUPPLIES (regno))
527b725ae77Skettenis {
528b725ae77Skettenis fetch_regs (tid);
529b725ae77Skettenis return;
530b725ae77Skettenis }
531b725ae77Skettenis
532b725ae77Skettenis if (GETFPXREGS_SUPPLIES (regno))
533b725ae77Skettenis {
534b725ae77Skettenis if (fetch_fpxregs (tid))
535b725ae77Skettenis return;
536b725ae77Skettenis
537b725ae77Skettenis /* Either our processor or our kernel doesn't support the SSE
538b725ae77Skettenis registers, so read the FP registers in the traditional way,
539b725ae77Skettenis and fill the SSE registers with dummy values. It would be
540b725ae77Skettenis more graceful to handle differences in the register set using
541b725ae77Skettenis gdbarch. Until then, this will at least make things work
542b725ae77Skettenis plausibly. */
543b725ae77Skettenis fetch_fpregs (tid);
544b725ae77Skettenis return;
545b725ae77Skettenis }
546b725ae77Skettenis
547b725ae77Skettenis internal_error (__FILE__, __LINE__,
548b725ae77Skettenis "Got request for bad register number %d.", regno);
549b725ae77Skettenis }
550b725ae77Skettenis
551b725ae77Skettenis /* Store register REGNO back into the child process. If REGNO is -1,
552b725ae77Skettenis do this for all registers (including the floating point and SSE
553b725ae77Skettenis registers). */
554b725ae77Skettenis void
store_inferior_registers(int regno)555b725ae77Skettenis store_inferior_registers (int regno)
556b725ae77Skettenis {
557b725ae77Skettenis int tid;
558b725ae77Skettenis
559b725ae77Skettenis /* Use the old method of poking around in `struct user' if the
560b725ae77Skettenis SETREGS request isn't available. */
561b725ae77Skettenis if (!have_ptrace_getregs)
562b725ae77Skettenis {
563b725ae77Skettenis int i;
564b725ae77Skettenis
565b725ae77Skettenis for (i = 0; i < NUM_REGS; i++)
566b725ae77Skettenis if (regno == -1 || regno == i)
567b725ae77Skettenis store_register (i);
568b725ae77Skettenis
569b725ae77Skettenis return;
570b725ae77Skettenis }
571b725ae77Skettenis
572b725ae77Skettenis /* GNU/Linux LWP ID's are process ID's. */
573b725ae77Skettenis tid = TIDGET (inferior_ptid);
574b725ae77Skettenis if (tid == 0)
575b725ae77Skettenis tid = PIDGET (inferior_ptid); /* Not a threaded program. */
576b725ae77Skettenis
577b725ae77Skettenis /* Use the PTRACE_SETFPXREGS requests whenever possible, since it
578b725ae77Skettenis transfers more registers in one system call. But remember that
579b725ae77Skettenis store_fpxregs can fail, and return zero. */
580b725ae77Skettenis if (regno == -1)
581b725ae77Skettenis {
582b725ae77Skettenis store_regs (tid, regno);
583b725ae77Skettenis if (store_fpxregs (tid, regno))
584b725ae77Skettenis return;
585b725ae77Skettenis store_fpregs (tid, regno);
586b725ae77Skettenis return;
587b725ae77Skettenis }
588b725ae77Skettenis
589b725ae77Skettenis if (GETREGS_SUPPLIES (regno))
590b725ae77Skettenis {
591b725ae77Skettenis store_regs (tid, regno);
592b725ae77Skettenis return;
593b725ae77Skettenis }
594b725ae77Skettenis
595b725ae77Skettenis if (GETFPXREGS_SUPPLIES (regno))
596b725ae77Skettenis {
597b725ae77Skettenis if (store_fpxregs (tid, regno))
598b725ae77Skettenis return;
599b725ae77Skettenis
600b725ae77Skettenis /* Either our processor or our kernel doesn't support the SSE
601b725ae77Skettenis registers, so just write the FP registers in the traditional
602b725ae77Skettenis way. */
603b725ae77Skettenis store_fpregs (tid, regno);
604b725ae77Skettenis return;
605b725ae77Skettenis }
606b725ae77Skettenis
607b725ae77Skettenis internal_error (__FILE__, __LINE__,
608b725ae77Skettenis "Got request to store bad register number %d.", regno);
609b725ae77Skettenis }
610b725ae77Skettenis
611b725ae77Skettenis
612b725ae77Skettenis /* Support for debug registers. */
613b725ae77Skettenis
614b725ae77Skettenis static unsigned long
i386_linux_dr_get(int regnum)615b725ae77Skettenis i386_linux_dr_get (int regnum)
616b725ae77Skettenis {
617b725ae77Skettenis int tid;
618b725ae77Skettenis unsigned long value;
619b725ae77Skettenis
620b725ae77Skettenis /* FIXME: kettenis/2001-01-29: It's not clear what we should do with
621b725ae77Skettenis multi-threaded processes here. For now, pretend there is just
622b725ae77Skettenis one thread. */
623b725ae77Skettenis tid = PIDGET (inferior_ptid);
624b725ae77Skettenis
625b725ae77Skettenis /* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
626b725ae77Skettenis ptrace call fails breaks debugging remote targets. The correct
627b725ae77Skettenis way to fix this is to add the hardware breakpoint and watchpoint
628*11efff7fSkettenis stuff to the target vector. For now, just return zero if the
629b725ae77Skettenis ptrace call fails. */
630b725ae77Skettenis errno = 0;
631b725ae77Skettenis value = ptrace (PTRACE_PEEKUSER, tid,
632b725ae77Skettenis offsetof (struct user, u_debugreg[regnum]), 0);
633b725ae77Skettenis if (errno != 0)
634b725ae77Skettenis #if 0
635b725ae77Skettenis perror_with_name ("Couldn't read debug register");
636b725ae77Skettenis #else
637b725ae77Skettenis return 0;
638b725ae77Skettenis #endif
639b725ae77Skettenis
640b725ae77Skettenis return value;
641b725ae77Skettenis }
642b725ae77Skettenis
643b725ae77Skettenis static void
i386_linux_dr_set(int regnum,unsigned long value)644b725ae77Skettenis i386_linux_dr_set (int regnum, unsigned long value)
645b725ae77Skettenis {
646b725ae77Skettenis int tid;
647b725ae77Skettenis
648b725ae77Skettenis /* FIXME: kettenis/2001-01-29: It's not clear what we should do with
649b725ae77Skettenis multi-threaded processes here. For now, pretend there is just
650b725ae77Skettenis one thread. */
651b725ae77Skettenis tid = PIDGET (inferior_ptid);
652b725ae77Skettenis
653b725ae77Skettenis errno = 0;
654b725ae77Skettenis ptrace (PTRACE_POKEUSER, tid,
655b725ae77Skettenis offsetof (struct user, u_debugreg[regnum]), value);
656b725ae77Skettenis if (errno != 0)
657b725ae77Skettenis perror_with_name ("Couldn't write debug register");
658b725ae77Skettenis }
659b725ae77Skettenis
660b725ae77Skettenis void
i386_linux_dr_set_control(unsigned long control)661b725ae77Skettenis i386_linux_dr_set_control (unsigned long control)
662b725ae77Skettenis {
663b725ae77Skettenis i386_linux_dr_set (DR_CONTROL, control);
664b725ae77Skettenis }
665b725ae77Skettenis
666b725ae77Skettenis void
i386_linux_dr_set_addr(int regnum,CORE_ADDR addr)667b725ae77Skettenis i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
668b725ae77Skettenis {
669b725ae77Skettenis gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
670b725ae77Skettenis
671b725ae77Skettenis i386_linux_dr_set (DR_FIRSTADDR + regnum, addr);
672b725ae77Skettenis }
673b725ae77Skettenis
674b725ae77Skettenis void
i386_linux_dr_reset_addr(int regnum)675b725ae77Skettenis i386_linux_dr_reset_addr (int regnum)
676b725ae77Skettenis {
677b725ae77Skettenis gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
678b725ae77Skettenis
679b725ae77Skettenis i386_linux_dr_set (DR_FIRSTADDR + regnum, 0L);
680b725ae77Skettenis }
681b725ae77Skettenis
682b725ae77Skettenis unsigned long
i386_linux_dr_get_status(void)683b725ae77Skettenis i386_linux_dr_get_status (void)
684b725ae77Skettenis {
685b725ae77Skettenis return i386_linux_dr_get (DR_STATUS);
686b725ae77Skettenis }
687b725ae77Skettenis
688b725ae77Skettenis
689b725ae77Skettenis /* Called by libthread_db. Returns a pointer to the thread local
690b725ae77Skettenis storage (or its descriptor). */
691b725ae77Skettenis
692b725ae77Skettenis ps_err_e
ps_get_thread_area(const struct ps_prochandle * ph,lwpid_t lwpid,int idx,void ** base)693b725ae77Skettenis ps_get_thread_area (const struct ps_prochandle *ph,
694b725ae77Skettenis lwpid_t lwpid, int idx, void **base)
695b725ae77Skettenis {
696b725ae77Skettenis /* NOTE: cagney/2003-08-26: The definition of this buffer is found
697b725ae77Skettenis in the kernel header <asm-i386/ldt.h>. It, after padding, is 4 x
698b725ae77Skettenis 4 byte integers in size: `entry_number', `base_addr', `limit',
699b725ae77Skettenis and a bunch of status bits.
700b725ae77Skettenis
701b725ae77Skettenis The values returned by this ptrace call should be part of the
702b725ae77Skettenis regcache buffer, and ps_get_thread_area should channel its
703b725ae77Skettenis request through the regcache. That way remote targets could
704b725ae77Skettenis provide the value using the remote protocol and not this direct
705b725ae77Skettenis call.
706b725ae77Skettenis
707b725ae77Skettenis Is this function needed? I'm guessing that the `base' is the
708b725ae77Skettenis address of a a descriptor that libthread_db uses to find the
709*11efff7fSkettenis thread local address base that GDB needs. Perhaps that
710b725ae77Skettenis descriptor is defined by the ABI. Anyway, given that
711b725ae77Skettenis libthread_db calls this function without prompting (gdb
712b725ae77Skettenis requesting tls base) I guess it needs info in there anyway. */
713b725ae77Skettenis unsigned int desc[4];
714b725ae77Skettenis gdb_assert (sizeof (int) == 4);
715b725ae77Skettenis
716b725ae77Skettenis #ifndef PTRACE_GET_THREAD_AREA
717b725ae77Skettenis #define PTRACE_GET_THREAD_AREA 25
718b725ae77Skettenis #endif
719b725ae77Skettenis
720b725ae77Skettenis if (ptrace (PTRACE_GET_THREAD_AREA, lwpid,
721b725ae77Skettenis (void *) idx, (unsigned long) &desc) < 0)
722b725ae77Skettenis return PS_ERR;
723b725ae77Skettenis
724b725ae77Skettenis *(int *)base = desc[1];
725b725ae77Skettenis return PS_OK;
726b725ae77Skettenis }
727b725ae77Skettenis
728b725ae77Skettenis
729b725ae77Skettenis /* The instruction for a GNU/Linux system call is:
730b725ae77Skettenis int $0x80
731b725ae77Skettenis or 0xcd 0x80. */
732b725ae77Skettenis
733b725ae77Skettenis static const unsigned char linux_syscall[] = { 0xcd, 0x80 };
734b725ae77Skettenis
735b725ae77Skettenis #define LINUX_SYSCALL_LEN (sizeof linux_syscall)
736b725ae77Skettenis
737b725ae77Skettenis /* The system call number is stored in the %eax register. */
738*11efff7fSkettenis #define LINUX_SYSCALL_REGNUM I386_EAX_REGNUM
739b725ae77Skettenis
740b725ae77Skettenis /* We are specifically interested in the sigreturn and rt_sigreturn
741b725ae77Skettenis system calls. */
742b725ae77Skettenis
743b725ae77Skettenis #ifndef SYS_sigreturn
744b725ae77Skettenis #define SYS_sigreturn 0x77
745b725ae77Skettenis #endif
746b725ae77Skettenis #ifndef SYS_rt_sigreturn
747b725ae77Skettenis #define SYS_rt_sigreturn 0xad
748b725ae77Skettenis #endif
749b725ae77Skettenis
750b725ae77Skettenis /* Offset to saved processor flags, from <asm/sigcontext.h>. */
751b725ae77Skettenis #define LINUX_SIGCONTEXT_EFLAGS_OFFSET (64)
752b725ae77Skettenis
753b725ae77Skettenis /* Resume execution of the inferior process.
754b725ae77Skettenis If STEP is nonzero, single-step it.
755b725ae77Skettenis If SIGNAL is nonzero, give it that signal. */
756b725ae77Skettenis
757b725ae77Skettenis void
child_resume(ptid_t ptid,int step,enum target_signal signal)758b725ae77Skettenis child_resume (ptid_t ptid, int step, enum target_signal signal)
759b725ae77Skettenis {
760b725ae77Skettenis int pid = PIDGET (ptid);
761b725ae77Skettenis
762b725ae77Skettenis int request = PTRACE_CONT;
763b725ae77Skettenis
764b725ae77Skettenis if (pid == -1)
765b725ae77Skettenis /* Resume all threads. */
766b725ae77Skettenis /* I think this only gets used in the non-threaded case, where "resume
767b725ae77Skettenis all threads" and "resume inferior_ptid" are the same. */
768b725ae77Skettenis pid = PIDGET (inferior_ptid);
769b725ae77Skettenis
770b725ae77Skettenis if (step)
771b725ae77Skettenis {
772b725ae77Skettenis CORE_ADDR pc = read_pc_pid (pid_to_ptid (pid));
773b725ae77Skettenis unsigned char buf[LINUX_SYSCALL_LEN];
774b725ae77Skettenis
775b725ae77Skettenis request = PTRACE_SINGLESTEP;
776b725ae77Skettenis
777b725ae77Skettenis /* Returning from a signal trampoline is done by calling a
778b725ae77Skettenis special system call (sigreturn or rt_sigreturn, see
779b725ae77Skettenis i386-linux-tdep.c for more information). This system call
780b725ae77Skettenis restores the registers that were saved when the signal was
781b725ae77Skettenis raised, including %eflags. That means that single-stepping
782b725ae77Skettenis won't work. Instead, we'll have to modify the signal context
783b725ae77Skettenis that's about to be restored, and set the trace flag there. */
784b725ae77Skettenis
785b725ae77Skettenis /* First check if PC is at a system call. */
786*11efff7fSkettenis if (deprecated_read_memory_nobpt (pc, (char *) buf, LINUX_SYSCALL_LEN) == 0
787b725ae77Skettenis && memcmp (buf, linux_syscall, LINUX_SYSCALL_LEN) == 0)
788b725ae77Skettenis {
789b725ae77Skettenis int syscall = read_register_pid (LINUX_SYSCALL_REGNUM,
790b725ae77Skettenis pid_to_ptid (pid));
791b725ae77Skettenis
792b725ae77Skettenis /* Then check the system call number. */
793b725ae77Skettenis if (syscall == SYS_sigreturn || syscall == SYS_rt_sigreturn)
794b725ae77Skettenis {
795b725ae77Skettenis CORE_ADDR sp = read_register (I386_ESP_REGNUM);
796b725ae77Skettenis CORE_ADDR addr = sp;
797b725ae77Skettenis unsigned long int eflags;
798b725ae77Skettenis
799b725ae77Skettenis if (syscall == SYS_rt_sigreturn)
800b725ae77Skettenis addr = read_memory_integer (sp + 8, 4) + 20;
801b725ae77Skettenis
802b725ae77Skettenis /* Set the trace flag in the context that's about to be
803b725ae77Skettenis restored. */
804b725ae77Skettenis addr += LINUX_SIGCONTEXT_EFLAGS_OFFSET;
805b725ae77Skettenis read_memory (addr, (char *) &eflags, 4);
806b725ae77Skettenis eflags |= 0x0100;
807b725ae77Skettenis write_memory (addr, (char *) &eflags, 4);
808b725ae77Skettenis }
809b725ae77Skettenis }
810b725ae77Skettenis }
811b725ae77Skettenis
812b725ae77Skettenis if (ptrace (request, pid, 0, target_signal_to_host (signal)) == -1)
813b725ae77Skettenis perror_with_name ("ptrace");
814b725ae77Skettenis }
815b725ae77Skettenis
816b725ae77Skettenis void
child_post_startup_inferior(ptid_t ptid)817b725ae77Skettenis child_post_startup_inferior (ptid_t ptid)
818b725ae77Skettenis {
819b725ae77Skettenis i386_cleanup_dregs ();
820b725ae77Skettenis linux_child_post_startup_inferior (ptid);
821b725ae77Skettenis }
822