gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / obsd-nat.c
index e4c0d97b2398c0ae6f90a7b8ff8b040dee04bcf5..6667a0add7fed063c97ea28fd1c9a7581fc0ad41 100644 (file)
@@ -1,6 +1,6 @@
 /* Native-dependent code for OpenBSD.
 
-   Copyright (C) 2012-2019 Free Software Foundation, Inc.
+   Copyright (C) 2012-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -24,7 +24,7 @@
 
 #include <sys/types.h>
 #include <sys/ptrace.h>
-#include "gdb_wait.h"
+#include "gdbsupport/gdb_wait.h"
 
 #include "inf-child.h"
 #include "obsd-nat.h"
 
 #ifdef PT_GET_THREAD_FIRST
 
-const char *
+std::string
 obsd_nat_target::pid_to_str (ptid_t ptid)
 {
   if (ptid.lwp () != 0)
-    {
-      static char buf[64];
-
-      xsnprintf (buf, sizeof buf, "thread %ld", ptid.lwp ());
-      return buf;
-    }
+    return string_printf ("thread %ld", ptid.lwp ());
 
   return normal_pid_to_str (ptid);
 }
@@ -64,12 +59,12 @@ obsd_nat_target::update_thread_list ()
     {
       ptid_t ptid = ptid_t (pid, pts.pts_tid, 0);
 
-      if (!in_thread_list (ptid))
+      if (!in_thread_list (this, ptid))
        {
          if (inferior_ptid.lwp () == 0)
-           thread_change_ptid (inferior_ptid, ptid);
+           thread_change_ptid (this, inferior_ptid, ptid);
          else
-           add_thread (ptid);
+           add_thread (this, ptid);
        }
 
       if (ptrace (PT_GET_THREAD_NEXT, pid, (caddr_t)&pts, sizeof pts) == -1)
@@ -152,12 +147,12 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
        }
 
       ptid = ptid_t (pid, pe.pe_tid, 0);
-      if (!in_thread_list (ptid))
+      if (!in_thread_list (this, ptid))
        {
          if (inferior_ptid.lwp () == 0)
-           thread_change_ptid (inferior_ptid, ptid);
+           thread_change_ptid (this, inferior_ptid, ptid);
          else
-           add_thread (ptid);
+           add_thread (this, ptid);
        }
     }
 
@@ -166,3 +161,66 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus,
 }
 
 #endif /* PT_GET_THREAD_FIRST */
+
+#ifdef PT_GET_PROCESS_STATE
+
+void
+obsd_nat_target::post_attach (int pid)
+{
+  ptrace_event_t pe;
+
+  /* Set the initial event mask.  */
+  memset (&pe, 0, sizeof pe);
+  pe.pe_set_event |= PTRACE_FORK;
+  if (ptrace (PT_SET_EVENT_MASK, pid,
+             (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+    perror_with_name (("ptrace"));
+}
+
+void
+obsd_nat_target::post_startup_inferior (ptid_t pid)
+{
+  ptrace_event_t pe;
+
+  /* Set the initial event mask.  */
+  memset (&pe, 0, sizeof pe);
+  pe.pe_set_event |= PTRACE_FORK;
+  if (ptrace (PT_SET_EVENT_MASK, pid.pid (),
+             (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+    perror_with_name (("ptrace"));
+}
+
+/* Target hook for follow_fork.  On entry and at return inferior_ptid is
+   the ptid of the followed inferior.  */
+
+bool
+obsd_nat_target::follow_fork (bool follow_child, bool detach_fork)
+{
+  if (!follow_child)
+    {
+      struct thread_info *tp = inferior_thread ();
+      pid_t child_pid = tp->pending_follow.value.related_pid.pid ();
+
+      /* Breakpoints have already been detached from the child by
+        infrun.c.  */
+
+      if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
+       perror_with_name (("ptrace"));
+    }
+
+  return false;
+}
+
+int
+obsd_nat_target::insert_fork_catchpoint (int pid)
+{
+  return 0;
+}
+
+int
+obsd_nat_target::remove_fork_catchpoint (int pid)
+{
+  return 0;
+}
+
+#endif /* PT_GET_PROCESS_STATE */
This page took 0.024961 seconds and 4 git commands to generate.