2000-04-10 Fernando Nasser <fnasser@cygnus.com>
[deliverable/binutils-gdb.git] / gdb / i386-linux-nat.c
1 /* Native-dependent code for Linux running on i386's, for GDB.
2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "defs.h"
22 #include "inferior.h"
23 #include "gdbcore.h"
24
25 /* For i386_linux_skip_solib_resolver. */
26 #include "symtab.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29
30 #include <sys/ptrace.h>
31 #include <sys/user.h>
32 #include <sys/procfs.h>
33
34 #ifdef HAVE_SYS_REG_H
35 #include <sys/reg.h>
36 #endif
37
38 /* On Linux, threads are implemented as pseudo-processes, in which
39 case we may be tracing more than one process at a time. In that
40 case, inferior_pid will contain the main process ID and the
41 individual thread (process) ID mashed together. These macros are
42 used to separate them out. These definitions should be overridden
43 if thread support is included. */
44
45 #if !defined (PIDGET) /* Default definition for PIDGET/TIDGET. */
46 #define PIDGET(PID) PID
47 #define TIDGET(PID) 0
48 #endif
49
50
51 /* The register sets used in Linux ELF core-dumps are identical to the
52 register sets in `struct user' that is used for a.out core-dumps,
53 and is also used by `ptrace'. The corresponding types are
54 `elf_gregset_t' for the general-purpose registers (with
55 `elf_greg_t' the type of a single GP register) and `elf_fpregset_t'
56 for the floating-point registers.
57
58 Those types used to be available under the names `gregset_t' and
59 `fpregset_t' too, and this file used those names in the past. But
60 those names are now used for the register sets used in the
61 `mcontext_t' type, and have a different size and layout. */
62
63 /* Mapping between the general-purpose registers in `struct user'
64 format and GDB's register array layout. */
65 static int regmap[] =
66 {
67 EAX, ECX, EDX, EBX,
68 UESP, EBP, ESI, EDI,
69 EIP, EFL, CS, SS,
70 DS, ES, FS, GS
71 };
72
73 /* Which ptrace request retrieves which registers?
74 These apply to the corresponding SET requests as well. */
75 #define GETREGS_SUPPLIES(regno) \
76 (0 <= (regno) && (regno) <= 15)
77 #define GETFPREGS_SUPPLIES(regno) \
78 (FP0_REGNUM <= (regno) && (regno) <= LAST_FPU_CTRL_REGNUM)
79 #define GETXFPREGS_SUPPLIES(regno) \
80 (FP0_REGNUM <= (regno) && (regno) <= MXCSR_REGNUM)
81
82 /* Does the current host support the GETREGS request? */
83 int have_ptrace_getregs =
84 #ifdef HAVE_PTRACE_GETREGS
85 1
86 #else
87 0
88 #endif
89 ;
90
91 /* Does the current host support the GETXFPREGS request? The header
92 file may or may not define it, and even if it is defined, the
93 kernel will return EIO if it's running on a pre-SSE processor.
94
95 PTRACE_GETXFPREGS is a Cygnus invention, since we wrote our own
96 Linux kernel patch for SSE support. That patch may or may not
97 actually make it into the official distribution. If you find that
98 years have gone by since this stuff was added, and Linux isn't
99 using PTRACE_GETXFPREGS, that means that our patch didn't make it,
100 and you can delete this, and the related code.
101
102 My instinct is to attach this to some architecture- or
103 target-specific data structure, but really, a particular GDB
104 process can only run on top of one kernel at a time. So it's okay
105 for this to be a simple variable. */
106 int have_ptrace_getxfpregs =
107 #ifdef HAVE_PTRACE_GETXFPREGS
108 1
109 #else
110 0
111 #endif
112 ;
113
114 \f
115 /* Fetching registers directly from the U area, one at a time. */
116
117 /* FIXME: kettenis/2000-03-05: This duplicates code from `inptrace.c'.
118 The problem is that we define FETCH_INFERIOR_REGISTERS since we
119 want to use our own versions of {fetch,store}_inferior_registers
120 that use the GETREGS request. This means that the code in
121 `infptrace.c' is #ifdef'd out. But we need to fall back on that
122 code when GDB is running on top of a kernel that doesn't support
123 the GETREGS request. I want to avoid changing `infptrace.c' right
124 now. */
125
126 /* Default the type of the ptrace transfer to int. */
127 #ifndef PTRACE_XFER_TYPE
128 #define PTRACE_XFER_TYPE int
129 #endif
130
131 /* Registers we shouldn't try to fetch. */
132 #if !defined (CANNOT_FETCH_REGISTER)
133 #define CANNOT_FETCH_REGISTER(regno) 0
134 #endif
135
136 /* Fetch one register. */
137
138 static void
139 fetch_register (regno)
140 int regno;
141 {
142 /* This isn't really an address. But ptrace thinks of it as one. */
143 CORE_ADDR regaddr;
144 char mess[128]; /* For messages */
145 register int i;
146 unsigned int offset; /* Offset of registers within the u area. */
147 char buf[MAX_REGISTER_RAW_SIZE];
148 int tid;
149
150 if (CANNOT_FETCH_REGISTER (regno))
151 {
152 memset (buf, '\0', REGISTER_RAW_SIZE (regno)); /* Supply zeroes */
153 supply_register (regno, buf);
154 return;
155 }
156
157 /* Overload thread id onto process id */
158 if ((tid = TIDGET (inferior_pid)) == 0)
159 tid = inferior_pid; /* no thread id, just use process id */
160
161 offset = U_REGS_OFFSET;
162
163 regaddr = register_addr (regno, offset);
164 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
165 {
166 errno = 0;
167 *(PTRACE_XFER_TYPE *) & buf[i] = ptrace (PT_READ_U, tid,
168 (PTRACE_ARG3_TYPE) regaddr, 0);
169 regaddr += sizeof (PTRACE_XFER_TYPE);
170 if (errno != 0)
171 {
172 sprintf (mess, "reading register %s (#%d)",
173 REGISTER_NAME (regno), regno);
174 perror_with_name (mess);
175 }
176 }
177 supply_register (regno, buf);
178 }
179
180 /* Fetch register values from the inferior.
181 If REGNO is negative, do this for all registers.
182 Otherwise, REGNO specifies which register (so we can save time). */
183
184 void
185 old_fetch_inferior_registers (regno)
186 int regno;
187 {
188 if (regno >= 0)
189 {
190 fetch_register (regno);
191 }
192 else
193 {
194 for (regno = 0; regno < ARCH_NUM_REGS; regno++)
195 {
196 fetch_register (regno);
197 }
198 }
199 }
200
201 /* Registers we shouldn't try to store. */
202 #if !defined (CANNOT_STORE_REGISTER)
203 #define CANNOT_STORE_REGISTER(regno) 0
204 #endif
205
206 /* Store one register. */
207
208 static void
209 store_register (regno)
210 int regno;
211 {
212 /* This isn't really an address. But ptrace thinks of it as one. */
213 CORE_ADDR regaddr;
214 char mess[128]; /* For messages */
215 register int i;
216 unsigned int offset; /* Offset of registers within the u area. */
217 int tid;
218
219 if (CANNOT_STORE_REGISTER (regno))
220 {
221 return;
222 }
223
224 /* Overload thread id onto process id */
225 if ((tid = TIDGET (inferior_pid)) == 0)
226 tid = inferior_pid; /* no thread id, just use process id */
227
228 offset = U_REGS_OFFSET;
229
230 regaddr = register_addr (regno, offset);
231 for (i = 0; i < REGISTER_RAW_SIZE (regno); i += sizeof (PTRACE_XFER_TYPE))
232 {
233 errno = 0;
234 ptrace (PT_WRITE_U, tid, (PTRACE_ARG3_TYPE) regaddr,
235 *(PTRACE_XFER_TYPE *) & registers[REGISTER_BYTE (regno) + i]);
236 regaddr += sizeof (PTRACE_XFER_TYPE);
237 if (errno != 0)
238 {
239 sprintf (mess, "writing register %s (#%d)",
240 REGISTER_NAME (regno), regno);
241 perror_with_name (mess);
242 }
243 }
244 }
245
246 /* Store our register values back into the inferior.
247 If REGNO is negative, do this for all registers.
248 Otherwise, REGNO specifies which register (so we can save time). */
249
250 void
251 old_store_inferior_registers (regno)
252 int regno;
253 {
254 if (regno >= 0)
255 {
256 store_register (regno);
257 }
258 else
259 {
260 for (regno = 0; regno < ARCH_NUM_REGS; regno++)
261 {
262 store_register (regno);
263 }
264 }
265 }
266
267 \f
268 /* Transfering the general-purpose registers between GDB, inferiors
269 and core files. */
270
271 /* Fill GDB's register array with the genereal-purpose register values
272 in *GREGSETP. */
273
274 void
275 supply_gregset (elf_gregset_t *gregsetp)
276 {
277 elf_greg_t *regp = (elf_greg_t *) gregsetp;
278 int regi;
279
280 for (regi = 0; regi < NUM_GREGS; regi++)
281 supply_register (regi, (char *) (regp + regmap[regi]));
282 }
283
284 /* Convert the valid general-purpose register values in GDB's register
285 array to `struct user' format and store them in *GREGSETP. The
286 array VALID indicates which register values are valid. If VALID is
287 NULL, all registers are assumed to be valid. */
288
289 static void
290 convert_to_gregset (elf_gregset_t *gregsetp, signed char *valid)
291 {
292 elf_greg_t *regp = (elf_greg_t *) gregsetp;
293 int regi;
294
295 for (regi = 0; regi < NUM_GREGS; regi++)
296 if (! valid || valid[regi])
297 *(regp + regmap[regi]) = * (int *) &registers[REGISTER_BYTE (regi)];
298 }
299
300 /* Fill register REGNO (if it is a general-purpose register) in
301 *GREGSETPS with the value in GDB's register array. If REGNO is -1,
302 do this for all registers. */
303 void
304 fill_gregset (elf_gregset_t *gregsetp, int regno)
305 {
306 if (regno == -1)
307 {
308 convert_to_gregset (gregsetp, NULL);
309 return;
310 }
311
312 if (GETREGS_SUPPLIES (regno))
313 {
314 signed char valid[NUM_GREGS];
315
316 memset (valid, 0, sizeof (valid));
317 valid[regno] = 1;
318
319 convert_to_gregset (gregsetp, valid);
320 }
321 }
322
323 #ifdef HAVE_PTRACE_GETREGS
324
325 /* Fetch all general-purpose registers from process/thread TID and
326 store their values in GDB's register array. */
327
328 static void
329 fetch_regs (int tid)
330 {
331 elf_gregset_t regs;
332 int ret;
333
334 ret = ptrace (PTRACE_GETREGS, tid, 0, (int) &regs);
335 if (ret < 0)
336 {
337 if (errno == EIO)
338 {
339 /* The kernel we're running on doesn't support the GETREGS
340 request. Reset `have_ptrace_getregs'. */
341 have_ptrace_getregs = 0;
342 return;
343 }
344
345 warning ("Couldn't get registers.");
346 return;
347 }
348
349 supply_gregset (&regs);
350 }
351
352 /* Store all valid general-purpose registers in GDB's register array
353 into the process/thread specified by TID. */
354
355 static void
356 store_regs (int tid)
357 {
358 elf_gregset_t regs;
359 int ret;
360
361 ret = ptrace (PTRACE_GETREGS, tid, 0, (int) &regs);
362 if (ret < 0)
363 {
364 warning ("Couldn't get registers.");
365 return;
366 }
367
368 convert_to_gregset (&regs, register_valid);
369
370 ret = ptrace (PTRACE_SETREGS, tid, 0, (int) &regs);
371 if (ret < 0)
372 {
373 warning ("Couldn't write registers.");
374 return;
375 }
376 }
377
378 #else
379
380 static void fetch_regs (int tid) {}
381 static void store_regs (int tid) {}
382
383 #endif
384
385 \f
386 /* Transfering floating-point registers between GDB, inferiors and cores. */
387
388 /* What is the address of st(N) within the floating-point register set F? */
389 #define FPREG_ADDR(f, n) ((char *) &(f)->st_space + (n) * 10)
390
391 /* Fill GDB's register array with the floating-point register values in
392 *FPREGSETP. */
393
394 void
395 supply_fpregset (elf_fpregset_t *fpregsetp)
396 {
397 int reg;
398 long l;
399
400 /* Supply the floating-point registers. */
401 for (reg = 0; reg < 8; reg++)
402 supply_register (FP0_REGNUM + reg, FPREG_ADDR (fpregsetp, reg));
403
404 /* We have to mask off the reserved bits in *FPREGSETP before
405 storing the values in GDB's register file. */
406 #define supply(REGNO, MEMBER) \
407 l = fpregsetp->MEMBER & 0xffff; \
408 supply_register (REGNO, (char *) &l)
409
410 supply (FCTRL_REGNUM, cwd);
411 supply (FSTAT_REGNUM, swd);
412 supply (FTAG_REGNUM, twd);
413 supply_register (FCOFF_REGNUM, (char *) &fpregsetp->fip);
414 supply (FDS_REGNUM, fos);
415 supply_register (FDOFF_REGNUM, (char *) &fpregsetp->foo);
416
417 #undef supply
418
419 /* Extract the code segment and opcode from the "fcs" member. */
420 l = fpregsetp->fcs & 0xffff;
421 supply_register (FCS_REGNUM, (char *) &l);
422
423 l = (fpregsetp->fcs >> 16) & ((1 << 11) - 1);
424 supply_register (FOP_REGNUM, (char *) &l);
425 }
426
427 /* Convert the valid floating-point register values in GDB's register
428 array to `struct user' format and store them in *FPREGSETP. The
429 array VALID indicates which register values are valid. If VALID is
430 NULL, all registers are assumed to be valid. */
431
432 static void
433 convert_to_fpregset (elf_fpregset_t *fpregsetp, signed char *valid)
434 {
435 int reg;
436
437 /* Fill in the floating-point registers. */
438 for (reg = 0; reg < 8; reg++)
439 if (!valid || valid[reg])
440 memcpy (FPREG_ADDR (fpregsetp, reg),
441 &registers[REGISTER_BYTE (FP0_REGNUM + reg)],
442 REGISTER_RAW_SIZE(FP0_REGNUM + reg));
443
444 /* We're not supposed to touch the reserved bits in *FPREGSETP. */
445
446 #define fill(MEMBER, REGNO) \
447 if (! valid || valid[(REGNO)]) \
448 fpregsetp->MEMBER \
449 = ((fpregsetp->MEMBER & ~0xffff) \
450 | (* (int *) &registers[REGISTER_BYTE (REGNO)] & 0xffff))
451
452 #define fill_register(MEMBER, REGNO) \
453 if (! valid || valid[(REGNO)]) \
454 memcpy (&fpregsetp->MEMBER, &registers[REGISTER_BYTE (REGNO)], \
455 sizeof (fpregsetp->MEMBER))
456
457 fill (cwd, FCTRL_REGNUM);
458 fill (swd, FSTAT_REGNUM);
459 fill (twd, FTAG_REGNUM);
460 fill_register (fip, FCOFF_REGNUM);
461 fill (foo, FDOFF_REGNUM);
462 fill_register (fos, FDS_REGNUM);
463
464 #undef fill
465 #undef fill_register
466
467 if (! valid || valid[FCS_REGNUM])
468 fpregsetp->fcs
469 = ((fpregsetp->fcs & ~0xffff)
470 | (* (int *) &registers[REGISTER_BYTE (FCS_REGNUM)] & 0xffff));
471
472 if (! valid || valid[FOP_REGNUM])
473 fpregsetp->fcs
474 = ((fpregsetp->fcs & 0xffff)
475 | ((*(int *) &registers[REGISTER_BYTE (FOP_REGNUM)] & ((1 << 11) - 1))
476 << 16));
477 }
478
479 /* Fill register REGNO (if it is a floating-point register) in
480 *FPREGSETP with the value in GDB's register array. If REGNO is -1,
481 do this for all registers. */
482
483 void
484 fill_fpregset (elf_fpregset_t *fpregsetp, int regno)
485 {
486 if (regno == -1)
487 {
488 convert_to_fpregset (fpregsetp, NULL);
489 return;
490 }
491
492 if (GETFPREGS_SUPPLIES(regno))
493 {
494 signed char valid[MAX_NUM_REGS];
495
496 memset (valid, 0, sizeof (valid));
497 valid[regno] = 1;
498
499 convert_to_fpregset (fpregsetp, valid);
500 }
501 }
502
503 #ifdef HAVE_PTRACE_GETREGS
504
505 /* Fetch all floating-point registers from process/thread TID and store
506 thier values in GDB's register array. */
507
508 static void
509 fetch_fpregs (int tid)
510 {
511 elf_fpregset_t fpregs;
512 int ret;
513
514 ret = ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs);
515 if (ret < 0)
516 {
517 warning ("Couldn't get floating point status.");
518 return;
519 }
520
521 supply_fpregset (&fpregs);
522 }
523
524 /* Store all valid floating-point registers in GDB's register array
525 into the process/thread specified by TID. */
526
527 static void
528 store_fpregs (int tid)
529 {
530 elf_fpregset_t fpregs;
531 int ret;
532
533 ret = ptrace (PTRACE_GETFPREGS, tid, 0, (int) &fpregs);
534 if (ret < 0)
535 {
536 warning ("Couldn't get floating point status.");
537 return;
538 }
539
540 convert_to_fpregset (&fpregs, register_valid);
541
542 ret = ptrace (PTRACE_SETFPREGS, tid, 0, (int) &fpregs);
543 if (ret < 0)
544 {
545 warning ("Couldn't write floating point status.");
546 return;
547 }
548 }
549
550 #else
551
552 static void fetch_fpregs (int tid) {}
553 static void store_fpregs (int tid) {}
554
555 #endif
556
557 \f
558 /* Transfering floating-point and SSE registers to and from GDB. */
559
560 /* PTRACE_GETXFPREGS is a Cygnus invention, since we wrote our own
561 Linux kernel patch for SSE support. That patch may or may not
562 actually make it into the official distribution. If you find that
563 years have gone by since this code was added, and Linux isn't using
564 PTRACE_GETXFPREGS, that means that our patch didn't make it, and
565 you can delete this code. */
566
567 #ifdef HAVE_PTRACE_GETXFPREGS
568
569 /* Fill GDB's register array with the floating-point and SSE register
570 values in *XFPREGS. */
571
572 static void
573 supply_xfpregset (struct user_xfpregs_struct *xfpregs)
574 {
575 int reg;
576
577 /* Supply the floating-point registers. */
578 for (reg = 0; reg < 8; reg++)
579 supply_register (FP0_REGNUM + reg, (char *) &xfpregs->st_space[reg]);
580
581 {
582 supply_register (FCTRL_REGNUM, (char *) &xfpregs->cwd);
583 supply_register (FSTAT_REGNUM, (char *) &xfpregs->swd);
584 supply_register (FTAG_REGNUM, (char *) &xfpregs->twd);
585 supply_register (FCOFF_REGNUM, (char *) &xfpregs->fip);
586 supply_register (FDS_REGNUM, (char *) &xfpregs->fos);
587 supply_register (FDOFF_REGNUM, (char *) &xfpregs->foo);
588
589 /* Extract the code segment and opcode from the "fcs" member. */
590 {
591 long l;
592
593 l = xfpregs->fcs & 0xffff;
594 supply_register (FCS_REGNUM, (char *) &l);
595
596 l = (xfpregs->fcs >> 16) & ((1 << 11) - 1);
597 supply_register (FOP_REGNUM, (char *) &l);
598 }
599 }
600
601 /* Supply the SSE registers. */
602 for (reg = 0; reg < 8; reg++)
603 supply_register (XMM0_REGNUM + reg, (char *) &xfpregs->xmm_space[reg]);
604 supply_register (MXCSR_REGNUM, (char *) &xfpregs->mxcsr);
605 }
606
607 /* Convert the valid floating-point and SSE registers in GDB's
608 register array to `struct user' format and store them in *XFPREGS.
609 The array VALID indicates which registers are valid. If VALID is
610 NULL, all registers are assumed to be valid. */
611
612 static void
613 convert_to_xfpregset (struct user_xfpregs_struct *xfpregs,
614 signed char *valid)
615 {
616 int reg;
617
618 /* Fill in the floating-point registers. */
619 for (reg = 0; reg < 8; reg++)
620 if (!valid || valid[reg])
621 memcpy (&xfpregs->st_space[reg],
622 &registers[REGISTER_BYTE (FP0_REGNUM + reg)],
623 REGISTER_RAW_SIZE(FP0_REGNUM + reg));
624
625 #define fill(MEMBER, REGNO) \
626 if (! valid || valid[(REGNO)]) \
627 memcpy (&xfpregs->MEMBER, &registers[REGISTER_BYTE (REGNO)], \
628 sizeof (xfpregs->MEMBER))
629
630 fill (cwd, FCTRL_REGNUM);
631 fill (swd, FSTAT_REGNUM);
632 fill (twd, FTAG_REGNUM);
633 fill (fip, FCOFF_REGNUM);
634 fill (foo, FDOFF_REGNUM);
635 fill (fos, FDS_REGNUM);
636
637 #undef fill
638
639 if (! valid || valid[FCS_REGNUM])
640 xfpregs->fcs
641 = ((xfpregs->fcs & ~0xffff)
642 | (* (int *) &registers[REGISTER_BYTE (FCS_REGNUM)] & 0xffff));
643
644 if (! valid || valid[FOP_REGNUM])
645 xfpregs->fcs
646 = ((xfpregs->fcs & 0xffff)
647 | ((*(int *) &registers[REGISTER_BYTE (FOP_REGNUM)] & ((1 << 11) - 1))
648 << 16));
649
650 /* Fill in the XMM registers. */
651 for (reg = 0; reg < 8; reg++)
652 if (! valid || valid[reg])
653 memcpy (&xfpregs->xmm_space[reg],
654 &registers[REGISTER_BYTE (XMM0_REGNUM + reg)],
655 REGISTER_RAW_SIZE (XMM0_REGNUM + reg));
656 }
657
658 /* Fetch all registers covered by the PTRACE_SETXFPREGS request from
659 process/thread TID and store their values in GDB's register array.
660 Return non-zero if successful, zero otherwise. */
661
662 static int
663 fetch_xfpregs (int tid)
664 {
665 struct user_xfpregs_struct xfpregs;
666 int ret;
667
668 if (! have_ptrace_getxfpregs)
669 return 0;
670
671 ret = ptrace (PTRACE_GETXFPREGS, tid, 0, &xfpregs);
672 if (ret == -1)
673 {
674 if (errno == EIO)
675 {
676 have_ptrace_getxfpregs = 0;
677 return 0;
678 }
679
680 warning ("Couldn't read floating-point and SSE registers.");
681 return 0;
682 }
683
684 supply_xfpregset (&xfpregs);
685 return 1;
686 }
687
688 /* Store all valid registers in GDB's register array covered by the
689 PTRACE_SETXFPREGS request into the process/thread specified by TID.
690 Return non-zero if successful, zero otherwise. */
691
692 static int
693 store_xfpregs (int tid)
694 {
695 struct user_xfpregs_struct xfpregs;
696 int ret;
697
698 if (! have_ptrace_getxfpregs)
699 return 0;
700
701 ret = ptrace (PTRACE_GETXFPREGS, tid, 0, &xfpregs);
702 if (ret == -1)
703 {
704 if (errno == EIO)
705 {
706 have_ptrace_getxfpregs = 0;
707 return 0;
708 }
709
710 warning ("Couldn't read floating-point and SSE registers.");
711 return 0;
712 }
713
714 convert_to_xfpregset (&xfpregs, register_valid);
715
716 if (ptrace (PTRACE_SETXFPREGS, tid, 0, &xfpregs) < 0)
717 {
718 warning ("Couldn't write floating-point and SSE registers.");
719 return 0;
720 }
721
722 return 1;
723 }
724
725 /* Fill the XMM registers in the register array with dummy values. For
726 cases where we don't have access to the XMM registers. I think
727 this is cleaner than printing a warning. For a cleaner solution,
728 we should gdbarchify the i386 family. */
729
730 static void
731 dummy_sse_values (void)
732 {
733 /* C doesn't have a syntax for NaN's, so write it out as an array of
734 longs. */
735 static long dummy[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff };
736 static long mxcsr = 0x1f80;
737 int reg;
738
739 for (reg = 0; reg < 8; reg++)
740 supply_register (XMM0_REGNUM + reg, (char *) dummy);
741 supply_register (MXCSR_REGNUM, (char *) &mxcsr);
742 }
743
744 #else
745
746 /* Stub versions of the above routines, for systems that don't have
747 PTRACE_GETXFPREGS. */
748 static int store_xfpregs (int tid) { return 0; }
749 static int fetch_xfpregs (int tid) { return 0; }
750 static void dummy_sse_values (void) {}
751
752 #endif
753
754 \f
755 /* Transferring arbitrary registers between GDB and inferior. */
756
757 /* Fetch register REGNO from the child process. If REGNO is -1, do
758 this for all registers (including the floating point and SSE
759 registers). */
760
761 void
762 fetch_inferior_registers (int regno)
763 {
764 int tid;
765
766 /* Use the old method of peeking around in `struct user' if the
767 GETREGS request isn't available. */
768 if (! have_ptrace_getregs)
769 {
770 old_fetch_inferior_registers (regno);
771 return;
772 }
773
774 /* Linux LWP ID's are process ID's. */
775 if ((tid = TIDGET (inferior_pid)) == 0)
776 tid = inferior_pid; /* Not a threaded program. */
777
778 /* Use the PTRACE_GETXFPREGS request whenever possible, since it
779 transfers more registers in one system call, and we'll cache the
780 results. But remember that fetch_xfpregs can fail, and return
781 zero. */
782 if (regno == -1)
783 {
784 fetch_regs (tid);
785
786 /* The call above might reset `have_ptrace_getregs'. */
787 if (! have_ptrace_getregs)
788 {
789 old_fetch_inferior_registers (-1);
790 return;
791 }
792
793 if (fetch_xfpregs (tid))
794 return;
795 fetch_fpregs (tid);
796 return;
797 }
798
799 if (GETREGS_SUPPLIES (regno))
800 {
801 fetch_regs (tid);
802 return;
803 }
804
805 if (GETXFPREGS_SUPPLIES (regno))
806 {
807 if (fetch_xfpregs (tid))
808 return;
809
810 /* Either our processor or our kernel doesn't support the SSE
811 registers, so read the FP registers in the traditional way,
812 and fill the SSE registers with dummy values. It would be
813 more graceful to handle differences in the register set using
814 gdbarch. Until then, this will at least make things work
815 plausibly. */
816 fetch_fpregs (tid);
817 dummy_sse_values ();
818 return;
819 }
820
821 internal_error ("i386-linux-nat.c (fetch_inferior_registers): "
822 "got request for bad register number %d", regno);
823 }
824
825 /* Store register REGNO back into the child process. If REGNO is -1,
826 do this for all registers (including the floating point and SSE
827 registers). */
828 void
829 store_inferior_registers (int regno)
830 {
831 int tid;
832
833 /* Use the old method of poking around in `struct user' if the
834 SETREGS request isn't available. */
835 if (! have_ptrace_getregs)
836 {
837 old_store_inferior_registers (regno);
838 return;
839 }
840
841 /* Linux LWP ID's are process ID's. */
842 if ((tid = TIDGET (inferior_pid)) == 0)
843 tid = inferior_pid; /* Not a threaded program. */
844
845 /* Use the PTRACE_SETXFPREGS requests whenever possibl, since it
846 transfers more registers in one system call. But remember that
847 store_xfpregs can fail, and return zero. */
848 if (regno == -1)
849 {
850 store_regs (tid);
851 if (store_xfpregs (tid))
852 return;
853 store_fpregs (tid);
854 return;
855 }
856
857 if (GETREGS_SUPPLIES (regno))
858 {
859 store_regs (tid);
860 return;
861 }
862
863 if (GETXFPREGS_SUPPLIES (regno))
864 {
865 if (store_xfpregs (tid))
866 return;
867
868 /* Either our processor or our kernel doesn't support the SSE
869 registers, so just write the FP registers in the traditional
870 way. */
871 store_fpregs (tid);
872 return;
873 }
874
875 internal_error ("Got request to store bad register number %d.", regno);
876 }
877
878 \f
879 /* Interpreting register set info found in core files. */
880
881 /* Provide registers to GDB from a core file.
882
883 (We can't use the generic version of this function in
884 core-regset.c, because Linux has *three* different kinds of
885 register set notes. core-regset.c would have to call
886 supply_xfpregset, which most platforms don't have.)
887
888 CORE_REG_SECT points to an array of bytes, which are the contents
889 of a `note' from a core file which BFD thinks might contain
890 register contents. CORE_REG_SIZE is its size.
891
892 WHICH says which register set corelow suspects this is:
893 0 --- the general-purpose register set, in elf_gregset_t format
894 2 --- the floating-point register set, in elf_fpregset_t format
895 3 --- the extended floating-point register set, in struct
896 user_xfpregs_struct format
897
898 REG_ADDR isn't used on Linux. */
899
900 static void
901 fetch_core_registers (char *core_reg_sect, unsigned core_reg_size,
902 int which, CORE_ADDR reg_addr)
903 {
904 elf_gregset_t gregset;
905 elf_fpregset_t fpregset;
906
907 switch (which)
908 {
909 case 0:
910 if (core_reg_size != sizeof (gregset))
911 warning ("Wrong size gregset in core file.");
912 else
913 {
914 memcpy (&gregset, core_reg_sect, sizeof (gregset));
915 supply_gregset (&gregset);
916 }
917 break;
918
919 case 2:
920 if (core_reg_size != sizeof (fpregset))
921 warning ("Wrong size fpregset in core file.");
922 else
923 {
924 memcpy (&fpregset, core_reg_sect, sizeof (fpregset));
925 supply_fpregset (&fpregset);
926 }
927 break;
928
929 #ifdef HAVE_PTRACE_GETXFPREGS
930 {
931 struct user_xfpregs_struct xfpregset;
932
933 case 3:
934 if (core_reg_size != sizeof (xfpregset))
935 warning ("Wrong size user_xfpregs_struct in core file.");
936 else
937 {
938 memcpy (&xfpregset, core_reg_sect, sizeof (xfpregset));
939 supply_xfpregset (&xfpregset);
940 }
941 break;
942 }
943 #endif
944
945 default:
946 /* We've covered all the kinds of registers we know about here,
947 so this must be something we wouldn't know what to do with
948 anyway. Just ignore it. */
949 break;
950 }
951 }
952
953 \f
954 /* Calling functions in shared libraries. */
955 /* FIXME: kettenis/2000-03-05: Doesn't this belong in a
956 target-dependent file? The function
957 `i386_linux_skip_solib_resolver' is mentioned in
958 `config/i386/tm-linux.h'. */
959
960 /* Find the minimal symbol named NAME, and return both the minsym
961 struct and its objfile. This probably ought to be in minsym.c, but
962 everything there is trying to deal with things like C++ and
963 SOFUN_ADDRESS_MAYBE_TURQUOISE, ... Since this is so simple, it may
964 be considered too special-purpose for general consumption. */
965
966 static struct minimal_symbol *
967 find_minsym_and_objfile (char *name, struct objfile **objfile_p)
968 {
969 struct objfile *objfile;
970
971 ALL_OBJFILES (objfile)
972 {
973 struct minimal_symbol *msym;
974
975 ALL_OBJFILE_MSYMBOLS (objfile, msym)
976 {
977 if (SYMBOL_NAME (msym)
978 && STREQ (SYMBOL_NAME (msym), name))
979 {
980 *objfile_p = objfile;
981 return msym;
982 }
983 }
984 }
985
986 return 0;
987 }
988
989
990 static CORE_ADDR
991 skip_hurd_resolver (CORE_ADDR pc)
992 {
993 /* The HURD dynamic linker is part of the GNU C library, so many
994 GNU/Linux distributions use it. (All ELF versions, as far as I
995 know.) An unresolved PLT entry points to "_dl_runtime_resolve",
996 which calls "fixup" to patch the PLT, and then passes control to
997 the function.
998
999 We look for the symbol `_dl_runtime_resolve', and find `fixup' in
1000 the same objfile. If we are at the entry point of `fixup', then
1001 we set a breakpoint at the return address (at the top of the
1002 stack), and continue.
1003
1004 It's kind of gross to do all these checks every time we're
1005 called, since they don't change once the executable has gotten
1006 started. But this is only a temporary hack --- upcoming versions
1007 of Linux will provide a portable, efficient interface for
1008 debugging programs that use shared libraries. */
1009
1010 struct objfile *objfile;
1011 struct minimal_symbol *resolver
1012 = find_minsym_and_objfile ("_dl_runtime_resolve", &objfile);
1013
1014 if (resolver)
1015 {
1016 struct minimal_symbol *fixup
1017 = lookup_minimal_symbol ("fixup", 0, objfile);
1018
1019 if (fixup && SYMBOL_VALUE_ADDRESS (fixup) == pc)
1020 return (SAVED_PC_AFTER_CALL (get_current_frame ()));
1021 }
1022
1023 return 0;
1024 }
1025
1026 /* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
1027 This function:
1028 1) decides whether a PLT has sent us into the linker to resolve
1029 a function reference, and
1030 2) if so, tells us where to set a temporary breakpoint that will
1031 trigger when the dynamic linker is done. */
1032
1033 CORE_ADDR
1034 i386_linux_skip_solib_resolver (CORE_ADDR pc)
1035 {
1036 CORE_ADDR result;
1037
1038 /* Plug in functions for other kinds of resolvers here. */
1039 result = skip_hurd_resolver (pc);
1040 if (result)
1041 return result;
1042
1043 return 0;
1044 }
1045
1046 \f
1047 /* Register that we are able to handle Linux ELF core file formats. */
1048
1049 static struct core_fns linux_elf_core_fns =
1050 {
1051 bfd_target_elf_flavour, /* core_flavour */
1052 default_check_format, /* check_format */
1053 default_core_sniffer, /* core_sniffer */
1054 fetch_core_registers, /* core_read_registers */
1055 NULL /* next */
1056 };
1057
1058 void
1059 _initialize_i386_linux_nat ()
1060 {
1061 add_core_fns (&linux_elf_core_fns);
1062 }
This page took 0.076717 seconds and 4 git commands to generate.