X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobsd-nat.c;h=6667a0add7fed063c97ea28fd1c9a7581fc0ad41;hb=5233f39b8b999f2675fb9493149e878c281e1d60;hp=3a73cbdd272a91a9e8c74135431dfe52c50b6392;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/obsd-nat.c b/gdb/obsd-nat.c index 3a73cbdd27..6667a0add7 100644 --- a/gdb/obsd-nat.c +++ b/gdb/obsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for OpenBSD. - Copyright (C) 2012-2017 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,7 @@ #include #include -#include "gdb_wait.h" +#include "gdbsupport/gdb_wait.h" #include "inf-child.h" #include "obsd-nat.h" @@ -35,24 +35,19 @@ #ifdef PT_GET_THREAD_FIRST -static char * -obsd_pid_to_str (struct target_ops *ops, ptid_t ptid) +std::string +obsd_nat_target::pid_to_str (ptid_t ptid) { - if (ptid_get_lwp (ptid) != 0) - { - static char buf[64]; - - xsnprintf (buf, sizeof buf, "thread %ld", ptid_get_lwp (ptid)); - return buf; - } + if (ptid.lwp () != 0) + return string_printf ("thread %ld", ptid.lwp ()); return normal_pid_to_str (ptid); } -static void -obsd_update_thread_list (struct target_ops *ops) +void +obsd_nat_target::update_thread_list () { - pid_t pid = ptid_get_pid (inferior_ptid); + pid_t pid = inferior_ptid.pid (); struct ptrace_thread_state pts; prune_threads (); @@ -62,14 +57,14 @@ obsd_update_thread_list (struct target_ops *ops) while (pts.pts_tid != -1) { - ptid_t ptid = ptid_build (pid, pts.pts_tid, 0); + ptid_t ptid = ptid_t (pid, pts.pts_tid, 0); - if (!in_thread_list (ptid)) + if (!in_thread_list (this, ptid)) { - if (ptid_get_lwp (inferior_ptid) == 0) - thread_change_ptid (inferior_ptid, ptid); + if (inferior_ptid.lwp () == 0) + 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) @@ -77,9 +72,9 @@ obsd_update_thread_list (struct target_ops *ops) } } -static ptid_t -obsd_wait (struct target_ops *ops, - ptid_t ptid, struct target_waitstatus *ourstatus, int options) +ptid_t +obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, + int options) { pid_t pid; int status, save_errno; @@ -90,7 +85,7 @@ obsd_wait (struct target_ops *ops, do { - pid = waitpid (ptid_get_pid (ptid), &status, 0); + pid = waitpid (ptid.pid (), &status, 0); save_errno = errno; } while (pid == -1 && errno == EINTR); @@ -110,12 +105,12 @@ obsd_wait (struct target_ops *ops, } /* Ignore terminated detached child processes. */ - if (!WIFSTOPPED (status) && pid != ptid_get_pid (inferior_ptid)) + if (!WIFSTOPPED (status) && pid != inferior_ptid.pid ()) pid = -1; } while (pid == -1); - ptid = pid_to_ptid (pid); + ptid = ptid_t (pid); if (WIFSTOPPED (status)) { @@ -129,7 +124,7 @@ obsd_wait (struct target_ops *ops, { case PTRACE_FORK: ourstatus->kind = TARGET_WAITKIND_FORKED; - ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid); + ourstatus->value.related_pid = ptid_t (pe.pe_other_pid); /* Make sure the other end of the fork is stopped too. */ fpid = waitpid (pe.pe_other_pid, &status, 0); @@ -142,22 +137,22 @@ obsd_wait (struct target_ops *ops, gdb_assert (pe.pe_report_event == PTRACE_FORK); gdb_assert (pe.pe_other_pid == pid); - if (fpid == ptid_get_pid (inferior_ptid)) + if (fpid == inferior_ptid.pid ()) { - ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid); - return pid_to_ptid (fpid); + ourstatus->value.related_pid = ptid_t (pe.pe_other_pid); + return ptid_t (fpid); } - return pid_to_ptid (pid); + return ptid_t (pid); } - ptid = ptid_build (pid, pe.pe_tid, 0); - if (!in_thread_list (ptid)) + ptid = ptid_t (pid, pe.pe_tid, 0); + if (!in_thread_list (this, ptid)) { - if (ptid_get_lwp (inferior_ptid) == 0) - thread_change_ptid (inferior_ptid, ptid); + if (inferior_ptid.lwp () == 0) + thread_change_ptid (this, inferior_ptid, ptid); else - add_thread (ptid); + add_thread (this, ptid); } } @@ -165,22 +160,67 @@ obsd_wait (struct target_ops *ops, return ptid; } +#endif /* PT_GET_THREAD_FIRST */ + +#ifdef PT_GET_PROCESS_STATE + void -obsd_add_target (struct target_ops *t) +obsd_nat_target::post_attach (int pid) { - /* Override some methods to support threads. */ - t->to_pid_to_str = obsd_pid_to_str; - t->to_update_thread_list = obsd_update_thread_list; - t->to_wait = obsd_wait; - add_target (t); -} + ptrace_event_t pe; -#else + /* 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_add_target (struct target_ops *t) +obsd_nat_target::post_startup_inferior (ptid_t pid) { - add_target (t); + 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")); } -#endif /* PT_GET_THREAD_FIRST */ +/* 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 */