X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ffbsd-nat.c;h=a2a1f60ec4b4a2f3c1a2e09199182f7beeb93bf2;hb=2117c711ae07700adb57ea5b5ca61e4c32d7e3d2;hp=ba1d54484c182b877108bcd6af0a8e1cd64c6bf2;hpb=197e01b6dcd118b70ed3621b62b2ff3fa929d50f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index ba1d54484c..a2a1f60ec4 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -1,12 +1,12 @@ /* Native-dependent code for FreeBSD. - Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Copyright (C) 2002-2014 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,18 +15,17 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, - Boston, MA 02110-1301, USA. */ + along with this program. If not, see . */ #include "defs.h" #include "gdbcore.h" #include "inferior.h" #include "regcache.h" #include "regset.h" +#include "gdbthread.h" #include "gdb_assert.h" -#include "gdb_string.h" +#include #include #include #include @@ -34,13 +33,13 @@ #include "elf-bfd.h" #include "fbsd-nat.h" -/* Return a the name of file that can be opened to get the symbols for +/* Return the name of a file that can be opened to get the symbols for the child process identified by PID. */ char * -fbsd_pid_to_exec_file (int pid) +fbsd_pid_to_exec_file (struct target_ops *self, int pid) { - size_t len = MAXPATHLEN; + size_t len = PATH_MAX; char *buf = xcalloc (len, sizeof (char)); char *path; @@ -56,7 +55,7 @@ fbsd_pid_to_exec_file (int pid) #endif path = xstrprintf ("/proc/%d/file", pid); - if (readlink (path, buf, MAXPATHLEN) == -1) + if (readlink (path, buf, PATH_MAX - 1) == -1) { xfree (buf); buf = NULL; @@ -92,9 +91,8 @@ fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end, argument to FUNC. */ int -fbsd_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, - int, int, int, void *), - void *obfd) +fbsd_find_memory_regions (struct target_ops *self, + find_memory_region_ftype func, void *obfd) { pid_t pid = ptid_get_pid (inferior_ptid); char *mapfilename; @@ -102,11 +100,14 @@ fbsd_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, unsigned long start, end, size; char protection[4]; int read, write, exec; + struct cleanup *cleanup; mapfilename = xstrprintf ("/proc/%ld/map", (long) pid); + cleanup = make_cleanup (xfree, mapfilename); mapfile = fopen (mapfilename, "r"); if (mapfile == NULL) error (_("Couldn't open %s."), mapfilename); + make_cleanup_fclose (mapfile); if (info_verbose) fprintf_filtered (gdb_stdout, @@ -124,29 +125,52 @@ fbsd_find_memory_regions (int (*func) (CORE_ADDR, unsigned long, if (info_verbose) { fprintf_filtered (gdb_stdout, - "Save segment, %ld bytes at 0x%s (%c%c%c)\n", - size, paddr_nz (start), + "Save segment, %ld bytes at %s (%c%c%c)\n", + size, paddress (target_gdbarch (), start), read ? 'r' : '-', write ? 'w' : '-', exec ? 'x' : '-'); } - /* Invoke the callback function to create the corefile segment. */ - func (start, size, read, write, exec, obfd); + /* Invoke the callback function to create the corefile segment. + Pass MODIFIED as true, we do not know the real modification state. */ + func (start, size, read, write, exec, 1, obfd); } - fclose (mapfile); + do_cleanups (cleanup); return 0; } +static int +find_signalled_thread (struct thread_info *info, void *data) +{ + if (info->suspend.stop_signal != GDB_SIGNAL_0 + && ptid_get_pid (info->ptid) == ptid_get_pid (inferior_ptid)) + return 1; + + return 0; +} + +static enum gdb_signal +find_stop_signal (void) +{ + struct thread_info *info = + iterate_over_threads (find_signalled_thread, NULL); + + if (info) + return info->suspend.stop_signal; + else + return GDB_SIGNAL_0; +} + /* Create appropriate note sections for a corefile, returning them in allocated memory. */ char * -fbsd_make_corefile_notes (bfd *obfd, int *note_size) +fbsd_make_corefile_notes (struct target_ops *self, bfd *obfd, int *note_size) { - struct gdbarch *gdbarch = current_gdbarch; - const struct regcache *regcache = current_regcache; + const struct regcache *regcache = get_current_regcache (); + struct gdbarch *gdbarch = get_regcache_arch (regcache); gregset_t gregs; fpregset_t fpregs; char *note_data = NULL; @@ -167,7 +191,7 @@ fbsd_make_corefile_notes (bfd *obfd, int *note_size) note_data = elfcore_write_prstatus (obfd, note_data, note_size, ptid_get_pid (inferior_ptid), - stop_signal, &gregs); + find_stop_signal (), &gregs); size = sizeof fpregs; regset = gdbarch_regset_from_core_section (gdbarch, ".reg2", size); @@ -179,11 +203,12 @@ fbsd_make_corefile_notes (bfd *obfd, int *note_size) if (get_exec_file (0)) { - char *fname = strrchr (get_exec_file (0), '/') + 1; + const char *fname = lbasename (get_exec_file (0)); char *psargs = xstrdup (fname); if (get_inferior_args ()) - psargs = reconcat (psargs, psargs, " ", get_inferior_args (), NULL); + psargs = reconcat (psargs, psargs, " ", get_inferior_args (), + (char *) NULL); note_data = elfcore_write_prpsinfo (obfd, note_data, note_size, fname, psargs);