1 /* Target-dependent code for GNU/Linux, architecture independent.
3 Copyright (C) 2009-2014 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 #include "linux-tdep.h"
25 #include "gdbthread.h"
29 #include "elf/common.h"
30 #include "elf-bfd.h" /* for elfcore_write_* */
32 #include "cli/cli-utils.h"
33 #include "arch-utils.h"
34 #include "gdb_obstack.h"
38 /* This enum represents the signals' numbers on a generic architecture
39 running the Linux kernel. The definition of "generic" comes from
40 the file <include/uapi/asm-generic/signal.h>, from the Linux kernel
41 tree, which is the "de facto" implementation of signal numbers to
42 be used by new architecture ports.
44 For those architectures which have differences between the generic
45 standard (e.g., Alpha), we define the different signals (and *only*
46 those) in the specific target-dependent file (e.g.,
47 alpha-linux-tdep.c, for Alpha). Please refer to the architecture's
48 tdep file for more information.
50 ARM deserves a special mention here. On the file
51 <arch/arm/include/uapi/asm/signal.h>, it defines only one different
52 (and ARM-only) signal, which is SIGSWI, with the same number as
53 SIGRTMIN. This signal is used only for a very specific target,
54 called ArthurOS (from RISCOS). Therefore, we do not handle it on
55 the ARM-tdep file, and we can safely use the generic signal handler
58 As stated above, this enum is derived from
59 <include/uapi/asm-generic/signal.h>, from the Linux kernel
94 LINUX_SIGPOLL = LINUX_SIGIO,
103 static struct gdbarch_data *linux_gdbarch_data_handle;
105 struct linux_gdbarch_data
107 struct type *siginfo_type;
111 init_linux_gdbarch_data (struct gdbarch *gdbarch)
113 return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct linux_gdbarch_data);
116 static struct linux_gdbarch_data *
117 get_linux_gdbarch_data (struct gdbarch *gdbarch)
119 return gdbarch_data (gdbarch, linux_gdbarch_data_handle);
122 /* This function is suitable for architectures that don't
123 extend/override the standard siginfo structure. */
126 linux_get_siginfo_type (struct gdbarch *gdbarch)
128 struct linux_gdbarch_data *linux_gdbarch_data;
129 struct type *int_type, *uint_type, *long_type, *void_ptr_type;
130 struct type *uid_type, *pid_type;
131 struct type *sigval_type, *clock_type;
132 struct type *siginfo_type, *sifields_type;
135 linux_gdbarch_data = get_linux_gdbarch_data (gdbarch);
136 if (linux_gdbarch_data->siginfo_type != NULL)
137 return linux_gdbarch_data->siginfo_type;
139 int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
141 uint_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
143 long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
145 void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void);
148 sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
149 TYPE_NAME (sigval_type) = xstrdup ("sigval_t");
150 append_composite_type_field (sigval_type, "sival_int", int_type);
151 append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type);
154 pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
155 TYPE_LENGTH (int_type), "__pid_t");
156 TYPE_TARGET_TYPE (pid_type) = int_type;
157 TYPE_TARGET_STUB (pid_type) = 1;
160 uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
161 TYPE_LENGTH (uint_type), "__uid_t");
162 TYPE_TARGET_TYPE (uid_type) = uint_type;
163 TYPE_TARGET_STUB (uid_type) = 1;
166 clock_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
167 TYPE_LENGTH (long_type), "__clock_t");
168 TYPE_TARGET_TYPE (clock_type) = long_type;
169 TYPE_TARGET_STUB (clock_type) = 1;
172 sifields_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
175 const int si_max_size = 128;
177 int size_of_int = gdbarch_int_bit (gdbarch) / HOST_CHAR_BIT;
180 if (gdbarch_ptr_bit (gdbarch) == 64)
181 si_pad_size = (si_max_size / size_of_int) - 4;
183 si_pad_size = (si_max_size / size_of_int) - 3;
184 append_composite_type_field (sifields_type, "_pad",
185 init_vector_type (int_type, si_pad_size));
189 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
190 append_composite_type_field (type, "si_pid", pid_type);
191 append_composite_type_field (type, "si_uid", uid_type);
192 append_composite_type_field (sifields_type, "_kill", type);
195 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
196 append_composite_type_field (type, "si_tid", int_type);
197 append_composite_type_field (type, "si_overrun", int_type);
198 append_composite_type_field (type, "si_sigval", sigval_type);
199 append_composite_type_field (sifields_type, "_timer", type);
202 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
203 append_composite_type_field (type, "si_pid", pid_type);
204 append_composite_type_field (type, "si_uid", uid_type);
205 append_composite_type_field (type, "si_sigval", sigval_type);
206 append_composite_type_field (sifields_type, "_rt", type);
209 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
210 append_composite_type_field (type, "si_pid", pid_type);
211 append_composite_type_field (type, "si_uid", uid_type);
212 append_composite_type_field (type, "si_status", int_type);
213 append_composite_type_field (type, "si_utime", clock_type);
214 append_composite_type_field (type, "si_stime", clock_type);
215 append_composite_type_field (sifields_type, "_sigchld", type);
218 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
219 append_composite_type_field (type, "si_addr", void_ptr_type);
220 append_composite_type_field (sifields_type, "_sigfault", type);
223 type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
224 append_composite_type_field (type, "si_band", long_type);
225 append_composite_type_field (type, "si_fd", int_type);
226 append_composite_type_field (sifields_type, "_sigpoll", type);
229 siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
230 TYPE_NAME (siginfo_type) = xstrdup ("siginfo");
231 append_composite_type_field (siginfo_type, "si_signo", int_type);
232 append_composite_type_field (siginfo_type, "si_errno", int_type);
233 append_composite_type_field (siginfo_type, "si_code", int_type);
234 append_composite_type_field_aligned (siginfo_type,
235 "_sifields", sifields_type,
236 TYPE_LENGTH (long_type));
238 linux_gdbarch_data->siginfo_type = siginfo_type;
243 /* Return true if the target is running on uClinux instead of normal
247 linux_is_uclinux (void)
251 return (target_auxv_search (¤t_target, AT_NULL, &dummy) > 0
252 && target_auxv_search (¤t_target, AT_PAGESZ, &dummy) == 0);
256 linux_has_shared_address_space (struct gdbarch *gdbarch)
258 return linux_is_uclinux ();
261 /* This is how we want PTIDs from core files to be printed. */
264 linux_core_pid_to_str (struct gdbarch *gdbarch, ptid_t ptid)
268 if (ptid_get_lwp (ptid) != 0)
270 snprintf (buf, sizeof (buf), "LWP %ld", ptid_get_lwp (ptid));
274 return normal_pid_to_str (ptid);
277 /* Service function for corefiles and info proc. */
280 read_mapping (const char *line,
281 ULONGEST *addr, ULONGEST *endaddr,
282 const char **permissions, size_t *permissions_len,
284 const char **device, size_t *device_len,
286 const char **filename)
288 const char *p = line;
290 *addr = strtoulst (p, &p, 16);
293 *endaddr = strtoulst (p, &p, 16);
295 p = skip_spaces_const (p);
297 while (*p && !isspace (*p))
299 *permissions_len = p - *permissions;
301 *offset = strtoulst (p, &p, 16);
303 p = skip_spaces_const (p);
305 while (*p && !isspace (*p))
307 *device_len = p - *device;
309 *inode = strtoulst (p, &p, 10);
311 p = skip_spaces_const (p);
315 /* Implement the "info proc" command. */
318 linux_info_proc (struct gdbarch *gdbarch, char *args,
319 enum info_proc_what what)
321 /* A long is used for pid instead of an int to avoid a loss of precision
322 compiler warning from the output of strtoul. */
324 int cmdline_f = (what == IP_MINIMAL || what == IP_CMDLINE || what == IP_ALL);
325 int cwd_f = (what == IP_MINIMAL || what == IP_CWD || what == IP_ALL);
326 int exe_f = (what == IP_MINIMAL || what == IP_EXE || what == IP_ALL);
327 int mappings_f = (what == IP_MAPPINGS || what == IP_ALL);
328 int status_f = (what == IP_STATUS || what == IP_ALL);
329 int stat_f = (what == IP_STAT || what == IP_ALL);
334 if (args && isdigit (args[0]))
335 pid = strtoul (args, &args, 10);
338 if (!target_has_execution)
339 error (_("No current process: you must name one."));
340 if (current_inferior ()->fake_pid_p)
341 error (_("Can't determine the current process's PID: you must name one."));
343 pid = current_inferior ()->pid;
346 args = skip_spaces (args);
348 error (_("Too many parameters: %s"), args);
350 printf_filtered (_("process %ld\n"), pid);
353 xsnprintf (filename, sizeof filename, "/proc/%ld/cmdline", pid);
354 data = target_fileio_read_stralloc (filename);
357 struct cleanup *cleanup = make_cleanup (xfree, data);
358 printf_filtered ("cmdline = '%s'\n", data);
359 do_cleanups (cleanup);
362 warning (_("unable to open /proc file '%s'"), filename);
366 xsnprintf (filename, sizeof filename, "/proc/%ld/cwd", pid);
367 data = target_fileio_readlink (filename, &target_errno);
370 struct cleanup *cleanup = make_cleanup (xfree, data);
371 printf_filtered ("cwd = '%s'\n", data);
372 do_cleanups (cleanup);
375 warning (_("unable to read link '%s'"), filename);
379 xsnprintf (filename, sizeof filename, "/proc/%ld/exe", pid);
380 data = target_fileio_readlink (filename, &target_errno);
383 struct cleanup *cleanup = make_cleanup (xfree, data);
384 printf_filtered ("exe = '%s'\n", data);
385 do_cleanups (cleanup);
388 warning (_("unable to read link '%s'"), filename);
392 xsnprintf (filename, sizeof filename, "/proc/%ld/maps", pid);
393 data = target_fileio_read_stralloc (filename);
396 struct cleanup *cleanup = make_cleanup (xfree, data);
399 printf_filtered (_("Mapped address spaces:\n\n"));
400 if (gdbarch_addr_bit (gdbarch) == 32)
402 printf_filtered ("\t%10s %10s %10s %10s %s\n",
405 " Size", " Offset", "objfile");
409 printf_filtered (" %18s %18s %10s %10s %s\n",
412 " Size", " Offset", "objfile");
415 for (line = strtok (data, "\n"); line; line = strtok (NULL, "\n"))
417 ULONGEST addr, endaddr, offset, inode;
418 const char *permissions, *device, *filename;
419 size_t permissions_len, device_len;
421 read_mapping (line, &addr, &endaddr,
422 &permissions, &permissions_len,
423 &offset, &device, &device_len,
426 if (gdbarch_addr_bit (gdbarch) == 32)
428 printf_filtered ("\t%10s %10s %10s %10s %s\n",
429 paddress (gdbarch, addr),
430 paddress (gdbarch, endaddr),
431 hex_string (endaddr - addr),
433 *filename? filename : "");
437 printf_filtered (" %18s %18s %10s %10s %s\n",
438 paddress (gdbarch, addr),
439 paddress (gdbarch, endaddr),
440 hex_string (endaddr - addr),
442 *filename? filename : "");
446 do_cleanups (cleanup);
449 warning (_("unable to open /proc file '%s'"), filename);
453 xsnprintf (filename, sizeof filename, "/proc/%ld/status", pid);
454 data = target_fileio_read_stralloc (filename);
457 struct cleanup *cleanup = make_cleanup (xfree, data);
458 puts_filtered (data);
459 do_cleanups (cleanup);
462 warning (_("unable to open /proc file '%s'"), filename);
466 xsnprintf (filename, sizeof filename, "/proc/%ld/stat", pid);
467 data = target_fileio_read_stralloc (filename);
470 struct cleanup *cleanup = make_cleanup (xfree, data);
471 const char *p = data;
473 printf_filtered (_("Process: %s\n"),
474 pulongest (strtoulst (p, &p, 10)));
476 p = skip_spaces_const (p);
479 /* ps command also relies on no trailing fields
481 const char *ep = strrchr (p, ')');
484 printf_filtered ("Exec file: %.*s\n",
485 (int) (ep - p - 1), p + 1);
490 p = skip_spaces_const (p);
492 printf_filtered (_("State: %c\n"), *p++);
495 printf_filtered (_("Parent process: %s\n"),
496 pulongest (strtoulst (p, &p, 10)));
498 printf_filtered (_("Process group: %s\n"),
499 pulongest (strtoulst (p, &p, 10)));
501 printf_filtered (_("Session id: %s\n"),
502 pulongest (strtoulst (p, &p, 10)));
504 printf_filtered (_("TTY: %s\n"),
505 pulongest (strtoulst (p, &p, 10)));
507 printf_filtered (_("TTY owner process group: %s\n"),
508 pulongest (strtoulst (p, &p, 10)));
511 printf_filtered (_("Flags: %s\n"),
512 hex_string (strtoulst (p, &p, 10)));
514 printf_filtered (_("Minor faults (no memory page): %s\n"),
515 pulongest (strtoulst (p, &p, 10)));
517 printf_filtered (_("Minor faults, children: %s\n"),
518 pulongest (strtoulst (p, &p, 10)));
520 printf_filtered (_("Major faults (memory page faults): %s\n"),
521 pulongest (strtoulst (p, &p, 10)));
523 printf_filtered (_("Major faults, children: %s\n"),
524 pulongest (strtoulst (p, &p, 10)));
526 printf_filtered (_("utime: %s\n"),
527 pulongest (strtoulst (p, &p, 10)));
529 printf_filtered (_("stime: %s\n"),
530 pulongest (strtoulst (p, &p, 10)));
532 printf_filtered (_("utime, children: %s\n"),
533 pulongest (strtoulst (p, &p, 10)));
535 printf_filtered (_("stime, children: %s\n"),
536 pulongest (strtoulst (p, &p, 10)));
538 printf_filtered (_("jiffies remaining in current "
540 pulongest (strtoulst (p, &p, 10)));
542 printf_filtered (_("'nice' value: %s\n"),
543 pulongest (strtoulst (p, &p, 10)));
545 printf_filtered (_("jiffies until next timeout: %s\n"),
546 pulongest (strtoulst (p, &p, 10)));
548 printf_filtered (_("jiffies until next SIGALRM: %s\n"),
549 pulongest (strtoulst (p, &p, 10)));
551 printf_filtered (_("start time (jiffies since "
552 "system boot): %s\n"),
553 pulongest (strtoulst (p, &p, 10)));
555 printf_filtered (_("Virtual memory size: %s\n"),
556 pulongest (strtoulst (p, &p, 10)));
558 printf_filtered (_("Resident set size: %s\n"),
559 pulongest (strtoulst (p, &p, 10)));
561 printf_filtered (_("rlim: %s\n"),
562 pulongest (strtoulst (p, &p, 10)));
564 printf_filtered (_("Start of text: %s\n"),
565 hex_string (strtoulst (p, &p, 10)));
567 printf_filtered (_("End of text: %s\n"),
568 hex_string (strtoulst (p, &p, 10)));
570 printf_filtered (_("Start of stack: %s\n"),
571 hex_string (strtoulst (p, &p, 10)));
572 #if 0 /* Don't know how architecture-dependent the rest is...
573 Anyway the signal bitmap info is available from "status". */
575 printf_filtered (_("Kernel stack pointer: %s\n"),
576 hex_string (strtoulst (p, &p, 10)));
578 printf_filtered (_("Kernel instr pointer: %s\n"),
579 hex_string (strtoulst (p, &p, 10)));
581 printf_filtered (_("Pending signals bitmap: %s\n"),
582 hex_string (strtoulst (p, &p, 10)));
584 printf_filtered (_("Blocked signals bitmap: %s\n"),
585 hex_string (strtoulst (p, &p, 10)));
587 printf_filtered (_("Ignored signals bitmap: %s\n"),
588 hex_string (strtoulst (p, &p, 10)));
590 printf_filtered (_("Catched signals bitmap: %s\n"),
591 hex_string (strtoulst (p, &p, 10)));
593 printf_filtered (_("wchan (system call): %s\n"),
594 hex_string (strtoulst (p, &p, 10)));
596 do_cleanups (cleanup);
599 warning (_("unable to open /proc file '%s'"), filename);
603 /* Implement "info proc mappings" for a corefile. */
606 linux_core_info_proc_mappings (struct gdbarch *gdbarch, char *args)
609 ULONGEST count, page_size;
610 unsigned char *descdata, *filenames, *descend, *contents;
612 unsigned int addr_size_bits, addr_size;
613 struct cleanup *cleanup;
614 struct gdbarch *core_gdbarch = gdbarch_from_bfd (core_bfd);
615 /* We assume this for reading 64-bit core files. */
616 gdb_static_assert (sizeof (ULONGEST) >= 8);
618 section = bfd_get_section_by_name (core_bfd, ".note.linuxcore.file");
621 warning (_("unable to find mappings in core file"));
625 addr_size_bits = gdbarch_addr_bit (core_gdbarch);
626 addr_size = addr_size_bits / 8;
627 note_size = bfd_get_section_size (section);
629 if (note_size < 2 * addr_size)
630 error (_("malformed core note - too short for header"));
632 contents = xmalloc (note_size);
633 cleanup = make_cleanup (xfree, contents);
634 if (!bfd_get_section_contents (core_bfd, section, contents, 0, note_size))
635 error (_("could not get core note contents"));
638 descend = descdata + note_size;
640 if (descdata[note_size - 1] != '\0')
641 error (_("malformed note - does not end with \\0"));
643 count = bfd_get (addr_size_bits, core_bfd, descdata);
644 descdata += addr_size;
646 page_size = bfd_get (addr_size_bits, core_bfd, descdata);
647 descdata += addr_size;
649 if (note_size < 2 * addr_size + count * 3 * addr_size)
650 error (_("malformed note - too short for supplied file count"));
652 printf_filtered (_("Mapped address spaces:\n\n"));
653 if (gdbarch_addr_bit (gdbarch) == 32)
655 printf_filtered ("\t%10s %10s %10s %10s %s\n",
658 " Size", " Offset", "objfile");
662 printf_filtered (" %18s %18s %10s %10s %s\n",
665 " Size", " Offset", "objfile");
668 filenames = descdata + count * 3 * addr_size;
671 ULONGEST start, end, file_ofs;
673 if (filenames == descend)
674 error (_("malformed note - filenames end too early"));
676 start = bfd_get (addr_size_bits, core_bfd, descdata);
677 descdata += addr_size;
678 end = bfd_get (addr_size_bits, core_bfd, descdata);
679 descdata += addr_size;
680 file_ofs = bfd_get (addr_size_bits, core_bfd, descdata);
681 descdata += addr_size;
683 file_ofs *= page_size;
685 if (gdbarch_addr_bit (gdbarch) == 32)
686 printf_filtered ("\t%10s %10s %10s %10s %s\n",
687 paddress (gdbarch, start),
688 paddress (gdbarch, end),
689 hex_string (end - start),
690 hex_string (file_ofs),
693 printf_filtered (" %18s %18s %10s %10s %s\n",
694 paddress (gdbarch, start),
695 paddress (gdbarch, end),
696 hex_string (end - start),
697 hex_string (file_ofs),
700 filenames += 1 + strlen ((char *) filenames);
703 do_cleanups (cleanup);
706 /* Implement "info proc" for a corefile. */
709 linux_core_info_proc (struct gdbarch *gdbarch, char *args,
710 enum info_proc_what what)
712 int exe_f = (what == IP_MINIMAL || what == IP_EXE || what == IP_ALL);
713 int mappings_f = (what == IP_MAPPINGS || what == IP_ALL);
719 exe = bfd_core_file_failing_command (core_bfd);
721 printf_filtered ("exe = '%s'\n", exe);
723 warning (_("unable to find command name in core file"));
727 linux_core_info_proc_mappings (gdbarch, args);
729 if (!exe_f && !mappings_f)
730 error (_("unable to handle request"));
733 typedef int linux_find_memory_region_ftype (ULONGEST vaddr, ULONGEST size,
734 ULONGEST offset, ULONGEST inode,
736 int exec, int modified,
737 const char *filename,
740 /* List memory regions in the inferior for a corefile. */
743 linux_find_memory_regions_full (struct gdbarch *gdbarch,
744 linux_find_memory_region_ftype *func,
747 char mapsfilename[100];
750 /* We need to know the real target PID to access /proc. */
751 if (current_inferior ()->fake_pid_p)
754 xsnprintf (mapsfilename, sizeof mapsfilename,
755 "/proc/%d/smaps", current_inferior ()->pid);
756 data = target_fileio_read_stralloc (mapsfilename);
759 /* Older Linux kernels did not support /proc/PID/smaps. */
760 xsnprintf (mapsfilename, sizeof mapsfilename,
761 "/proc/%d/maps", current_inferior ()->pid);
762 data = target_fileio_read_stralloc (mapsfilename);
766 struct cleanup *cleanup = make_cleanup (xfree, data);
769 line = strtok (data, "\n");
772 ULONGEST addr, endaddr, offset, inode;
773 const char *permissions, *device, *filename;
774 size_t permissions_len, device_len;
775 int read, write, exec;
776 int modified = 0, has_anonymous = 0;
778 read_mapping (line, &addr, &endaddr, &permissions, &permissions_len,
779 &offset, &device, &device_len, &inode, &filename);
781 /* Decode permissions. */
782 read = (memchr (permissions, 'r', permissions_len) != 0);
783 write = (memchr (permissions, 'w', permissions_len) != 0);
784 exec = (memchr (permissions, 'x', permissions_len) != 0);
786 /* Try to detect if region was modified by parsing smaps counters. */
787 for (line = strtok (NULL, "\n");
788 line && line[0] >= 'A' && line[0] <= 'Z';
789 line = strtok (NULL, "\n"))
791 char keyword[64 + 1];
793 if (sscanf (line, "%64s", keyword) != 1)
795 warning (_("Error parsing {s,}maps file '%s'"), mapsfilename);
798 if (strcmp (keyword, "Anonymous:") == 0)
800 if (strcmp (keyword, "Shared_Dirty:") == 0
801 || strcmp (keyword, "Private_Dirty:") == 0
802 || strcmp (keyword, "Swap:") == 0
803 || strcmp (keyword, "Anonymous:") == 0)
805 unsigned long number;
807 if (sscanf (line, "%*s%lu", &number) != 1)
809 warning (_("Error parsing {s,}maps file '%s' number"),
818 /* Older Linux kernels did not support the "Anonymous:" counter.
819 If it is missing, we can't be sure - dump all the pages. */
823 /* Invoke the callback function to create the corefile segment. */
824 func (addr, endaddr - addr, offset, inode,
825 read, write, exec, modified, filename, obfd);
828 do_cleanups (cleanup);
835 /* A structure for passing information through
836 linux_find_memory_regions_full. */
838 struct linux_find_memory_regions_data
840 /* The original callback. */
842 find_memory_region_ftype func;
844 /* The original datum. */
849 /* A callback for linux_find_memory_regions that converts between the
850 "full"-style callback and find_memory_region_ftype. */
853 linux_find_memory_regions_thunk (ULONGEST vaddr, ULONGEST size,
854 ULONGEST offset, ULONGEST inode,
855 int read, int write, int exec, int modified,
856 const char *filename, void *arg)
858 struct linux_find_memory_regions_data *data = arg;
860 return data->func (vaddr, size, read, write, exec, modified, data->obfd);
863 /* A variant of linux_find_memory_regions_full that is suitable as the
864 gdbarch find_memory_regions method. */
867 linux_find_memory_regions (struct gdbarch *gdbarch,
868 find_memory_region_ftype func, void *obfd)
870 struct linux_find_memory_regions_data data;
875 return linux_find_memory_regions_full (gdbarch,
876 linux_find_memory_regions_thunk,
880 /* Determine which signal stopped execution. */
883 find_signalled_thread (struct thread_info *info, void *data)
885 if (info->suspend.stop_signal != GDB_SIGNAL_0
886 && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid))
892 static enum gdb_signal
893 find_stop_signal (void)
895 struct thread_info *info =
896 iterate_over_threads (find_signalled_thread, NULL);
899 return info->suspend.stop_signal;
904 /* Generate corefile notes for SPU contexts. */
907 linux_spu_make_corefile_notes (bfd *obfd, char *note_data, int *note_size)
909 static const char *spu_files[] =
931 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
935 /* Determine list of SPU ids. */
936 size = target_read_alloc (¤t_target, TARGET_OBJECT_SPU,
939 /* Generate corefile notes for each SPU file. */
940 for (i = 0; i < size; i += 4)
942 int fd = extract_unsigned_integer (spu_ids + i, 4, byte_order);
944 for (j = 0; j < sizeof (spu_files) / sizeof (spu_files[0]); j++)
946 char annex[32], note_name[32];
950 xsnprintf (annex, sizeof annex, "%d/%s", fd, spu_files[j]);
951 spu_len = target_read_alloc (¤t_target, TARGET_OBJECT_SPU,
955 xsnprintf (note_name, sizeof note_name, "SPU/%s", annex);
956 note_data = elfcore_write_note (obfd, note_data, note_size,
976 /* This is used to pass information from
977 linux_make_mappings_corefile_notes through
978 linux_find_memory_regions_full. */
980 struct linux_make_mappings_data
982 /* Number of files mapped. */
985 /* The obstack for the main part of the data. */
986 struct obstack *data_obstack;
988 /* The filename obstack. */
989 struct obstack *filename_obstack;
991 /* The architecture's "long" type. */
992 struct type *long_type;
995 static linux_find_memory_region_ftype linux_make_mappings_callback;
997 /* A callback for linux_find_memory_regions_full that updates the
998 mappings data for linux_make_mappings_corefile_notes. */
1001 linux_make_mappings_callback (ULONGEST vaddr, ULONGEST size,
1002 ULONGEST offset, ULONGEST inode,
1003 int read, int write, int exec, int modified,
1004 const char *filename, void *data)
1006 struct linux_make_mappings_data *map_data = data;
1007 gdb_byte buf[sizeof (ULONGEST)];
1009 if (*filename == '\0' || inode == 0)
1012 ++map_data->file_count;
1014 pack_long (buf, map_data->long_type, vaddr);
1015 obstack_grow (map_data->data_obstack, buf, TYPE_LENGTH (map_data->long_type));
1016 pack_long (buf, map_data->long_type, vaddr + size);
1017 obstack_grow (map_data->data_obstack, buf, TYPE_LENGTH (map_data->long_type));
1018 pack_long (buf, map_data->long_type, offset);
1019 obstack_grow (map_data->data_obstack, buf, TYPE_LENGTH (map_data->long_type));
1021 obstack_grow_str0 (map_data->filename_obstack, filename);
1026 /* Write the file mapping data to the core file, if possible. OBFD is
1027 the output BFD. NOTE_DATA is the current note data, and NOTE_SIZE
1028 is a pointer to the note size. Returns the new NOTE_DATA and
1029 updates NOTE_SIZE. */
1032 linux_make_mappings_corefile_notes (struct gdbarch *gdbarch, bfd *obfd,
1033 char *note_data, int *note_size)
1035 struct cleanup *cleanup;
1036 struct obstack data_obstack, filename_obstack;
1037 struct linux_make_mappings_data mapping_data;
1038 struct type *long_type
1039 = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch), 0, "long");
1040 gdb_byte buf[sizeof (ULONGEST)];
1042 obstack_init (&data_obstack);
1043 cleanup = make_cleanup_obstack_free (&data_obstack);
1044 obstack_init (&filename_obstack);
1045 make_cleanup_obstack_free (&filename_obstack);
1047 mapping_data.file_count = 0;
1048 mapping_data.data_obstack = &data_obstack;
1049 mapping_data.filename_obstack = &filename_obstack;
1050 mapping_data.long_type = long_type;
1052 /* Reserve space for the count. */
1053 obstack_blank (&data_obstack, TYPE_LENGTH (long_type));
1054 /* We always write the page size as 1 since we have no good way to
1055 determine the correct value. */
1056 pack_long (buf, long_type, 1);
1057 obstack_grow (&data_obstack, buf, TYPE_LENGTH (long_type));
1059 linux_find_memory_regions_full (gdbarch, linux_make_mappings_callback,
1062 if (mapping_data.file_count != 0)
1064 /* Write the count to the obstack. */
1065 pack_long ((gdb_byte *) obstack_base (&data_obstack),
1066 long_type, mapping_data.file_count);
1068 /* Copy the filenames to the data obstack. */
1069 obstack_grow (&data_obstack, obstack_base (&filename_obstack),
1070 obstack_object_size (&filename_obstack));
1072 note_data = elfcore_write_note (obfd, note_data, note_size,
1074 obstack_base (&data_obstack),
1075 obstack_object_size (&data_obstack));
1078 do_cleanups (cleanup);
1082 /* Records the thread's register state for the corefile note
1086 linux_collect_thread_registers (const struct regcache *regcache,
1087 ptid_t ptid, bfd *obfd,
1088 char *note_data, int *note_size,
1089 enum gdb_signal stop_signal)
1091 struct gdbarch *gdbarch = get_regcache_arch (regcache);
1092 struct core_regset_section *sect_list;
1095 sect_list = gdbarch_core_regset_sections (gdbarch);
1096 gdb_assert (sect_list);
1098 /* For remote targets the LWP may not be available, so use the TID. */
1099 lwp = ptid_get_lwp (ptid);
1101 lwp = ptid_get_tid (ptid);
1103 while (sect_list->sect_name != NULL)
1105 const struct regset *regset;
1108 regset = gdbarch_regset_from_core_section (gdbarch,
1109 sect_list->sect_name,
1111 gdb_assert (regset && regset->collect_regset);
1113 buf = xmalloc (sect_list->size);
1114 regset->collect_regset (regset, regcache, -1, buf, sect_list->size);
1116 /* PRSTATUS still needs to be treated specially. */
1117 if (strcmp (sect_list->sect_name, ".reg") == 0)
1118 note_data = (char *) elfcore_write_prstatus
1119 (obfd, note_data, note_size, lwp,
1120 gdb_signal_to_host (stop_signal), buf);
1122 note_data = (char *) elfcore_write_register_note
1123 (obfd, note_data, note_size,
1124 sect_list->sect_name, buf, sect_list->size);
1135 /* Fetch the siginfo data for the current thread, if it exists. If
1136 there is no data, or we could not read it, return NULL. Otherwise,
1137 return a newly malloc'd buffer holding the data and fill in *SIZE
1138 with the size of the data. The caller is responsible for freeing
1142 linux_get_siginfo_data (struct gdbarch *gdbarch, LONGEST *size)
1144 struct type *siginfo_type;
1147 struct cleanup *cleanups;
1149 if (!gdbarch_get_siginfo_type_p (gdbarch))
1152 siginfo_type = gdbarch_get_siginfo_type (gdbarch);
1154 buf = xmalloc (TYPE_LENGTH (siginfo_type));
1155 cleanups = make_cleanup (xfree, buf);
1157 bytes_read = target_read (¤t_target, TARGET_OBJECT_SIGNAL_INFO, NULL,
1158 buf, 0, TYPE_LENGTH (siginfo_type));
1159 if (bytes_read == TYPE_LENGTH (siginfo_type))
1161 discard_cleanups (cleanups);
1166 do_cleanups (cleanups);
1173 struct linux_corefile_thread_data
1175 struct gdbarch *gdbarch;
1180 enum gdb_signal stop_signal;
1181 linux_collect_thread_registers_ftype collect;
1184 /* Called by gdbthread.c once per thread. Records the thread's
1185 register state for the corefile note section. */
1188 linux_corefile_thread_callback (struct thread_info *info, void *data)
1190 struct linux_corefile_thread_data *args = data;
1192 /* It can be current thread
1193 which cannot be removed by update_thread_list. */
1194 if (info->state == THREAD_EXITED)
1197 if (ptid_get_pid (info->ptid) == args->pid)
1199 struct cleanup *old_chain;
1200 struct regcache *regcache;
1201 gdb_byte *siginfo_data;
1202 LONGEST siginfo_size = 0;
1204 regcache = get_thread_arch_regcache (info->ptid, args->gdbarch);
1206 old_chain = save_inferior_ptid ();
1207 inferior_ptid = info->ptid;
1208 target_fetch_registers (regcache, -1);
1209 siginfo_data = linux_get_siginfo_data (args->gdbarch, &siginfo_size);
1210 do_cleanups (old_chain);
1212 old_chain = make_cleanup (xfree, siginfo_data);
1214 args->note_data = args->collect (regcache, info->ptid, args->obfd,
1215 args->note_data, args->note_size,
1218 /* Don't return anything if we got no register information above,
1219 such a core file is useless. */
1220 if (args->note_data != NULL)
1221 if (siginfo_data != NULL)
1222 args->note_data = elfcore_write_note (args->obfd,
1226 siginfo_data, siginfo_size);
1228 do_cleanups (old_chain);
1231 return !args->note_data;
1234 /* Fill the PRPSINFO structure with information about the process being
1235 debugged. Returns 1 in case of success, 0 for failures. Please note that
1236 even if the structure cannot be entirely filled (e.g., GDB was unable to
1237 gather information about the process UID/GID), this function will still
1238 return 1 since some information was already recorded. It will only return
1239 0 iff nothing can be gathered. */
1242 linux_fill_prpsinfo (struct elf_internal_linux_prpsinfo *p)
1244 /* The filename which we will use to obtain some info about the process.
1245 We will basically use this to store the `/proc/PID/FILENAME' file. */
1247 /* The full name of the program which generated the corefile. */
1249 /* The basename of the executable. */
1250 const char *basename;
1251 /* The arguments of the program. */
1254 /* The contents of `/proc/PID/stat' and `/proc/PID/status' files. */
1255 char *proc_stat, *proc_status;
1256 /* Temporary buffer. */
1258 /* The valid states of a process, according to the Linux kernel. */
1259 const char valid_states[] = "RSDTZW";
1260 /* The program state. */
1261 const char *prog_state;
1262 /* The state of the process. */
1264 /* The PID of the program which generated the corefile. */
1266 /* Process flags. */
1267 unsigned int pr_flag;
1268 /* Process nice value. */
1270 /* The number of fields read by `sscanf'. */
1276 gdb_assert (p != NULL);
1278 /* Obtaining PID and filename. */
1279 pid = ptid_get_pid (inferior_ptid);
1280 xsnprintf (filename, sizeof (filename), "/proc/%d/cmdline", (int) pid);
1281 fname = target_fileio_read_stralloc (filename);
1283 if (fname == NULL || *fname == '\0')
1285 /* No program name was read, so we won't be able to retrieve more
1286 information about the process. */
1291 c = make_cleanup (xfree, fname);
1292 memset (p, 0, sizeof (*p));
1294 /* Defining the PID. */
1297 /* Copying the program name. Only the basename matters. */
1298 basename = lbasename (fname);
1299 strncpy (p->pr_fname, basename, sizeof (p->pr_fname));
1300 p->pr_fname[sizeof (p->pr_fname) - 1] = '\0';
1302 infargs = get_inferior_args ();
1304 psargs = xstrdup (fname);
1305 if (infargs != NULL)
1306 psargs = reconcat (psargs, psargs, " ", infargs, NULL);
1308 make_cleanup (xfree, psargs);
1310 strncpy (p->pr_psargs, psargs, sizeof (p->pr_psargs));
1311 p->pr_psargs[sizeof (p->pr_psargs) - 1] = '\0';
1313 xsnprintf (filename, sizeof (filename), "/proc/%d/stat", (int) pid);
1314 proc_stat = target_fileio_read_stralloc (filename);
1315 make_cleanup (xfree, proc_stat);
1317 if (proc_stat == NULL || *proc_stat == '\0')
1319 /* Despite being unable to read more information about the
1320 process, we return 1 here because at least we have its
1321 command line, PID and arguments. */
1326 /* Ok, we have the stats. It's time to do a little parsing of the
1327 contents of the buffer, so that we end up reading what we want.
1329 The following parsing mechanism is strongly based on the
1330 information generated by the `fs/proc/array.c' file, present in
1331 the Linux kernel tree. More details about how the information is
1332 displayed can be obtained by seeing the manpage of proc(5),
1333 specifically under the entry of `/proc/[pid]/stat'. */
1335 /* Getting rid of the PID, since we already have it. */
1336 while (isdigit (*proc_stat))
1339 proc_stat = skip_spaces (proc_stat);
1341 /* ps command also relies on no trailing fields ever contain ')'. */
1342 proc_stat = strrchr (proc_stat, ')');
1343 if (proc_stat == NULL)
1350 proc_stat = skip_spaces (proc_stat);
1352 n_fields = sscanf (proc_stat,
1353 "%c" /* Process state. */
1354 "%d%d%d" /* Parent PID, group ID, session ID. */
1355 "%*d%*d" /* tty_nr, tpgid (not used). */
1357 "%*s%*s%*s%*s" /* minflt, cminflt, majflt,
1358 cmajflt (not used). */
1359 "%*s%*s%*s%*s" /* utime, stime, cutime,
1360 cstime (not used). */
1361 "%*s" /* Priority (not used). */
1364 &p->pr_ppid, &p->pr_pgrp, &p->pr_sid,
1370 /* Again, we couldn't read the complementary information about
1371 the process state. However, we already have minimal
1372 information, so we just return 1 here. */
1377 /* Filling the structure fields. */
1378 prog_state = strchr (valid_states, pr_sname);
1379 if (prog_state != NULL)
1380 p->pr_state = prog_state - valid_states;
1383 /* Zero means "Running". */
1387 p->pr_sname = p->pr_state > 5 ? '.' : pr_sname;
1388 p->pr_zomb = p->pr_sname == 'Z';
1389 p->pr_nice = pr_nice;
1390 p->pr_flag = pr_flag;
1392 /* Finally, obtaining the UID and GID. For that, we read and parse the
1393 contents of the `/proc/PID/status' file. */
1394 xsnprintf (filename, sizeof (filename), "/proc/%d/status", (int) pid);
1395 proc_status = target_fileio_read_stralloc (filename);
1396 make_cleanup (xfree, proc_status);
1398 if (proc_status == NULL || *proc_status == '\0')
1400 /* Returning 1 since we already have a bunch of information. */
1405 /* Extracting the UID. */
1406 tmpstr = strstr (proc_status, "Uid:");
1409 /* Advancing the pointer to the beginning of the UID. */
1410 tmpstr += sizeof ("Uid:");
1411 while (*tmpstr != '\0' && !isdigit (*tmpstr))
1414 if (isdigit (*tmpstr))
1415 p->pr_uid = strtol (tmpstr, &tmpstr, 10);
1418 /* Extracting the GID. */
1419 tmpstr = strstr (proc_status, "Gid:");
1422 /* Advancing the pointer to the beginning of the GID. */
1423 tmpstr += sizeof ("Gid:");
1424 while (*tmpstr != '\0' && !isdigit (*tmpstr))
1427 if (isdigit (*tmpstr))
1428 p->pr_gid = strtol (tmpstr, &tmpstr, 10);
1436 /* Fills the "to_make_corefile_note" target vector. Builds the note
1437 section for a corefile, and returns it in a malloc buffer. */
1440 linux_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size,
1441 linux_collect_thread_registers_ftype collect)
1443 struct linux_corefile_thread_data thread_args;
1444 struct elf_internal_linux_prpsinfo prpsinfo;
1445 char *note_data = NULL;
1448 volatile struct gdb_exception e;
1450 if (linux_fill_prpsinfo (&prpsinfo))
1452 if (gdbarch_elfcore_write_linux_prpsinfo_p (gdbarch))
1454 note_data = gdbarch_elfcore_write_linux_prpsinfo (gdbarch, obfd,
1455 note_data, note_size,
1460 if (gdbarch_ptr_bit (gdbarch) == 64)
1461 note_data = elfcore_write_linux_prpsinfo64 (obfd,
1462 note_data, note_size,
1465 note_data = elfcore_write_linux_prpsinfo32 (obfd,
1466 note_data, note_size,
1471 /* Thread register information. */
1472 TRY_CATCH (e, RETURN_MASK_ERROR)
1474 update_thread_list ();
1477 exception_print (gdb_stderr, e);
1478 thread_args.gdbarch = gdbarch;
1479 thread_args.pid = ptid_get_pid (inferior_ptid);
1480 thread_args.obfd = obfd;
1481 thread_args.note_data = note_data;
1482 thread_args.note_size = note_size;
1483 thread_args.stop_signal = find_stop_signal ();
1484 thread_args.collect = collect;
1485 iterate_over_threads (linux_corefile_thread_callback, &thread_args);
1486 note_data = thread_args.note_data;
1490 /* Auxillary vector. */
1491 auxv_len = target_read_alloc (¤t_target, TARGET_OBJECT_AUXV,
1495 note_data = elfcore_write_note (obfd, note_data, note_size,
1496 "CORE", NT_AUXV, auxv, auxv_len);
1503 /* SPU information. */
1504 note_data = linux_spu_make_corefile_notes (obfd, note_data, note_size);
1508 /* File mappings. */
1509 note_data = linux_make_mappings_corefile_notes (gdbarch, obfd,
1510 note_data, note_size);
1512 make_cleanup (xfree, note_data);
1517 linux_make_corefile_notes_1 (struct gdbarch *gdbarch, bfd *obfd, int *note_size)
1519 /* FIXME: uweigand/2011-10-06: Once all GNU/Linux architectures have been
1520 converted to gdbarch_core_regset_sections, we no longer need to fall back
1521 to the target method at this point. */
1523 if (!gdbarch_core_regset_sections (gdbarch))
1524 return target_make_corefile_notes (obfd, note_size);
1526 return linux_make_corefile_notes (gdbarch, obfd, note_size,
1527 linux_collect_thread_registers);
1530 /* Implementation of `gdbarch_gdb_signal_from_target', as defined in
1531 gdbarch.h. This function is not static because it is exported to
1532 other -tdep files. */
1535 linux_gdb_signal_from_target (struct gdbarch *gdbarch, int signal)
1540 return GDB_SIGNAL_0;
1543 return GDB_SIGNAL_HUP;
1546 return GDB_SIGNAL_INT;
1549 return GDB_SIGNAL_QUIT;
1552 return GDB_SIGNAL_ILL;
1555 return GDB_SIGNAL_TRAP;
1558 return GDB_SIGNAL_ABRT;
1561 return GDB_SIGNAL_BUS;
1564 return GDB_SIGNAL_FPE;
1567 return GDB_SIGNAL_KILL;
1570 return GDB_SIGNAL_USR1;
1573 return GDB_SIGNAL_SEGV;
1576 return GDB_SIGNAL_USR2;
1579 return GDB_SIGNAL_PIPE;
1582 return GDB_SIGNAL_ALRM;
1585 return GDB_SIGNAL_TERM;
1588 return GDB_SIGNAL_CHLD;
1591 return GDB_SIGNAL_CONT;
1594 return GDB_SIGNAL_STOP;
1597 return GDB_SIGNAL_TSTP;
1600 return GDB_SIGNAL_TTIN;
1603 return GDB_SIGNAL_TTOU;
1606 return GDB_SIGNAL_URG;
1609 return GDB_SIGNAL_XCPU;
1612 return GDB_SIGNAL_XFSZ;
1614 case LINUX_SIGVTALRM:
1615 return GDB_SIGNAL_VTALRM;
1618 return GDB_SIGNAL_PROF;
1620 case LINUX_SIGWINCH:
1621 return GDB_SIGNAL_WINCH;
1623 /* No way to differentiate between SIGIO and SIGPOLL.
1624 Therefore, we just handle the first one. */
1626 return GDB_SIGNAL_IO;
1629 return GDB_SIGNAL_PWR;
1632 return GDB_SIGNAL_SYS;
1634 /* SIGRTMIN and SIGRTMAX are not continuous in <gdb/signals.def>,
1635 therefore we have to handle them here. */
1636 case LINUX_SIGRTMIN:
1637 return GDB_SIGNAL_REALTIME_32;
1639 case LINUX_SIGRTMAX:
1640 return GDB_SIGNAL_REALTIME_64;
1643 if (signal >= LINUX_SIGRTMIN + 1 && signal <= LINUX_SIGRTMAX - 1)
1645 int offset = signal - LINUX_SIGRTMIN + 1;
1647 return (enum gdb_signal) ((int) GDB_SIGNAL_REALTIME_33 + offset);
1650 return GDB_SIGNAL_UNKNOWN;
1653 /* Implementation of `gdbarch_gdb_signal_to_target', as defined in
1654 gdbarch.h. This function is not static because it is exported to
1655 other -tdep files. */
1658 linux_gdb_signal_to_target (struct gdbarch *gdbarch,
1659 enum gdb_signal signal)
1666 case GDB_SIGNAL_HUP:
1667 return LINUX_SIGHUP;
1669 case GDB_SIGNAL_INT:
1670 return LINUX_SIGINT;
1672 case GDB_SIGNAL_QUIT:
1673 return LINUX_SIGQUIT;
1675 case GDB_SIGNAL_ILL:
1676 return LINUX_SIGILL;
1678 case GDB_SIGNAL_TRAP:
1679 return LINUX_SIGTRAP;
1681 case GDB_SIGNAL_ABRT:
1682 return LINUX_SIGABRT;
1684 case GDB_SIGNAL_FPE:
1685 return LINUX_SIGFPE;
1687 case GDB_SIGNAL_KILL:
1688 return LINUX_SIGKILL;
1690 case GDB_SIGNAL_BUS:
1691 return LINUX_SIGBUS;
1693 case GDB_SIGNAL_SEGV:
1694 return LINUX_SIGSEGV;
1696 case GDB_SIGNAL_SYS:
1697 return LINUX_SIGSYS;
1699 case GDB_SIGNAL_PIPE:
1700 return LINUX_SIGPIPE;
1702 case GDB_SIGNAL_ALRM:
1703 return LINUX_SIGALRM;
1705 case GDB_SIGNAL_TERM:
1706 return LINUX_SIGTERM;
1708 case GDB_SIGNAL_URG:
1709 return LINUX_SIGURG;
1711 case GDB_SIGNAL_STOP:
1712 return LINUX_SIGSTOP;
1714 case GDB_SIGNAL_TSTP:
1715 return LINUX_SIGTSTP;
1717 case GDB_SIGNAL_CONT:
1718 return LINUX_SIGCONT;
1720 case GDB_SIGNAL_CHLD:
1721 return LINUX_SIGCHLD;
1723 case GDB_SIGNAL_TTIN:
1724 return LINUX_SIGTTIN;
1726 case GDB_SIGNAL_TTOU:
1727 return LINUX_SIGTTOU;
1732 case GDB_SIGNAL_XCPU:
1733 return LINUX_SIGXCPU;
1735 case GDB_SIGNAL_XFSZ:
1736 return LINUX_SIGXFSZ;
1738 case GDB_SIGNAL_VTALRM:
1739 return LINUX_SIGVTALRM;
1741 case GDB_SIGNAL_PROF:
1742 return LINUX_SIGPROF;
1744 case GDB_SIGNAL_WINCH:
1745 return LINUX_SIGWINCH;
1747 case GDB_SIGNAL_USR1:
1748 return LINUX_SIGUSR1;
1750 case GDB_SIGNAL_USR2:
1751 return LINUX_SIGUSR2;
1753 case GDB_SIGNAL_PWR:
1754 return LINUX_SIGPWR;
1756 case GDB_SIGNAL_POLL:
1757 return LINUX_SIGPOLL;
1759 /* GDB_SIGNAL_REALTIME_32 is not continuous in <gdb/signals.def>,
1760 therefore we have to handle it here. */
1761 case GDB_SIGNAL_REALTIME_32:
1762 return LINUX_SIGRTMIN;
1764 /* Same comment applies to _64. */
1765 case GDB_SIGNAL_REALTIME_64:
1766 return LINUX_SIGRTMAX;
1769 /* GDB_SIGNAL_REALTIME_33 to _64 are continuous. */
1770 if (signal >= GDB_SIGNAL_REALTIME_33
1771 && signal <= GDB_SIGNAL_REALTIME_63)
1773 int offset = signal - GDB_SIGNAL_REALTIME_33;
1775 return LINUX_SIGRTMIN + 1 + offset;
1781 /* To be called from the various GDB_OSABI_LINUX handlers for the
1782 various GNU/Linux architectures and machine types. */
1785 linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
1787 set_gdbarch_core_pid_to_str (gdbarch, linux_core_pid_to_str);
1788 set_gdbarch_info_proc (gdbarch, linux_info_proc);
1789 set_gdbarch_core_info_proc (gdbarch, linux_core_info_proc);
1790 set_gdbarch_find_memory_regions (gdbarch, linux_find_memory_regions);
1791 set_gdbarch_make_corefile_notes (gdbarch, linux_make_corefile_notes_1);
1792 set_gdbarch_has_shared_address_space (gdbarch,
1793 linux_has_shared_address_space);
1794 set_gdbarch_gdb_signal_from_target (gdbarch,
1795 linux_gdb_signal_from_target);
1796 set_gdbarch_gdb_signal_to_target (gdbarch,
1797 linux_gdb_signal_to_target);
1800 /* Provide a prototype to silence -Wmissing-prototypes. */
1801 extern initialize_file_ftype _initialize_linux_tdep;
1804 _initialize_linux_tdep (void)
1806 linux_gdbarch_data_handle =
1807 gdbarch_data_register_post_init (init_linux_gdbarch_data);