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 D46C838582BE for ; Fri, 8 Jul 2022 01:03:38 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D46C838582BE 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 1927E1A84E26 for ; Thu, 7 Jul 2022 21:03:34 -0400 (EDT) From: John Baldwin To: gdb-patches@sourceware.org Subject: [PATCH 3/5] fbsd-nat: Pass an optional register base to the register set helpers. Date: Thu, 7 Jul 2022 17:58:14 -0700 Message-Id: <20220708005816.9408-4-jhb@FreeBSD.org> X-Mailer: git-send-email 2.36.1 In-Reply-To: <20220708005816.9408-1-jhb@FreeBSD.org> References: <20220708005816.9408-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]); Thu, 07 Jul 2022 21:03:34 -0400 (EDT) X-Virus-Scanned: clamav-milter 0.103.1 at mail.baldwin.cx X-Virus-Status: Clean X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, FORGED_SPF_HELO, GIT_PATCH_0, KAM_DMARC_STATUS, KHOP_HELO_FCRDNS, SPF_HELO_PASS, SPF_SOFTFAIL, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Fri, 08 Jul 2022 01:03:40 -0000 This is needed to permit using the helpers for register sets with a variable base. In particular regnum needs to be converted into a relative register number before passed to regcache_map_supplies. --- gdb/fbsd-nat.c | 34 +++++++++++++++++++--------------- gdb/fbsd-nat.h | 49 ++++++++++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 36 deletions(-) diff --git a/gdb/fbsd-nat.c b/gdb/fbsd-nat.c index 9d7383ac0ab..edcd3fc3ed1 100644 --- a/gdb/fbsd-nat.c +++ b/gdb/fbsd-nat.c @@ -1732,14 +1732,15 @@ fbsd_nat_target::supports_disable_randomization () bool fbsd_nat_target::fetch_register_set (struct regcache *regcache, int regnum, int fetch_op, const struct regset *regset, - void *regs, size_t size) + int regbase, void *regs, size_t size) { const struct regcache_map_entry *map = (const struct regcache_map_entry *) regset->regmap; pid_t pid = get_ptrace_pid (regcache->ptid ()); - if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), - size)) + if (regnum == -1 + || (regnum >= regbase && regcache_map_supplies (map, regnum - regbase, + regcache->arch(), size))) { if (ptrace (fetch_op, pid, (PTRACE_TYPE_ARG3) regs, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -1755,15 +1756,16 @@ fbsd_nat_target::fetch_register_set (struct regcache *regcache, int regnum, bool fbsd_nat_target::store_register_set (struct regcache *regcache, int regnum, int fetch_op, int store_op, - const struct regset *regset, void *regs, - size_t size) + const struct regset *regset, int regbase, + void *regs, size_t size) { const struct regcache_map_entry *map = (const struct regcache_map_entry *) regset->regmap; pid_t pid = get_ptrace_pid (regcache->ptid ()); - if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), - size)) + if (regnum == -1 + || (regnum >= regbase && regcache_map_supplies (map, regnum - regbase, + regcache->arch(), size))) { if (ptrace (fetch_op, pid, (PTRACE_TYPE_ARG3) regs, 0) == -1) perror_with_name (_("Couldn't get registers")); @@ -1796,15 +1798,16 @@ fbsd_nat_target::have_regset (ptid_t ptid, int note) bool fbsd_nat_target::fetch_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset, void *regs, - size_t size) + const struct regset *regset, int regbase, + void *regs, size_t size) { const struct regcache_map_entry *map = (const struct regcache_map_entry *) regset->regmap; pid_t pid = get_ptrace_pid (regcache->ptid ()); - if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), - size)) + if (regnum == -1 + || (regnum >= regbase && regcache_map_supplies (map, regnum - regbase, + regcache->arch(), size))) { struct iovec iov; @@ -1821,15 +1824,16 @@ fbsd_nat_target::fetch_regset (struct regcache *regcache, int regnum, int note, bool fbsd_nat_target::store_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset, void *regs, - size_t size) + const struct regset *regset, int regbase, + void *regs, size_t size) { const struct regcache_map_entry *map = (const struct regcache_map_entry *) regset->regmap; pid_t pid = get_ptrace_pid (regcache->ptid ()); - if (regnum == -1 || regcache_map_supplies (map, regnum, regcache->arch(), - size)) + if (regnum == -1 + || (regnum >= regbase && regcache_map_supplies (map, regnum - regbase, + regcache->arch(), size))) { struct iovec iov; diff --git a/gdb/fbsd-nat.h b/gdb/fbsd-nat.h index 3a13bc8711f..22e47dcca0d 100644 --- a/gdb/fbsd-nat.h +++ b/gdb/fbsd-nat.h @@ -133,7 +133,8 @@ class fbsd_nat_target : public inf_ptrace_target /* Helper routines for use in fetch_registers and store_registers in subclasses. These routines fetch and store a single set of registers described by REGSET. The REGSET's 'regmap' field must - point to an array of 'struct regcache_map_entry'. + point to an array of 'struct regcache_map_entry'. The valid + register numbers in the register map are relative to REGBASE. FETCH_OP is a ptrace operation to fetch the set of registers from a native thread. STORE_OP is a ptrace operation to store the set @@ -143,24 +144,27 @@ class fbsd_nat_target : public inf_ptrace_target and SIZE is the size of the storage. Returns true if the register set was transferred due to a - matching REGNUM.*/ + matching REGNUM. */ bool fetch_register_set (struct regcache *regcache, int regnum, int fetch_op, - const struct regset *regset, void *regs, size_t size); + const struct regset *regset, int regbase, void *regs, + size_t size); bool store_register_set (struct regcache *regcache, int regnum, int fetch_op, int store_op, const struct regset *regset, - void *regs, size_t size); + int regbase, void *regs, size_t size); /* Helper routines which use PT_GETREGSET and PT_SETREGSET for the specified NOTE instead of regset-specific fetch and store ops. */ bool fetch_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset, void *regs, size_t size); + const struct regset *regset, int regbase, void *regs, + size_t size); bool store_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset, void *regs, size_t size); + const struct regset *regset, int regbase, void *regs, + size_t size); protected: /* Wrapper versions of the above helpers which accept a register set @@ -168,22 +172,23 @@ class fbsd_nat_target : public inf_ptrace_target template bool fetch_register_set (struct regcache *regcache, int regnum, int fetch_op, - const struct regset *regset) + const struct regset *regset, int regbase = 0) { Regset regs; - return fetch_register_set (regcache, regnum, fetch_op, regset, ®s, - sizeof (regs)); - } - - template - bool store_register_set (struct regcache *regcache, int regnum, int fetch_op, - int store_op, const struct regset *regset) - { - Regset regs; - return store_register_set (regcache, regnum, fetch_op, store_op, regset, + return fetch_register_set (regcache, regnum, fetch_op, regset, regbase, ®s, sizeof (regs)); } + template + bool store_register_set (struct regcache *regcache, int regnum, int fetch_op, + int store_op, const struct regset *regset, + int regbase = 0) + { + Regset regs; + return store_register_set (regcache, regnum, fetch_op, store_op, regset, + regbase, ®s, sizeof (regs)); + } + /* Helper routine for use in read_description in subclasses. This routine checks if the register set for the specified NOTE is present for a given PTID. If the register set is present, the @@ -197,18 +202,20 @@ class fbsd_nat_target : public inf_ptrace_target template bool fetch_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset) + const struct regset *regset, int regbase = 0) { Regset regs; - return fetch_regset (regcache, regnum, note, regset, ®s, sizeof (regs)); + return fetch_regset (regcache, regnum, note, regset, regbase, ®s, + sizeof (regs)); } template bool store_regset (struct regcache *regcache, int regnum, int note, - const struct regset *regset) + const struct regset *regset, int regbase = 0) { Regset regs; - return store_regset (regcache, regnum, note, regset, ®s, sizeof (regs)); + return store_regset (regcache, regnum, note, regset, regbase, ®s, + sizeof (regs)); } }; -- 2.36.1