/* FreeBSD-specific methods for using the /proc file system.
- Copyright 2002 Free Software Foundation, Inc.
+
+ Copyright 2002, 2003 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "gdbcore.h"
#include "inferior.h"
+#include "regcache.h"
+#include "regset.h"
+#include "gdb_assert.h"
+#include "gdb_string.h"
#include <sys/procfs.h>
#include <sys/types.h>
#include "elf-bfd.h"
-#include "gregset.h"
-
char *
child_pid_to_exec_file (int pid)
{
char *path;
char *buf;
- xasprintf (&path, "/proc/%d/file", pid);
+ path = xstrprintf ("/proc/%d/file", pid);
buf = xcalloc (MAXPATHLEN, sizeof (char));
make_cleanup (xfree, path);
make_cleanup (xfree, buf);
}
static int
-read_mapping (FILE *mapfile,
- unsigned long *start,
- unsigned long *end,
+read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
char *protection)
{
+ /* FreeBSD 5.1-RELEASE uses a 256-byte buffer. */
+ char buf[256];
int resident, privateresident;
unsigned long obj;
- int ref_count, shadow_count;
- unsigned flags;
- char cow[5], access[4];
- char type[8];
- int ret;
-
- /* The layout is described in /usr/src/miscfs/procfs/procfs_map.c. */
- ret = fscanf (mapfile, "%lx %lx %d %d %lx %s %d %d %x %s %s %s\n",
- start, end,
- &resident, &privateresident, &obj,
- protection,
- &ref_count, &shadow_count, &flags, cow, access, type);
+ int ret = EOF;
+
+ /* As of FreeBSD 5.0-RELEASE, the layout is described in
+ /usr/src/sys/fs/procfs/procfs_map.c. Somewhere in 5.1-CURRENT a
+ new column was added to the procfs map. Therefore we can't use
+ fscanf since we need to support older releases too. */
+ if (fgets (buf, sizeof buf, mapfile) != NULL)
+ ret = sscanf (buf, "%lx %lx %d %d %lx %s", start, end,
+ &resident, &privateresident, &obj, protection);
return (ret != 0 && ret != EOF);
}
static int
-fbsd_find_memory_regions (int (*func) (CORE_ADDR,
- unsigned long,
- int, int, int,
- void *),
+fbsd_find_memory_regions (int (*func) (CORE_ADDR, unsigned long,
+ int, int, int, void *),
void *obfd)
{
pid_t pid = ptid_get_pid (inferior_ptid);
char protection[4];
int read, write, exec;
- xasprintf (&mapfilename, "/proc/%ld/map", (long) pid);
+ mapfilename = xstrprintf ("/proc/%ld/map", (long) pid);
mapfile = fopen (mapfilename, "r");
if (mapfile == NULL)
error ("Couldn't open %s\n", mapfilename);
static char *
fbsd_make_corefile_notes (bfd *obfd, int *note_size)
{
+ struct gdbarch *gdbarch = current_gdbarch;
+ const struct regcache *regcache = current_regcache;
gregset_t gregs;
fpregset_t fpregs;
char *note_data = NULL;
+ Elf_Internal_Ehdr *i_ehdrp;
+ const struct regset *regset;
+ size_t size;
+
+ /* Put a "FreeBSD" label in the ELF header. */
+ i_ehdrp = elf_elfheader (obfd);
+ i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
+
+ gdb_assert (gdbarch_regset_from_core_section_p (gdbarch));
+
+ size = sizeof gregs;
+ regset = gdbarch_regset_from_core_section (gdbarch, ".reg", size);
+ gdb_assert (regset && regset->collect_regset);
+ regset->collect_regset (regset, regcache, -1, &gregs, size);
+
+ note_data = elfcore_write_prstatus (obfd, note_data, note_size,
+ ptid_get_pid (inferior_ptid),
+ stop_signal, &gregs);
+
+ size = sizeof fpregs;
+ regset = gdbarch_regset_from_core_section (gdbarch, ".reg2", size);
+ gdb_assert (regset && regset->collect_regset);
+ regset->collect_regset (regset, regcache, -1, &fpregs, size);
- fill_gregset (&gregs, -1);
- note_data = (char *) elfcore_write_prstatus (obfd,
- note_data,
- note_size,
- ptid_get_pid (inferior_ptid),
- stop_signal,
- &gregs);
-
- fill_fpregset (&fpregs, -1);
- note_data = (char *) elfcore_write_prfpreg (obfd,
- note_data,
- note_size,
- &fpregs,
- sizeof (fpregs));
+ note_data = elfcore_write_prfpreg (obfd, note_data, note_size,
+ &fpregs, sizeof (fpregs));
if (get_exec_file (0))
{
if (get_inferior_args ())
psargs = reconcat (psargs, psargs, " ", get_inferior_args (), NULL);
- note_data = (char *) elfcore_write_prpsinfo (obfd,
- note_data,
- note_size,
- fname,
- psargs);
+ note_data = elfcore_write_prpsinfo (obfd, note_data, note_size,
+ fname, psargs);
}
make_cleanup (xfree, note_data);