From 041a4212d37de6172b3428613c9f9f52ab950c6c Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Tue, 22 Mar 2022 12:05:43 -0700 Subject: [PATCH] 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. --- gdb/configure.nat | 4 ++-- gdb/x86-fbsd-nat.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ gdb/x86-fbsd-nat.h | 2 ++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 gdb/x86-fbsd-nat.c diff --git a/gdb/configure.nat b/gdb/configure.nat index b45519fd116..92ad4a6522b 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 00000000000..ad8c693b68e --- /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 . */ + +#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 f9d3514aab4..cdb8cd36a4c 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 { 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 */ -- 2.30.2