From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.baldwin.cx (bigwig.baldwin.cx [66.216.25.90]) by sourceware.org (Postfix) with ESMTPS id 2EF283952010 for ; Wed, 16 Mar 2022 20:19:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 2EF283952010 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=FreeBSD.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=FreeBSD.org Received: from ralph.com (ralph.baldwin.cx [66.234.199.215]) by mail.baldwin.cx (Postfix) with ESMTPSA id 8E0691A84E62 for ; Wed, 16 Mar 2022 16:19:47 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH v2 06/12] x86-fbsd-nat: Copy debug register state on fork. Date: Wed, 16 Mar 2022 13:19:17 -0700 Message-Id: <20220316201923.89694-7-jhb@FreeBSD.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220316201923.89694-1-jhb@FreeBSD.org> References: <20220316201923.89694-1-jhb@FreeBSD.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.6.4 (mail.baldwin.cx [0.0.0.0]); Wed, 16 Mar 2022 16:19:47 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_SHORT, KHOP_HELO_FCRDNS, SPF_HELO_PASS, SPF_SOFTFAIL, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Mar 2022 20:19:49 -0000 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.34.1