diff options
author | John Baldwin <jhb@FreeBSD.org> | 2022-03-22 12:05:43 -0700 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2022-03-22 12:05:43 -0700 |
commit | 041a4212d37de6172b3428613c9f9f52ab950c6c (patch) | |
tree | 940e10dd7ef8cc884af594357ecb034e2a3030f8 | |
parent | c77282d8ba91cf25cf2f08b76702c447e2e74575 (diff) | |
download | gdb-041a4212d37de6172b3428613c9f9f52ab950c6c.zip gdb-041a4212d37de6172b3428613c9f9f52ab950c6c.tar.gz gdb-041a4212d37de6172b3428613c9f9f52ab950c6c.tar.bz2 |
x86-fbsd-nat: Copy debug register state on fork.
Use the FreeBSD native target low_new_fork hook to copy the
per-process debug state from the parent to the child on fork.
-rw-r--r-- | gdb/configure.nat | 4 | ||||
-rw-r--r-- | gdb/x86-fbsd-nat.c | 45 | ||||
-rw-r--r-- | gdb/x86-fbsd-nat.h | 2 |
3 files changed, 49 insertions, 2 deletions
diff --git a/gdb/configure.nat b/gdb/configure.nat index b45519f..92ad4a6 100644 --- a/gdb/configure.nat +++ b/gdb/configure.nat @@ -165,7 +165,7 @@ case ${gdb_host} in i386) # Host: FreeBSD/i386 NATDEPFILES="${NATDEPFILES} x86-nat.o nat/x86-dregs.o \ - x86-bsd-nat.o i386-fbsd-nat.o bsd-kvm.o" + x86-bsd-nat.o x86-fbsd-nat.o i386-fbsd-nat.o bsd-kvm.o" ;; mips) # Host: FreeBSD/mips @@ -194,7 +194,7 @@ case ${gdb_host} in # Host: FreeBSD/amd64 NATDEPFILES="${NATDEPFILES} amd64-nat.o \ amd64-fbsd-nat.o bsd-kvm.o x86-nat.o nat/x86-dregs.o \ - x86-bsd-nat.o" + x86-bsd-nat.o x86-fbsd-nat.o" ;; esac ;; diff --git a/gdb/x86-fbsd-nat.c b/gdb/x86-fbsd-nat.c new file mode 100644 index 0000000..ad8c693 --- /dev/null +++ b/gdb/x86-fbsd-nat.c @@ -0,0 +1,45 @@ +/* Native-dependent code for FreeBSD x86. + + Copyright (C) 2022 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, see <http://www.gnu.org/licenses/>. */ + +#include "defs.h" +#include "x86-fbsd-nat.h" + +/* Implement the virtual fbsd_nat_target::low_new_fork method. */ + +void +x86_fbsd_nat_target::low_new_fork (ptid_t parent, pid_t child) +{ + struct x86_debug_reg_state *parent_state, *child_state; + + /* If there is no parent state, no watchpoints nor breakpoints have + been set, so there is nothing to do. */ + parent_state = x86_lookup_debug_reg_state (parent.pid ()); + if (parent_state == nullptr) + return; + + /* The kernel clears debug registers in the new child process after + fork, but GDB core assumes the child inherits the watchpoints/hw + breakpoints of the parent, and will remove them all from the + forked off process. Copy the debug registers mirrors into the + new process so that all breakpoints and watchpoints can be + removed together. */ + + child_state = x86_debug_reg_state (child); + *child_state = *parent_state; +} diff --git a/gdb/x86-fbsd-nat.h b/gdb/x86-fbsd-nat.h index f9d3514..cdb8cd3 100644 --- a/gdb/x86-fbsd-nat.h +++ b/gdb/x86-fbsd-nat.h @@ -29,6 +29,8 @@ class x86_fbsd_nat_target : public x86bsd_nat_target<fbsd_nat_target> { bool supports_stopped_by_hw_breakpoint () override { return true; } + + void low_new_fork (ptid_t parent, pid_t child) override; }; #endif /* x86-bsd-nat.h */ |