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) &regs) < 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 (&regs);
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) &regs) < 0)
290b725ae77Skettenis     perror_with_name ("Couldn't get registers");
291b725ae77Skettenis 
292b725ae77Skettenis   fill_gregset (&regs, regno);
293b725ae77Skettenis 
294b725ae77Skettenis   if (ptrace (PTRACE_SETREGS, tid, 0, (int) &regs) < 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