int nfd = 0;
#endif
struct kinfo_proc kp;
- char *tmp;
pid_t pid;
bool do_cmdline = false;
bool do_cwd = false;
bool do_exe = false;
+#ifdef HAVE_KINFO_GETFILE
+ bool do_files = false;
+#endif
#ifdef HAVE_KINFO_GETVMMAP
bool do_mappings = false;
#endif
case IP_CWD:
do_cwd = true;
break;
+#ifdef HAVE_KINFO_GETFILE
+ case IP_FILES:
+ do_files = true;
+ break;
+#endif
case IP_ALL:
do_cmdline = true;
do_cwd = true;
do_exe = true;
+#ifdef HAVE_KINFO_GETFILE
+ do_files = true;
+#endif
#ifdef HAVE_KINFO_GETVMMAP
do_mappings = true;
#endif
printf_filtered (_("process %d\n"), pid);
#ifdef HAVE_KINFO_GETFILE
- if (do_cwd || do_exe)
+ if (do_cwd || do_exe || do_files)
fdtbl.reset (kinfo_getfile (pid, &nfd));
#endif
else
warning (_("unable to fetch executable path name"));
}
+#ifdef HAVE_KINFO_GETFILE
+ if (do_files)
+ {
+ struct kinfo_file *kf = fdtbl.get ();
+
+ if (nfd > 0)
+ {
+ fbsd_info_proc_files_header ();
+ for (int i = 0; i < nfd; i++, kf++)
+ fbsd_info_proc_files_entry (kf->kf_type, kf->kf_fd, kf->kf_flags,
+ kf->kf_offset, kf->kf_vnode_type,
+ kf->kf_sock_domain, kf->kf_sock_type,
+ kf->kf_sock_protocol, &kf->kf_sa_local,
+ &kf->kf_sa_peer, kf->kf_path);
+ }
+ else
+ warning (_("unable to fetch list of open files"));
+ }
+#endif
#ifdef HAVE_KINFO_GETVMMAP
if (do_mappings)
{
if (vmentl != nullptr)
{
- printf_filtered (_("Mapped address spaces:\n\n"));
-#ifdef __LP64__
- printf_filtered (" %18s %18s %10s %10s %9s %s\n",
- "Start Addr",
- " End Addr",
- " Size", " Offset", "Flags ", "File");
-#else
- printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
- "Start Addr",
- " End Addr",
- " Size", " Offset", "Flags ", "File");
-#endif
+ int addr_bit = TARGET_CHAR_BIT * sizeof (void *);
+ fbsd_info_proc_mappings_header (addr_bit);
struct kinfo_vmentry *kve = vmentl.get ();
for (int i = 0; i < nvment; i++, kve++)
- {
- ULONGEST start, end;
-
- start = kve->kve_start;
- end = kve->kve_end;
-#ifdef __LP64__
- printf_filtered (" %18s %18s %10s %10s %9s %s\n",
- hex_string (start),
- hex_string (end),
- hex_string (end - start),
- hex_string (kve->kve_offset),
- fbsd_vm_map_entry_flags (kve->kve_flags,
- kve->kve_protection),
- kve->kve_path);
-#else
- printf_filtered ("\t%10s %10s %10s %10s %9s %s\n",
- hex_string (start),
- hex_string (end),
- hex_string (end - start),
- hex_string (kve->kve_offset),
- fbsd_vm_map_entry_flags (kve->kve_flags,
- kve->kve_protection),
- kve->kve_path);
-#endif
- }
+ fbsd_info_proc_mappings_entry (addr_bit, kve->kve_start,
+ kve->kve_end, kve->kve_offset,
+ kve->kve_flags, kve->kve_protection,
+ kve->kve_path);
}
else
warning (_("unable to fetch virtual memory map"));
}
return TARGET_XFER_E_IO;
}
+ case TARGET_OBJECT_FREEBSD_VMMAP:
+ case TARGET_OBJECT_FREEBSD_PS_STRINGS:
+ {
+ gdb::byte_vector buf_storage;
+ gdb_byte *buf;
+ size_t buflen;
+ int mib[4];
+
+ int proc_target;
+ uint32_t struct_size;
+ switch (object)
+ {
+ case TARGET_OBJECT_FREEBSD_VMMAP:
+ proc_target = KERN_PROC_VMMAP;
+ struct_size = sizeof (struct kinfo_vmentry);
+ break;
+ case TARGET_OBJECT_FREEBSD_PS_STRINGS:
+ proc_target = KERN_PROC_PS_STRINGS;
+ struct_size = sizeof (void *);
+ break;
+ }
+
+ if (writebuf != NULL)
+ return TARGET_XFER_E_IO;
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = proc_target;
+ mib[3] = pid;
+
+ if (sysctl (mib, 4, NULL, &buflen, NULL, 0) != 0)
+ return TARGET_XFER_E_IO;
+ buflen += sizeof (struct_size);
+
+ if (offset >= buflen)
+ {
+ *xfered_len = 0;
+ return TARGET_XFER_EOF;
+ }
+
+ buf_storage.resize (buflen);
+ buf = buf_storage.data ();
+
+ memcpy (buf, &struct_size, sizeof (struct_size));
+ buflen -= sizeof (struct_size);
+ if (sysctl (mib, 4, buf + sizeof (struct_size), &buflen, NULL, 0) != 0)
+ return TARGET_XFER_E_IO;
+ buflen += sizeof (struct_size);
+
+ if (buflen - offset < len)
+ len = buflen - offset;
+ memcpy (readbuf, buf + offset, len);
+ *xfered_len = len;
+ return TARGET_XFER_OK;
+ }
default:
return inf_ptrace_target::xfer_partial (object, annex,
readbuf, writebuf, offset,
bool
fbsd_nat_target::thread_alive (ptid_t ptid)
{
- if (ptid_lwp_p (ptid))
+ if (ptid.lwp_p ())
{
struct ptrace_lwpinfo pl;
- if (ptrace (PT_LWPINFO, ptid_get_lwp (ptid), (caddr_t) &pl, sizeof pl)
+ if (ptrace (PT_LWPINFO, ptid.lwp (), (caddr_t) &pl, sizeof pl)
== -1)
return false;
#ifdef PL_FLAG_EXITED
{
lwpid_t lwp;
- lwp = ptid_get_lwp (ptid);
+ lwp = ptid.lwp ();
if (lwp != 0)
{
static char buf[64];
struct ptrace_lwpinfo pl;
struct kinfo_proc kp;
int pid = thr->ptid.pid ();
- long lwp = ptid_get_lwp (thr->ptid);
+ long lwp = thr->ptid.lwp ();
static char buf[sizeof pl.pl_tdname + 1];
/* Note that ptrace_lwpinfo returns the process command in pl_tdname
pid_t pid;
/* Don't PT_CONTINUE a process which has a pending vfork done event. */
- if (ptid_equal (minus_one_ptid, ptid))
+ if (minus_one_ptid == ptid)
pid = inferior_ptid.pid ();
else
pid = ptid.pid ();
if (debug_fbsd_lwp)
fprintf_unfiltered (gdb_stdlog,
"FLWP: fbsd_resume for ptid (%d, %ld, %ld)\n",
- ptid.pid (), ptid_get_lwp (ptid),
- ptid_get_tid (ptid));
- if (ptid_lwp_p (ptid))
+ ptid.pid (), ptid.lwp (),
+ ptid.tid ());
+ if (ptid.lwp_p ())
{
/* If ptid is a specific LWP, suspend all other LWPs in the process. */
struct thread_info *tp;
if (tp->ptid.pid () != ptid.pid ())
continue;
- if (ptid_get_lwp (tp->ptid) == ptid_get_lwp (ptid))
+ if (tp->ptid.lwp () == ptid.lwp ())
request = PT_RESUME;
else
request = PT_SUSPEND;
- if (ptrace (request, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
+ if (ptrace (request, tp->ptid.lwp (), NULL, 0) == -1)
perror_with_name (("ptrace"));
}
}
ALL_NON_EXITED_THREADS (tp)
{
- if (!ptid_match (tp->ptid, ptid))
+ if (!tp->ptid.matches (ptid))
continue;
- if (ptrace (PT_RESUME, ptid_get_lwp (tp->ptid), NULL, 0) == -1)
+ if (ptrace (PT_RESUME, tp->ptid.lwp (), NULL, 0) == -1)
perror_with_name (("ptrace"));
}
ptid = inferior_ptid;
{
#ifndef PTRACE_VFORK
wptid = fbsd_next_vfork_done ();
- if (!ptid_equal (wptid, null_ptid))
+ if (wptid != null_ptid)
{
ourstatus->kind = TARGET_WAITKIND_VFORK_DONE;
return wptid;
/* Make sure the other end of the fork is stopped too. */
child_ptid = fbsd_is_child_pending (child);
- if (ptid_equal (child_ptid, null_ptid))
+ if (child_ptid == null_ptid)
{
pid = waitpid (child, &status, 0);
if (pid == -1)