From patchwork Tue Feb 28 11:27:59 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65736 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 326E0385842A for ; Tue, 28 Feb 2023 11:29:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 326E0385842A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583778; bh=Gtcovufc+2zq2W+zCndoM28R/0ebohtKrwjn579uMFs=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=GnpdoKVss+7v4tN8pMqXa1Kf8RvznbTGR5BWsKSMIl/hHYZ0WXsXWacd3DCJUmiSP rN2tx/x1lDwqwXpQGcO9cXalB2UtM3l4y6xGO4pzo3Xl4TH9JgzM28HETjzYm+UnVX eOXEh1nRYDbHYH8Y5R88TH3q0qR3kjDrVt5Z9mqU= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by sourceware.org (Postfix) with ESMTPS id 448D03858C53 for ; Tue, 28 Feb 2023 11:29:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 448D03858C53 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="335597997" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="335597997" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:44 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="706541647" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="706541647" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:43 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 01/26] gdbserver: convert init_register_cache into regcache::initialize Date: Tue, 28 Feb 2023 12:27:59 +0100 Message-Id: <696f1910a4f60993f28541e1a6e41be9f65f6a20.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" This is a refactoring that converts the `init_register_cache` function to a method of the regcache struct. During this conversion, we also change the return type to void. --- gdbserver/regcache.cc | 32 +++++++++++++++----------------- gdbserver/regcache.h | 7 +++---- gdbserver/tracepoint.cc | 9 ++++----- 3 files changed, 22 insertions(+), 26 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 0b1141662ac..7987c406ab4 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -113,10 +113,9 @@ regcache_invalidate (void) #endif -struct regcache * -init_register_cache (struct regcache *regcache, - const struct target_desc *tdesc, - unsigned char *regbuf) +void +regcache::initialize (const target_desc *tdesc, + unsigned char *regbuf) { if (regbuf == NULL) { @@ -125,13 +124,13 @@ init_register_cache (struct regcache *regcache, created, in case there are registers the target never fetches. This way they'll read as zero instead of garbage. */ - regcache->tdesc = tdesc; - regcache->registers + this->tdesc = tdesc; + this->registers = (unsigned char *) xcalloc (1, tdesc->registers_size); - regcache->registers_owned = 1; - regcache->register_status + this->registers_owned = 1; + this->register_status = (unsigned char *) xmalloc (tdesc->reg_defs.size ()); - memset ((void *) regcache->register_status, REG_UNAVAILABLE, + memset ((void *) this->register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); #else gdb_assert_not_reached ("can't allocate memory from the heap"); @@ -139,17 +138,15 @@ init_register_cache (struct regcache *regcache, } else { - regcache->tdesc = tdesc; - regcache->registers = regbuf; - regcache->registers_owned = 0; + this->tdesc = tdesc; + this->registers = regbuf; + this->registers_owned = 0; #ifndef IN_PROCESS_AGENT - regcache->register_status = NULL; + this->register_status = nullptr; #endif } - regcache->registers_valid = 0; - - return regcache; + this->registers_valid = 0; } #ifndef IN_PROCESS_AGENT @@ -160,8 +157,9 @@ new_register_cache (const struct target_desc *tdesc) struct regcache *regcache = new struct regcache; gdb_assert (tdesc->registers_size != 0); + regcache->initialize (tdesc, nullptr); - return init_register_cache (regcache, tdesc, NULL); + return regcache; } void diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 7248bcf5808..15b7e2b4dff 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -46,6 +46,9 @@ struct regcache : public reg_buffer_common unsigned char *register_status = nullptr; #endif + /* Init the regcache data. */ + void initialize (const target_desc *tdesc, unsigned char *regbuf); + /* See gdbsupport/common-regcache.h. */ enum register_status get_register_status (int regnum) const override; @@ -59,10 +62,6 @@ struct regcache : public reg_buffer_common bool raw_compare (int regnum, const void *buf, int offset) const override; }; -struct regcache *init_register_cache (struct regcache *regcache, - const struct target_desc *tdesc, - unsigned char *regbuf); - void regcache_cpy (struct regcache *dst, struct regcache *src); /* Create a new register cache for INFERIOR. */ diff --git a/gdbserver/tracepoint.cc b/gdbserver/tracepoint.cc index 3f60989e4c7..e4715b95eb3 100644 --- a/gdbserver/tracepoint.cc +++ b/gdbserver/tracepoint.cc @@ -4706,7 +4706,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) if (!fctx->regcache_initted) { fctx->regcache_initted = 1; - init_register_cache (&fctx->regcache, ipa_tdesc, fctx->regspace); + fctx->regcache.initialize (ipa_tdesc, fctx->regspace); supply_regblock (&fctx->regcache, NULL); supply_fast_tracepoint_registers (&fctx->regcache, fctx->regs); } @@ -4721,7 +4721,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) if (!sctx->regcache_initted) { sctx->regcache_initted = 1; - init_register_cache (&sctx->regcache, ipa_tdesc, sctx->regspace); + sctx->regcache.initialize (ipa_tdesc, sctx->regspace); supply_regblock (&sctx->regcache, NULL); /* Pass down the tracepoint address, because REGS doesn't include the PC, but we know what it must have been. */ @@ -4799,8 +4799,7 @@ do_action_at_tracepoint (struct tracepoint_hit_ctx *ctx, /* Wrap the regblock in a register cache (in the stack, we don't want to malloc here). */ - init_register_cache (&tregcache, context_regcache->tdesc, - regspace + 1); + tregcache.initialize (context_regcache->tdesc, regspace + 1); /* Copy the register data to the regblock. */ regcache_cpy (&tregcache, context_regcache); @@ -5207,7 +5206,7 @@ traceframe_get_pc (struct traceframe *tframe) if (dataptr == NULL) return 0; - init_register_cache (®cache, tdesc, dataptr); + regcache.initialize (tdesc, dataptr); return regcache_read_pc (®cache); } From patchwork Tue Feb 28 11:28:00 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65733 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 1CCA8385483E for ; Tue, 28 Feb 2023 11:29:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1CCA8385483E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583758; bh=wEvyZkzQOtJgmbDGm5a3M9UKvf+iQB4IJ98U3B3BjTM=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=c2MSzXwgfGi0TS8Z/TJaZdfOFRgfxyGPDR/z7/VmhVWYYG49hwH8ZhGxKlRUQN9eA qiI+j0/pb8LNboSN8/m2DYFYLJaRD4Y4Q+1HoNA1nI0YJQ+CWb2VoiTqbMRWODOqpo VSTsxztXQbhU0ycYxmli2Gwfk2l8wpS4IiCmXXiY= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id 3E1133858C62 for ; Tue, 28 Feb 2023 11:28:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3E1133858C62 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="314536301" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="314536301" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:50 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="738120400" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="738120400" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:49 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 02/26] gdbserver: convert new_register_cache into a regcache constructor Date: Tue, 28 Feb 2023 12:28:00 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the `new_register_cache` function into a constructor of the regcache struct. Also define a default ctor because it is used in other places, in particular, tracepoint.cc. --- gdbserver/regcache.cc | 11 +++-------- gdbserver/regcache.h | 8 ++++---- gdbserver/server.cc | 2 +- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 7987c406ab4..1410dd96551 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -43,7 +43,7 @@ get_thread_regcache (struct thread_info *thread, int fetch) gdb_assert (proc->tdesc != NULL); - regcache = new_register_cache (proc->tdesc); + regcache = new struct regcache (proc->tdesc); set_thread_regcache_data (thread, regcache); } @@ -151,15 +151,10 @@ regcache::initialize (const target_desc *tdesc, #ifndef IN_PROCESS_AGENT -struct regcache * -new_register_cache (const struct target_desc *tdesc) +regcache::regcache (const target_desc *tdesc) { - struct regcache *regcache = new struct regcache; - gdb_assert (tdesc->registers_size != 0); - regcache->initialize (tdesc, nullptr); - - return regcache; + initialize (tdesc, nullptr); } void diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 15b7e2b4dff..0002726ed00 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -44,6 +44,10 @@ struct regcache : public reg_buffer_common #ifndef IN_PROCESS_AGENT /* One of REG_UNAVAILABLE or REG_VALID. */ unsigned char *register_status = nullptr; + + /* Constructors. */ + regcache () = default; + regcache (const target_desc *tdesc); #endif /* Init the regcache data. */ @@ -64,10 +68,6 @@ struct regcache : public reg_buffer_common void regcache_cpy (struct regcache *dst, struct regcache *src); -/* Create a new register cache for INFERIOR. */ - -struct regcache *new_register_cache (const struct target_desc *tdesc); - struct regcache *get_thread_regcache (struct thread_info *thread, int fetch); /* Release all memory associated with the register cache for INFERIOR. */ diff --git a/gdbserver/server.cc b/gdbserver/server.cc index 949849b63a2..f85d7ed9cf5 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4238,7 +4238,7 @@ process_serial_event (void) if (cs.current_traceframe >= 0) { struct regcache *regcache - = new_register_cache (current_target_desc ()); + = new struct regcache (current_target_desc ()); if (fetch_traceframe_registers (cs.current_traceframe, regcache, -1) == 0) From patchwork Tue Feb 28 11:28:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65734 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id ED7C6385142A for ; Tue, 28 Feb 2023 11:29:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ED7C6385142A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583764; bh=+oGn46Z7tR3pt0yaumfX4sFQhUKXiZKt/V8MJPf7lt8=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=r7g3EyF2s4lyplWLjAyw18pwQEX5f5uisCXAZLwTkLIBQRfN7+9aGmy6MkeQTFaB6 fOrs1KJO6a38PEGKPSHX0sNOQDXk56qxwExWq7XUKHe4lx3A6Yp3Ob9fVRcW0NLT+3 3gCZL1d1+K0FW9/yETx6IHQV+K/+xbXU2nBfBajM= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id B42D93858434 for ; Tue, 28 Feb 2023 11:28:56 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B42D93858434 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="314536314" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="314536314" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:56 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="738120444" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="738120444" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:28:55 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 03/26] gdbserver: by-pass regcache to access tdesc only Date: Tue, 28 Feb 2023 12:28:01 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The `get_thread_regcache` function has a `fetch` option to skip fetching the registers from the target. It seems this option is set to false only at uses where we just need to access the tdesc through the regcache of the current thread, as in struct regcache *regcache = get_thread_regcache (current_thread, 0); ... regcache->tdesc ... Since the tdesc of a regcache is set from the process of the thread that owns the regcache, we can simplify the code to access the tdesc via the process, as in ... current_process ()->tdesc ... This is intended to be a refactoring with no behavioral change. Tested only for the linux-x86-low target. --- gdbserver/linux-ppc-low.cc | 10 +++------- gdbserver/linux-s390-low.cc | 14 ++++---------- gdbserver/linux-x86-low.cc | 7 ++----- 3 files changed, 9 insertions(+), 22 deletions(-) diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc index f8dd770b8eb..96c1da4d905 100644 --- a/gdbserver/linux-ppc-low.cc +++ b/gdbserver/linux-ppc-low.cc @@ -1609,8 +1609,7 @@ ppc_target::install_fast_tracepoint_jump_pad (CORE_ADDR tpoint, const CORE_ADDR entryaddr = *jump_entry; int rsz, min_frame, frame_size, tp_reg; #ifdef __powerpc64__ - struct regcache *regcache = get_thread_regcache (current_thread, 0); - int is_64 = register_size (regcache->tdesc, 0) == 8; + int is_64 = register_size (current_process ()->tdesc, 0) == 8; int is_opd = is_64 && !is_elfv2_inferior (); #else int is_64 = 0, is_opd = 0; @@ -3381,9 +3380,7 @@ emit_ops * ppc_target::emit_ops () { #ifdef __powerpc64__ - struct regcache *regcache = get_thread_regcache (current_thread, 0); - - if (register_size (regcache->tdesc, 0) == 8) + if (register_size (current_process ()->tdesc, 0) == 8) { if (is_elfv2_inferior ()) return &ppc64v2_emit_ops_impl; @@ -3399,8 +3396,7 @@ ppc_target::emit_ops () int ppc_target::get_ipa_tdesc_idx () { - struct regcache *regcache = get_thread_regcache (current_thread, 0); - const struct target_desc *tdesc = regcache->tdesc; + const struct target_desc *tdesc = current_process ()->tdesc; #ifdef __powerpc64__ if (tdesc == tdesc_powerpc_64l) diff --git a/gdbserver/linux-s390-low.cc b/gdbserver/linux-s390-low.cc index 48f64ef7bb3..11f207ea2f1 100644 --- a/gdbserver/linux-s390-low.cc +++ b/gdbserver/linux-s390-low.cc @@ -797,9 +797,7 @@ s390_target::low_get_thread_area (int lwpid, CORE_ADDR *addrp) { CORE_ADDR res = ptrace (PTRACE_PEEKUSER, lwpid, (long) PT_ACR0, (long) 0); #ifdef __s390x__ - struct regcache *regcache = get_thread_regcache (current_thread, 0); - - if (register_size (regcache->tdesc, 0) == 4) + if (register_size (current_process ()->tdesc, 0) == 4) res &= 0xffffffffull; #endif *addrp = res; @@ -1287,8 +1285,7 @@ s390_target::install_fast_tracepoint_jump_pad unsigned char jbuf[6] = { 0xc0, 0xf4, 0, 0, 0, 0 }; /* jg ... */ CORE_ADDR buildaddr = *jump_entry; #ifdef __s390x__ - struct regcache *regcache = get_thread_regcache (current_thread, 0); - int is_64 = register_size (regcache->tdesc, 0) == 8; + int is_64 = register_size (current_process ()->tdesc, 0) == 8; int is_zarch = is_64 || have_hwcap_s390_high_gprs; int has_vx = have_hwcap_s390_vx; #else @@ -1452,8 +1449,7 @@ s390_target::get_min_fast_tracepoint_insn_len () int s390_target::get_ipa_tdesc_idx () { - struct regcache *regcache = get_thread_regcache (current_thread, 0); - const struct target_desc *tdesc = regcache->tdesc; + const struct target_desc *tdesc = current_process ()->tdesc; #ifdef __s390x__ if (tdesc == tdesc_s390x_linux64) @@ -2840,9 +2836,7 @@ emit_ops * s390_target::emit_ops () { #ifdef __s390x__ - struct regcache *regcache = get_thread_regcache (current_thread, 0); - - if (register_size (regcache->tdesc, 0) == 8) + if (register_size (current_process ()->tdesc, 0) == 8) return &s390x_emit_ops; else #endif diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc index 4a538b107be..e08ebacee05 100644 --- a/gdbserver/linux-x86-low.cc +++ b/gdbserver/linux-x86-low.cc @@ -276,9 +276,7 @@ static /*const*/ int i386_regmap[] = static int is_64bit_tdesc (thread_info *thread) { - struct regcache *regcache = get_thread_regcache (thread, 0); - - return register_size (regcache->tdesc, 0) == 8; + return register_size (get_thread_process (thread)->tdesc, 0) == 8; } #endif @@ -2958,8 +2956,7 @@ x86_target::low_supports_range_stepping () int x86_target::get_ipa_tdesc_idx () { - struct regcache *regcache = get_thread_regcache (current_thread, 0); - const struct target_desc *tdesc = regcache->tdesc; + const struct target_desc *tdesc = current_process ()->tdesc; #ifdef __x86_64__ return amd64_get_ipa_tdesc_idx (tdesc); From patchwork Tue Feb 28 11:28:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65735 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2E6FE385B514 for ; Tue, 28 Feb 2023 11:29:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2E6FE385B514 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583773; bh=myMGP6z2kO0DSE1M+WEqYNuQ9B1rBgE6Rqxt+1tqO1s=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=eBka2qogFs/gaTneLV2E+IeXtMiSuHBBtbsxb/5BKiwqceBWXUaC4IRIJpl7xyjgS kDuGUryudhZui2UCe5WhSO1Jz5+bq3q4GBAyeRE2MH7aluGvAcA5x9ShZyTXqwBPgL wvej9ZyDmhS5DOC2qySvWlx50XJXvd1EW8ya4OBc= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id CCFF13858C62 for ; Tue, 28 Feb 2023 11:29:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CCFF13858C62 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="314536329" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="314536329" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:03 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="738120478" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="738120478" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:02 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 04/26] gdbserver: boolify and defaultize the 'fetch' parameter of get_thread_regcache Date: Tue, 28 Feb 2023 12:28:02 +0100 Message-Id: <6f7de05f02980779a4e6c723598a563ee831e3f2.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Boolify the 'fetch' parameter of the get_thread_regcache function. All of the current uses pass true for this parameter. Therefore, define its default value as true and remove the argument from the uses. We still keep the parameter, though, to give downstream targets the option to obtain a regcache without having to fetch the whole contents. Our (Intel) downstream target is an example. --- gdbserver/linux-aarch32-low.cc | 2 +- gdbserver/linux-low.cc | 18 +++++++++--------- gdbserver/linux-ppc-low.cc | 2 +- gdbserver/linux-x86-low.cc | 2 +- gdbserver/mem-break.cc | 4 ++-- gdbserver/proc-service.cc | 2 +- gdbserver/regcache.cc | 4 ++-- gdbserver/regcache.h | 2 +- gdbserver/remote-utils.cc | 2 +- gdbserver/server.cc | 4 ++-- gdbserver/tracepoint.cc | 4 ++-- gdbserver/win32-low.cc | 2 +- 12 files changed, 24 insertions(+), 24 deletions(-) diff --git a/gdbserver/linux-aarch32-low.cc b/gdbserver/linux-aarch32-low.cc index 990a352af74..6508f587288 100644 --- a/gdbserver/linux-aarch32-low.cc +++ b/gdbserver/linux-aarch32-low.cc @@ -171,7 +171,7 @@ struct regs_info regs_info_aarch32 = int arm_is_thumb_mode (void) { - struct regcache *regcache = get_thread_regcache (current_thread, 1); + struct regcache *regcache = get_thread_regcache (current_thread); unsigned long cpsr; collect_register_by_name (regcache, "cpsr", &cpsr); diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index dec1944d45f..9e17e384c03 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -756,7 +756,7 @@ linux_process_target::get_pc (lwp_info *lwp) scoped_restore_current_thread restore_thread; switch_to_thread (get_lwp_thread (lwp)); - struct regcache *regcache = get_thread_regcache (current_thread, 1); + struct regcache *regcache = get_thread_regcache (current_thread); CORE_ADDR pc = low_get_pc (regcache); threads_debug_printf ("pc is 0x%lx", (long) pc); @@ -772,7 +772,7 @@ linux_process_target::get_syscall_trapinfo (lwp_info *lwp, int *sysno) scoped_restore_current_thread restore_thread; switch_to_thread (get_lwp_thread (lwp)); - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); low_get_syscall_trapinfo (regcache, sysno); threads_debug_printf ("get_syscall_trapinfo sysno %d", *sysno); @@ -880,7 +880,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp) if (pc != sw_breakpoint_pc) { struct regcache *regcache - = get_thread_regcache (current_thread, 1); + = get_thread_regcache (current_thread); low_set_pc (regcache, sw_breakpoint_pc); } @@ -2052,7 +2052,7 @@ linux_process_target::maybe_move_out_of_jump_pad (lwp_info *lwp, int *wstat) (PTRACE_TYPE_ARG3) 0, &info); } - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); low_set_pc (regcache, status.tpoint_addr); lwp->stop_pc = status.tpoint_addr; @@ -3053,7 +3053,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (increment_pc != 0) { struct regcache *regcache - = get_thread_regcache (current_thread, 1); + = get_thread_regcache (current_thread); event_child->stop_pc += increment_pc; low_set_pc (regcache, event_child->stop_pc); @@ -3341,7 +3341,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (low_supports_breakpoints ()) { struct regcache *regcache - = get_thread_regcache (current_thread, 1); + = get_thread_regcache (current_thread); low_set_pc (regcache, event_child->stop_pc); } @@ -3577,7 +3577,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus, if (decr_pc != 0) { struct regcache *regcache - = get_thread_regcache (current_thread, 1); + = get_thread_regcache (current_thread); low_set_pc (regcache, event_child->stop_pc + decr_pc); } } @@ -3912,7 +3912,7 @@ void linux_process_target::install_software_single_step_breakpoints (lwp_info *lwp) { struct thread_info *thread = get_lwp_thread (lwp); - struct regcache *regcache = get_thread_regcache (thread, 1); + struct regcache *regcache = get_thread_regcache (thread); scoped_restore_current_thread restore_thread; @@ -4087,7 +4087,7 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step, if (proc->tdesc != NULL && low_supports_breakpoints ()) { - struct regcache *regcache = get_thread_regcache (current_thread, 1); + struct regcache *regcache = get_thread_regcache (current_thread); lwp->stop_pc = low_get_pc (regcache); diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc index 96c1da4d905..5c1dd6c078d 100644 --- a/gdbserver/linux-ppc-low.cc +++ b/gdbserver/linux-ppc-low.cc @@ -1055,7 +1055,7 @@ ppc_target::low_get_thread_area (int lwpid, CORE_ADDR *addr) { struct lwp_info *lwp = find_lwp_pid (ptid_t (lwpid)); struct thread_info *thr = get_lwp_thread (lwp); - struct regcache *regcache = get_thread_regcache (thr, 1); + struct regcache *regcache = get_thread_regcache (thr); ULONGEST tp = 0; #ifdef __powerpc64__ diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc index e08ebacee05..c012cadcb54 100644 --- a/gdbserver/linux-x86-low.cc +++ b/gdbserver/linux-x86-low.cc @@ -353,7 +353,7 @@ x86_target::low_get_thread_area (int lwpid, CORE_ADDR *addr) { struct thread_info *thr = get_lwp_thread (lwp); - struct regcache *regcache = get_thread_regcache (thr, 1); + struct regcache *regcache = get_thread_regcache (thr); unsigned int desc[4]; ULONGEST gs = 0; const int reg_thread_area = 3; /* bits to scale down register value. */ diff --git a/gdbserver/mem-break.cc b/gdbserver/mem-break.cc index c669842228d..73eeb8114eb 100644 --- a/gdbserver/mem-break.cc +++ b/gdbserver/mem-break.cc @@ -1228,7 +1228,7 @@ gdb_condition_true_at_breakpoint_z_type (char z_type, CORE_ADDR addr) if (bp->cond_list == NULL) return 1; - ctx.regcache = get_thread_regcache (current_thread, 1); + ctx.regcache = get_thread_regcache (current_thread); ctx.tframe = NULL; ctx.tpoint = NULL; @@ -1350,7 +1350,7 @@ run_breakpoint_commands_z_type (char z_type, CORE_ADDR addr) if (bp == NULL) return 1; - ctx.regcache = get_thread_regcache (current_thread, 1); + ctx.regcache = get_thread_regcache (current_thread); ctx.tframe = NULL; ctx.tpoint = NULL; diff --git a/gdbserver/proc-service.cc b/gdbserver/proc-service.cc index 2d516a0cad7..031e9607241 100644 --- a/gdbserver/proc-service.cc +++ b/gdbserver/proc-service.cc @@ -113,7 +113,7 @@ ps_lgetregs (gdb_ps_prochandle_t ph, lwpid_t lwpid, prgregset_t gregset) scoped_restore_current_thread restore_thread; switch_to_thread (get_lwp_thread (lwp)); - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); gregset_info ()->fill_function (regcache, gregset); return PS_OK; diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 1410dd96551..21c2207822c 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -24,7 +24,7 @@ #ifndef IN_PROCESS_AGENT struct regcache * -get_thread_regcache (struct thread_info *thread, int fetch) +get_thread_regcache (struct thread_info *thread, bool fetch) { struct regcache *regcache; @@ -67,7 +67,7 @@ get_thread_regcache (struct thread_info *thread, int fetch) struct regcache * get_thread_regcache_for_ptid (ptid_t ptid) { - return get_thread_regcache (find_thread_ptid (ptid), 1); + return get_thread_regcache (find_thread_ptid (ptid)); } void diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 0002726ed00..5b2066ced4d 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -68,7 +68,7 @@ struct regcache : public reg_buffer_common void regcache_cpy (struct regcache *dst, struct regcache *src); -struct regcache *get_thread_regcache (struct thread_info *thread, int fetch); +regcache *get_thread_regcache (thread_info *thread, bool fetch = true); /* Release all memory associated with the register cache for INFERIOR. */ diff --git a/gdbserver/remote-utils.cc b/gdbserver/remote-utils.cc index 80310bc2c70..26ca621e2f1 100644 --- a/gdbserver/remote-utils.cc +++ b/gdbserver/remote-utils.cc @@ -1156,7 +1156,7 @@ prepare_resume_reply (char *buf, ptid_t ptid, const target_waitstatus &status) regp = current_target_desc ()->expedite_regs; - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); if (the_target->stopped_by_watchpoint ()) { diff --git a/gdbserver/server.cc b/gdbserver/server.cc index f85d7ed9cf5..4be12ec1c66 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4255,7 +4255,7 @@ process_serial_event (void) write_enn (cs.own_buf); else { - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); registers_to_string (regcache, cs.own_buf); } } @@ -4272,7 +4272,7 @@ process_serial_event (void) write_enn (cs.own_buf); else { - regcache = get_thread_regcache (current_thread, 1); + regcache = get_thread_regcache (current_thread); registers_from_string (regcache, &cs.own_buf[1]); write_ok (cs.own_buf); } diff --git a/gdbserver/tracepoint.cc b/gdbserver/tracepoint.cc index e4715b95eb3..82bb74addd1 100644 --- a/gdbserver/tracepoint.cc +++ b/gdbserver/tracepoint.cc @@ -4382,7 +4382,7 @@ tracepoint_finished_step (struct thread_info *tinfo, CORE_ADDR stop_pc) wstep->tp_number, paddress (wstep->tp_address)); ctx.base.type = trap_tracepoint; - ctx.regcache = get_thread_regcache (tinfo, 1); + ctx.regcache = get_thread_regcache (tinfo); while (wstep != NULL) { @@ -4543,7 +4543,7 @@ tracepoint_was_hit (struct thread_info *tinfo, CORE_ADDR stop_pc) return 0; ctx.base.type = trap_tracepoint; - ctx.regcache = get_thread_regcache (tinfo, 1); + ctx.regcache = get_thread_regcache (tinfo); for (tpoint = tracepoints; tpoint; tpoint = tpoint->next) { diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 756507709d8..5cc6a49e1f6 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -971,7 +971,7 @@ gdbserver_windows_process::handle_access_violation static void maybe_adjust_pc () { - struct regcache *regcache = get_thread_regcache (current_thread, 1); + struct regcache *regcache = get_thread_regcache (current_thread); child_fetch_inferior_registers (regcache, -1); windows_thread_info *th From patchwork Tue Feb 28 11:28:03 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65738 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 995DF385040B for ; Tue, 28 Feb 2023 11:30:03 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 995DF385040B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583803; bh=Q2/yHy0xtrnmXxGPHPM2BZLgcPHmjQaX5utx0UUewO0=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Wzz6unkyZ4/p4AGzGKWHWkxjbL4U0VihbyUpdSdWzhz7a3Il//p5axU699GrddjE/ 2ygEruYQaoCMsOZryuzz9BjhZpxMf//UfGwbZmMhb13pTvV4PIgA1Id7iop6C2nG1Q yFrO0++HswwO3S/cGqvTBWBjvDsK/pvmtcS+JpUc= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id 6896E3858401 for ; Tue, 28 Feb 2023 11:29:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6896E3858401 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="314536342" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="314536342" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:11 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="738120503" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="738120503" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:10 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 05/26] gdbserver: add a pointer to the owner thread in regcache Date: Tue, 28 Feb 2023 12:28:03 +0100 Message-Id: <5e9fc384d9456c05d12037a4f2f1999b675c19f5.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Add a back-link in regcache to the thread that owns the regcache. This will help us in future patches to refer to the right thread object without having to rely on the global current_thread pointer. --- gdbserver/regcache.cc | 1 + gdbserver/regcache.h | 3 +++ 2 files changed, 4 insertions(+) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 21c2207822c..2a8dc17ed6a 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -45,6 +45,7 @@ get_thread_regcache (struct thread_info *thread, bool fetch) regcache = new struct regcache (proc->tdesc); set_thread_regcache_data (thread, regcache); + regcache->thread = thread; } if (fetch && regcache->registers_valid == 0) diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 5b2066ced4d..053ed08b20f 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -33,6 +33,9 @@ struct regcache : public reg_buffer_common /* The regcache's target description. */ const struct target_desc *tdesc = nullptr; + /* Back-link to the thread to which this regcache belongs. */ + thread_info *thread = nullptr; + /* Whether the REGISTERS buffer's contents are valid. If false, we haven't fetched the registers from the target yet. Not that this register cache is _not_ pass-through, unlike GDB's. Note that From patchwork Tue Feb 28 11:28:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65742 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0014C384DD0B for ; Tue, 28 Feb 2023 11:30:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0014C384DD0B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583835; bh=8/H0/5PIp1rZMtwfHVvwkqOKQmq3JP1hGlKv+SDU968=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=RWOTEmO63JNDjAd0knGEJZY73K7P8LK//X39dTGVMkepB9Dp70bp5bxRUdyEq69c1 szerl+QusdzVF0wcgkfaw5JeRL5Vc6YZd0oRFyJZi+ydIqxMibdU35MiyO0t6lFDeX 4OPtdq0e1tQk/3ZXLQis58zydAH/kfFgbSQ+/Rbo= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by sourceware.org (Postfix) with ESMTPS id BC6503858004 for ; Tue, 28 Feb 2023 11:29:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BC6503858004 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="314536354" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="314536354" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:17 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="738120528" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="738120528" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga008-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:16 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 06/26] gdbserver: turn part of get_thread_regcache into regcache::fetch Date: Tue, 28 Feb 2023 12:28:04 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Extract out a piece of code in get_thread_regcache that fetches the registers from the target, and turn it into a method of 'regcache'. --- gdbserver/regcache.cc | 23 +++++++++++++++-------- gdbserver/regcache.h | 3 +++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 2a8dc17ed6a..89ecdfec6f3 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -48,19 +48,26 @@ get_thread_regcache (struct thread_info *thread, bool fetch) regcache->thread = thread; } - if (fetch && regcache->registers_valid == 0) + if (fetch) + regcache->fetch (); + + return regcache; +} + +void +regcache::fetch () +{ + if (registers_valid == 0) { scoped_restore_current_thread restore_thread; + gdb_assert (this->thread != nullptr); + switch_to_thread (this->thread); - switch_to_thread (thread); /* Invalidate all registers, to prevent stale left-overs. */ - memset (regcache->register_status, REG_UNAVAILABLE, - regcache->tdesc->reg_defs.size ()); - fetch_inferior_registers (regcache, -1); - regcache->registers_valid = 1; + memset (register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); + fetch_inferior_registers (this, -1); + registers_valid = 1; } - - return regcache; } /* See gdbsupport/common-regcache.h. */ diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 053ed08b20f..7eae6cb724a 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -67,6 +67,9 @@ struct regcache : public reg_buffer_common /* See gdbsupport/common-regcache.h. */ bool raw_compare (int regnum, const void *buf, int offset) const override; + + /* Fetch the registers from the target, if not done already. */ + void fetch (); }; void regcache_cpy (struct regcache *dst, struct regcache *src); From patchwork Tue Feb 28 11:28:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65737 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 731F638515F1 for ; Tue, 28 Feb 2023 11:29:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 731F638515F1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583792; bh=nfHlk5N12fQU2lkwlwJ6aiSsQkzwQ7LGpnhqtUbnf90=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=pm/7BTAbRWZgDhjZzopULY7a911DKQIgA2H4yHMMzk8ul3wLST598gBiwCWYtLH2H 7zcktW33GWamQba/juoOw0QEgiIXup0tS9KcRLatEvdLNYDKm7VoX7W4t59EBIqufP P1wrf2u/jNlRWt3F+6gxcHsr3DMaTR4kadNLuVuk= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by sourceware.org (Postfix) with ESMTPS id 5FF9C3851409 for ; Tue, 28 Feb 2023 11:29:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5FF9C3851409 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="396679464" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="396679464" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:23 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="919748174" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="919748174" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:23 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 07/26] gdbserver: convert regcache_cpy into regcache::copy_from Date: Tue, 28 Feb 2023 12:28:05 +0100 Message-Id: <4e915141249ac9e6f38b414f702d68755344ff70.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the free `regcache_cpy` function to a method of the regcache struct. --- gdbserver/regcache.cc | 16 ++++++++-------- gdbserver/regcache.h | 5 +++-- gdbserver/tracepoint.cc | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 89ecdfec6f3..be01df342bb 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -180,19 +180,19 @@ free_register_cache (struct regcache *regcache) #endif void -regcache_cpy (struct regcache *dst, struct regcache *src) +regcache::copy_from (regcache *src) { - gdb_assert (src != NULL && dst != NULL); - gdb_assert (src->tdesc == dst->tdesc); - gdb_assert (src != dst); + gdb_assert (src != nullptr); + gdb_assert (src->tdesc == this->tdesc); + gdb_assert (src != this); - memcpy (dst->registers, src->registers, src->tdesc->registers_size); + memcpy (this->registers, src->registers, src->tdesc->registers_size); #ifndef IN_PROCESS_AGENT - if (dst->register_status != NULL && src->register_status != NULL) - memcpy (dst->register_status, src->register_status, + if (this->register_status != nullptr && src->register_status != nullptr) + memcpy (this->register_status, src->register_status, src->tdesc->reg_defs.size ()); #endif - dst->registers_valid = src->registers_valid; + this->registers_valid = src->registers_valid; } /* Return a reference to the description of register N. */ diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 7eae6cb724a..32b3a8dccfc 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -70,9 +70,10 @@ struct regcache : public reg_buffer_common /* Fetch the registers from the target, if not done already. */ void fetch (); -}; -void regcache_cpy (struct regcache *dst, struct regcache *src); + /* Copy the contents of SRC into this regcache. */ + void copy_from (regcache *src); +}; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); diff --git a/gdbserver/tracepoint.cc b/gdbserver/tracepoint.cc index 82bb74addd1..26003422a70 100644 --- a/gdbserver/tracepoint.cc +++ b/gdbserver/tracepoint.cc @@ -4802,7 +4802,7 @@ do_action_at_tracepoint (struct tracepoint_hit_ctx *ctx, tregcache.initialize (context_regcache->tdesc, regspace + 1); /* Copy the register data to the regblock. */ - regcache_cpy (&tregcache, context_regcache); + tregcache.copy_from (context_regcache); #ifndef IN_PROCESS_AGENT /* On some platforms, trap-based tracepoints will have the PC From patchwork Tue Feb 28 11:28:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65741 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4CB4E3851ABE for ; Tue, 28 Feb 2023 11:30:22 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4CB4E3851ABE DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583822; bh=N8xIraSJ8U6NuBJDgTxc+jEImvFkSppVXF7xQ2gE2jU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=yaGHH6CZjfiXQWAsw7srsfyJ3whwVpTYrG2XESk0NLuJjq7Sdh+ptAhvoATysK3gz rFf83pmKbvbEvsKnmd0POh+qxgWSetqtWKE0H/4hSzq08Qc5wIPqBu4i8riyB4QV7n dvS8952P14vJTkeA3u+PxOWmzCff9dNSwm77RrR4= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by sourceware.org (Postfix) with ESMTPS id 063FE3858C27 for ; Tue, 28 Feb 2023 11:29:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 063FE3858C27 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="396679481" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="396679481" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:29 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="919748205" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="919748205" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:29 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 08/26] gdbserver: convert free_register_cache into a destructor of regcache Date: Tue, 28 Feb 2023 12:28:06 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the `free_register_cache` function into a destructor of the regcache struct. In one place, we completely remove the call to free the regcache object by stack-allocating the object. We also delete the copy constructor explicitly to prevent the risk of copying regcaches and then double-freeing buffers when they are destructed. --- gdbserver/gdbthread.h | 2 +- gdbserver/regcache.cc | 15 +++++---------- gdbserver/regcache.h | 9 +++++---- gdbserver/server.cc | 8 +++----- 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/gdbserver/gdbthread.h b/gdbserver/gdbthread.h index 493e1dbf6cb..cfd81870af9 100644 --- a/gdbserver/gdbthread.h +++ b/gdbserver/gdbthread.h @@ -35,7 +35,7 @@ struct thread_info ~thread_info () { - free_register_cache (this->regcache_data); + delete this->regcache_data; } /* The id of this thread. */ diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index be01df342bb..7b6337166ad 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -165,16 +165,11 @@ regcache::regcache (const target_desc *tdesc) initialize (tdesc, nullptr); } -void -free_register_cache (struct regcache *regcache) +regcache::~regcache () { - if (regcache) - { - if (regcache->registers_owned) - free (regcache->registers); - free (regcache->register_status); - delete regcache; - } + if (registers_owned) + free (registers); + free (register_status); } #endif @@ -280,7 +275,7 @@ free_register_cache_thread (struct thread_info *thread) if (regcache != NULL) { regcache_invalidate_thread (thread); - free_register_cache (regcache); + delete regcache; set_thread_regcache_data (thread, NULL); } } diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 32b3a8dccfc..614d5a2561f 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -51,6 +51,11 @@ struct regcache : public reg_buffer_common /* Constructors. */ regcache () = default; regcache (const target_desc *tdesc); + regcache (const regcache &rhs) = delete; + regcache &operator= (const regcache &rhs) = delete; + + /* Deconstructor. */ + virtual ~regcache (); #endif /* Init the regcache data. */ @@ -77,10 +82,6 @@ struct regcache : public reg_buffer_common regcache *get_thread_regcache (thread_info *thread, bool fetch = true); -/* Release all memory associated with the register cache for INFERIOR. */ - -void free_register_cache (struct regcache *regcache); - /* Invalidate cached registers for one thread. */ void regcache_invalidate_thread (struct thread_info *); diff --git a/gdbserver/server.cc b/gdbserver/server.cc index 4be12ec1c66..521f13c07d7 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4237,15 +4237,13 @@ process_serial_event (void) require_running_or_break (cs.own_buf); if (cs.current_traceframe >= 0) { - struct regcache *regcache - = new struct regcache (current_target_desc ()); + regcache a_regcache (current_target_desc ()); if (fetch_traceframe_registers (cs.current_traceframe, - regcache, -1) == 0) - registers_to_string (regcache, cs.own_buf); + &a_regcache, -1) == 0) + registers_to_string (&a_regcache, cs.own_buf); else write_enn (cs.own_buf); - free_register_cache (regcache); } else { From patchwork Tue Feb 28 11:28:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65746 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A89ED384F4A7 for ; Tue, 28 Feb 2023 11:31:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A89ED384F4A7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583864; bh=i3Ti9hABtznkwqFw+crk13VmDbyCevU8XYetlQMu0xo=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Xiu8klY9w/GjYXF1TJUR3dg8eMmDihVr0CV5V22sFVo1Gvetxs2PxD9c+J25Ah+Oy w3sFiuirhujlWYRtwLsnXqYP9Yo/wOPJZMm5a1vsEEG6wnJlXQG+dDFarFEZWg3XST swXqH5LEATKO9LMyuf4BM3ovDGmwayP7p4RQMd3w= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by sourceware.org (Postfix) with ESMTPS id B53893858430 for ; Tue, 28 Feb 2023 11:29:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B53893858430 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="396679500" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="396679500" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:36 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="919748225" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="919748225" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:36 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 09/26] gdbserver: extract out regcache::invalidate and regcache::discard Date: Tue, 28 Feb 2023 12:28:07 +0100 Message-Id: <80ed5ae6e1976610b2dfcf26ebe32f9af4aa9b33.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Extract out a piece of code from the `regcache_invalidate_thread` function and turn into a new method of regcache named 'invalidate'. We also introduce a small method named 'discard' to give the clients an option to discard the cache without storing the contents. This method is utilized in a downstream debugger. --- gdbserver/regcache.cc | 24 +++++++++++++++++------- gdbserver/regcache.h | 6 ++++++ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 7b6337166ad..1db78951cc2 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -85,18 +85,22 @@ regcache_invalidate_thread (struct thread_info *thread) regcache = thread_regcache_data (thread); - if (regcache == NULL) - return; + if (regcache != nullptr) + regcache->invalidate (); +} - if (regcache->registers_valid) +void +regcache::invalidate () +{ + if (registers_valid) { scoped_restore_current_thread restore_thread; - - switch_to_thread (thread); - store_inferior_registers (regcache, -1); + gdb_assert (this->thread != nullptr); + switch_to_thread (this->thread); + store_inferior_registers (this, -1); } - regcache->registers_valid = 0; + discard (); } /* See regcache.h. */ @@ -121,6 +125,12 @@ regcache_invalidate (void) #endif +void +regcache::discard () +{ + registers_valid = 0; +} + void regcache::initialize (const target_desc *tdesc, unsigned char *regbuf) diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 614d5a2561f..b4a9d8864ae 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -78,6 +78,12 @@ struct regcache : public reg_buffer_common /* Copy the contents of SRC into this regcache. */ void copy_from (regcache *src); + + /* Store the cached registers to the target and then discard the cache. */ + void invalidate (); + + /* Discard the cache without storing the registers to the target. */ + void discard (); }; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); From patchwork Tue Feb 28 11:28:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65739 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D59ED385086A for ; Tue, 28 Feb 2023 11:30:14 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D59ED385086A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583814; bh=14T3MtOC8lUCzmhTuWUWjdrPo2fuypf4UnII7ATD8TI=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Mak4DrZqTvVq0yDQZMzzCbeG3R3hZgjKnoI3fcMKxpfq/TlJmTx+fF5rJiTU0gxzR yrY62nMUzDXx2tetxD8MV3UH+6p7KpxdeWLuA8IZhhIig87Ai0avHoBM+Dcr1gZ7q+ SSaReb0TPaZzU9d8q/MFS0bHdxSAybAXIE7GqGrs= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by sourceware.org (Postfix) with ESMTPS id 86CE4385559E for ; Tue, 28 Feb 2023 11:29:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 86CE4385559E X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="396679527" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="396679527" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:47 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="919748308" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="919748308" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:44 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 10/26] gdbserver: convert registers_to_string into regcache::registers_to_string Date: Tue, 28 Feb 2023 12:28:08 +0100 Message-Id: <5ff95fd684084ed53879f1c2c5f96be1a9d4a59a.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the free `registers_to_string` function into a method of the regcache struct. --- gdbserver/regcache.cc | 12 +++++------- gdbserver/regcache.h | 9 ++++----- gdbserver/server.cc | 4 ++-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 1db78951cc2..92dc6fc921c 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -214,16 +214,14 @@ find_register_by_number (const struct target_desc *tdesc, int n) #ifndef IN_PROCESS_AGENT void -registers_to_string (struct regcache *regcache, char *buf) +regcache::registers_to_string (char *buf) { - unsigned char *registers = regcache->registers; - const struct target_desc *tdesc = regcache->tdesc; - + unsigned char *regs = registers; for (int i = 0; i < tdesc->reg_defs.size (); ++i) { - if (regcache->register_status[i] == REG_VALID) + if (register_status[i] == REG_VALID) { - bin2hex (registers, buf, register_size (tdesc, i)); + bin2hex (regs, buf, register_size (tdesc, i)); buf += register_size (tdesc, i) * 2; } else @@ -231,7 +229,7 @@ registers_to_string (struct regcache *regcache, char *buf) memset (buf, 'x', register_size (tdesc, i) * 2); buf += register_size (tdesc, i) * 2; } - registers += register_size (tdesc, i); + regs += register_size (tdesc, i); } *buf = '\0'; } diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index b4a9d8864ae..bed3151dcad 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -84,6 +84,10 @@ struct regcache : public reg_buffer_common /* Discard the cache without storing the registers to the target. */ void discard (); + + /* Convert all registers to a string in the currently specified remote + format. */ + void registers_to_string (char *buf); }; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); @@ -106,11 +110,6 @@ void regcache_invalidate (void); void regcache_release (void); -/* Convert all registers to a string in the currently specified remote - format. */ - -void registers_to_string (struct regcache *regcache, char *buf); - /* Convert a string to register values and fill our register cache. */ void registers_from_string (struct regcache *regcache, char *buf); diff --git a/gdbserver/server.cc b/gdbserver/server.cc index 521f13c07d7..f540cc86f7b 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4241,7 +4241,7 @@ process_serial_event (void) if (fetch_traceframe_registers (cs.current_traceframe, &a_regcache, -1) == 0) - registers_to_string (&a_regcache, cs.own_buf); + a_regcache.registers_to_string (cs.own_buf); else write_enn (cs.own_buf); } @@ -4254,7 +4254,7 @@ process_serial_event (void) else { regcache = get_thread_regcache (current_thread); - registers_to_string (regcache, cs.own_buf); + regcache->registers_to_string (cs.own_buf); } } break; From patchwork Tue Feb 28 11:28:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65740 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5E6CE3850865 for ; Tue, 28 Feb 2023 11:30:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5E6CE3850865 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583818; bh=VmS/nS1lM6+XP9HevHhBIeiLyprZIzi7JC/nG4cdFU0=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=CHDWWCP8/RG/ULr+cZJuo342MvOPj1IE0BOtll47I/nQZeByoh/296668bdxad/4O 6qRXBgOwtmZ7icKPKtCAiMwx3ht49CP+wbNb21VGss5wCwHDzC/avVFLAT1OScrR00 7P8K+2xcgB1MMVs7Gxi/NtUQ4UfKdTAp3hZyGvgg= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by sourceware.org (Postfix) with ESMTPS id DF14A3857C48 for ; Tue, 28 Feb 2023 11:29:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DF14A3857C48 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="396679549" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="396679549" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:52 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="919748407" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="919748407" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:51 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 11/26] gdbserver: convert registers_from_string into regcache::registers_from_string Date: Tue, 28 Feb 2023 12:28:09 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the registers_from_string function into a method of the regcache struct. Also constify the buffer argument. --- gdbserver/regcache.cc | 4 +--- gdbserver/regcache.h | 7 +++---- gdbserver/server.cc | 2 +- 3 files changed, 5 insertions(+), 8 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 92dc6fc921c..156fda7068d 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -235,11 +235,9 @@ regcache::registers_to_string (char *buf) } void -registers_from_string (struct regcache *regcache, char *buf) +regcache::registers_from_string (const char *buf) { int len = strlen (buf); - unsigned char *registers = regcache->registers; - const struct target_desc *tdesc = regcache->tdesc; if (len != tdesc->registers_size * 2) { diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index bed3151dcad..6aa03a70352 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -88,6 +88,9 @@ struct regcache : public reg_buffer_common /* Convert all registers to a string in the currently specified remote format. */ void registers_to_string (char *buf); + + /* Convert a string to register values and fill our register cache. */ + void registers_from_string (const char *buf); }; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); @@ -110,10 +113,6 @@ void regcache_invalidate (void); void regcache_release (void); -/* Convert a string to register values and fill our register cache. */ - -void registers_from_string (struct regcache *regcache, char *buf); - /* For regcache_read_pc see gdbsupport/common-regcache.h. */ void regcache_write_pc (struct regcache *regcache, CORE_ADDR pc); diff --git a/gdbserver/server.cc b/gdbserver/server.cc index f540cc86f7b..5e639d6ac57 100644 --- a/gdbserver/server.cc +++ b/gdbserver/server.cc @@ -4271,7 +4271,7 @@ process_serial_event (void) else { regcache = get_thread_regcache (current_thread); - registers_from_string (regcache, &cs.own_buf[1]); + regcache->registers_from_string (&cs.own_buf[1]); write_ok (cs.own_buf); } } From patchwork Tue Feb 28 11:28:10 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65745 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D08EE385020B for ; Tue, 28 Feb 2023 11:30:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D08EE385020B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583854; bh=lPN3YtIKYAQx4TsXc1zi0YvDqUd6nOX0yqf5/ykRL6k=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=bhqnbKprA4aWnMCXwcdDqFJ0HzRL9z1M6InMa6wkf6VKvEpZ142Gn22GqiNgQw0xg Yp47u6xMUk2fA8ysyr2mBjTSDLI3THLEX5nR/yvmpAmtlg8QAQ2KqXphYofgfTkxS9 Ux2Y6bOqrGJSRnuRIPAE0elIEWJpFfS5YUeZx14w= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 1A605385843E for ; Tue, 28 Feb 2023 11:29:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1A605385843E X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="420374035" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="420374035" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:58 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848213443" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="848213443" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:29:57 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 12/26] gdbserver: convert supply_regblock to regcache::supply_regblock Date: Tue, 28 Feb 2023 12:28:10 +0100 Message-Id: <1281d173376d23b5da5e09529aafeb6618672fd6.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the supply_regblock function into a method of the regcache struct. Also do some minor code modernization. --- gdbserver/regcache.cc | 32 ++++++++------------------------ gdbserver/regcache.h | 7 +++++-- gdbserver/tracepoint.cc | 8 ++++---- 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 156fda7068d..31f1e7bb3dc 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -376,39 +376,23 @@ supply_register_by_name_zeroed (struct regcache *regcache, #endif -/* Supply the whole register set whose contents are stored in BUF, to - REGCACHE. If BUF is NULL, all the registers' values are recorded - as unavailable. */ - void -supply_regblock (struct regcache *regcache, const void *buf) +regcache::supply_regblock (const void *buf) { - if (buf) + if (buf != nullptr) { - const struct target_desc *tdesc = regcache->tdesc; - - memcpy (regcache->registers, buf, tdesc->registers_size); + memcpy (registers, buf, tdesc->registers_size); #ifndef IN_PROCESS_AGENT - { - int i; - - for (i = 0; i < tdesc->reg_defs.size (); i++) - regcache->register_status[i] = REG_VALID; - } + for (int i = 0; i < tdesc->reg_defs.size (); i++) + register_status[i] = REG_VALID; #endif } else { - const struct target_desc *tdesc = regcache->tdesc; - - memset (regcache->registers, 0, tdesc->registers_size); + memset (registers, 0, tdesc->registers_size); #ifndef IN_PROCESS_AGENT - { - int i; - - for (i = 0; i < tdesc->reg_defs.size (); i++) - regcache->register_status[i] = REG_UNAVAILABLE; - } + for (int i = 0; i < tdesc->reg_defs.size (); i++) + register_status[i] = REG_UNAVAILABLE; #endif } } diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 6aa03a70352..944718070b4 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -91,6 +91,11 @@ struct regcache : public reg_buffer_common /* Convert a string to register values and fill our register cache. */ void registers_from_string (const char *buf); + + /* Supply the whole register set whose contents are stored in BUF, + to this regcache. If BUF is NULL, all the registers' values are + recorded as unavailable. */ + void supply_regblock (const void *buf); }; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); @@ -138,8 +143,6 @@ void supply_register_by_name (struct regcache *regcache, void supply_register_by_name_zeroed (struct regcache *regcache, const char *name); -void supply_regblock (struct regcache *regcache, const void *buf); - void collect_register (struct regcache *regcache, int n, void *buf); void collect_register_as_string (struct regcache *regcache, int n, char *buf); diff --git a/gdbserver/tracepoint.cc b/gdbserver/tracepoint.cc index 26003422a70..9833e7c3b0f 100644 --- a/gdbserver/tracepoint.cc +++ b/gdbserver/tracepoint.cc @@ -4707,7 +4707,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) { fctx->regcache_initted = 1; fctx->regcache.initialize (ipa_tdesc, fctx->regspace); - supply_regblock (&fctx->regcache, NULL); + fctx->regcache.supply_regblock (nullptr); supply_fast_tracepoint_registers (&fctx->regcache, fctx->regs); } regcache = &fctx->regcache; @@ -4722,7 +4722,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) { sctx->regcache_initted = 1; sctx->regcache.initialize (ipa_tdesc, sctx->regspace); - supply_regblock (&sctx->regcache, NULL); + sctx->regcache.supply_regblock (nullptr); /* Pass down the tracepoint address, because REGS doesn't include the PC, but we know what it must have been. */ supply_static_tracepoint_registers (&sctx->regcache, @@ -5180,7 +5180,7 @@ fetch_traceframe_registers (int tfnum, struct regcache *regcache, int regnum) if (dataptr == NULL) { /* Mark registers unavailable. */ - supply_regblock (regcache, NULL); + regcache->supply_regblock (nullptr); /* We can generally guess at a PC, although this will be misleading for while-stepping frames and multi-location @@ -5190,7 +5190,7 @@ fetch_traceframe_registers (int tfnum, struct regcache *regcache, int regnum) regcache_write_pc (regcache, tpoint->address); } else - supply_regblock (regcache, dataptr); + regcache->supply_regblock (dataptr); return 0; } From patchwork Tue Feb 28 11:28:11 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65751 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 0E3523847839 for ; Tue, 28 Feb 2023 11:31:34 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0E3523847839 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583894; bh=Z19Mgnh8uCNRhyRpl+U9lO5mwUiOTfBrPPZU7mwZypE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=qF9faXelZ2codun16eVJVS70BtJVjSNj5SrS61VSFcNdfTfBHg7zBjbxxWGKCqddG iOB/hq/UcNfxeU11e1JLsuE5LnhSgKPSUnG1gsbvWwNCjn1g0BikOlew80XO1rnAHF rJabhdaAIV85KCxXw7hlArKyo7KkYrTA/Rejv99A= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 04DBC3858422 for ; Tue, 28 Feb 2023 11:30:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 04DBC3858422 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="420374047" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="420374047" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:06 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848213489" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="848213489" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:05 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 13/26] gdbserver: convert register_data into regcache::register_data Date: Tue, 28 Feb 2023 12:28:11 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Convert the register_data function to a method of the regcache struct. --- gdbserver/regcache.cc | 20 ++++++++++---------- gdbserver/regcache.h | 3 +++ 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 31f1e7bb3dc..79835ef4ff1 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -314,11 +314,11 @@ regcache_register_size (const struct regcache *regcache, int n) return register_size (regcache->tdesc, n); } -static unsigned char * -register_data (const struct regcache *regcache, int n) +unsigned char * +regcache::register_data (int regnum) const { - return (regcache->registers - + find_register_by_number (regcache->tdesc, n).offset / 8); + return (registers + + find_register_by_number (tdesc, regnum).offset / 8); } void @@ -334,7 +334,7 @@ regcache::raw_supply (int n, const void *buf) { if (buf) { - memcpy (register_data (this, n), buf, register_size (tdesc, n)); + memcpy (register_data (n), buf, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT if (register_status != NULL) register_status[n] = REG_VALID; @@ -342,7 +342,7 @@ regcache::raw_supply (int n, const void *buf) } else { - memset (register_data (this, n), 0, register_size (tdesc, n)); + memset (register_data (n), 0, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT if (register_status != NULL) register_status[n] = REG_UNAVAILABLE; @@ -355,7 +355,7 @@ regcache::raw_supply (int n, const void *buf) void supply_register_zeroed (struct regcache *regcache, int n) { - memset (register_data (regcache, n), 0, + memset (regcache->register_data (n), 0, register_size (regcache->tdesc, n)); #ifndef IN_PROCESS_AGENT if (regcache->register_status != NULL) @@ -419,7 +419,7 @@ collect_register (struct regcache *regcache, int n, void *buf) void regcache::raw_collect (int n, void *buf) const { - memcpy (buf, register_data (this, n), register_size (tdesc, n)); + memcpy (buf, register_data (n), register_size (tdesc, n)); } enum register_status @@ -458,7 +458,7 @@ regcache_raw_get_unsigned_by_name (struct regcache *regcache, void collect_register_as_string (struct regcache *regcache, int n, char *buf) { - bin2hex (register_data (regcache, n), buf, + bin2hex (regcache->register_data (n), buf, register_size (regcache->tdesc, n)); } @@ -505,7 +505,7 @@ regcache::raw_compare (int regnum, const void *buf, int offset) const { gdb_assert (buf != NULL); - const unsigned char *regbuf = register_data (this, regnum); + const unsigned char *regbuf = register_data (regnum); int size = register_size (tdesc, regnum); gdb_assert (size >= offset); diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 944718070b4..88e6ac32bae 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -96,6 +96,9 @@ struct regcache : public reg_buffer_common to this regcache. If BUF is NULL, all the registers' values are recorded as unavailable. */ void supply_regblock (const void *buf); + + /* Return the pointer to the register with number REGNUM. */ + unsigned char *register_data (int regnum) const; }; regcache *get_thread_regcache (thread_info *thread, bool fetch = true); From patchwork Tue Feb 28 11:28:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65743 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C052D384D197 for ; Tue, 28 Feb 2023 11:30:49 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C052D384D197 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583849; bh=pwh29vJpOGEFV1Fen0iZ8hVpBVKdUfkNZ9dNp59Ilio=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=vZn9w0eMqG96T8oaL9yaSqVdKkMeO90IvR1bJFzRckJbTfsidN6zXrTA3+OeNjjVf epVbITUYO+d4s766uwHeg2KYOr4/NcuRHFu6C1ZqoRA7Xwa4yB4bRCJUolg+UOKhm5 XKSv6TAvLwS3Aa2beb/c/w3XmAMDyxpP4YiSXF18= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 95A5C385043A for ; Tue, 28 Feb 2023 11:30:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 95A5C385043A X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="420374065" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="420374065" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:13 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848213536" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="848213536" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:11 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 14/26] gdbserver: introduce and use regcache::set_register_status Date: Tue, 28 Feb 2023 12:28:12 +0100 Message-Id: <89ffb94330c3f96b34e00a653ebbfce99a075c42.1677582744.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Introduce and use a setter method in regcache to set the status of a register. There already exists get_register_status. So, it made sense to add the setter to control access to the register_status field. --- gdbserver/regcache.cc | 23 +++++++++++++++-------- gdbserver/regcache.h | 3 +++ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 79835ef4ff1..ec11082be6f 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -336,16 +336,14 @@ regcache::raw_supply (int n, const void *buf) { memcpy (register_data (n), buf, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT - if (register_status != NULL) - register_status[n] = REG_VALID; + set_register_status (n, REG_VALID); #endif } else { memset (register_data (n), 0, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT - if (register_status != NULL) - register_status[n] = REG_UNAVAILABLE; + set_register_status (n, REG_UNAVAILABLE); #endif } } @@ -358,8 +356,7 @@ supply_register_zeroed (struct regcache *regcache, int n) memset (regcache->register_data (n), 0, register_size (regcache->tdesc, n)); #ifndef IN_PROCESS_AGENT - if (regcache->register_status != NULL) - regcache->register_status[n] = REG_VALID; + regcache->set_register_status (n, REG_VALID); #endif } @@ -384,7 +381,7 @@ regcache::supply_regblock (const void *buf) memcpy (registers, buf, tdesc->registers_size); #ifndef IN_PROCESS_AGENT for (int i = 0; i < tdesc->reg_defs.size (); i++) - register_status[i] = REG_VALID; + set_register_status (i, REG_VALID); #endif } else @@ -392,7 +389,7 @@ regcache::supply_regblock (const void *buf) memset (registers, 0, tdesc->registers_size); #ifndef IN_PROCESS_AGENT for (int i = 0; i < tdesc->reg_defs.size (); i++) - register_status[i] = REG_UNAVAILABLE; + set_register_status (i, REG_UNAVAILABLE); #endif } } @@ -498,6 +495,16 @@ regcache::get_register_status (int regnum) const #endif } +void +regcache::set_register_status (int regnum, enum register_status status) +{ +#ifndef IN_PROCESS_AGENT + gdb_assert (regnum >= 0 && regnum < tdesc->reg_defs.size ()); + if (register_status != nullptr) + register_status[regnum] = status; +#endif +} + /* See gdbsupport/common-regcache.h. */ bool diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 88e6ac32bae..ceef28086ce 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -64,6 +64,9 @@ struct regcache : public reg_buffer_common /* See gdbsupport/common-regcache.h. */ enum register_status get_register_status (int regnum) const override; + /* Set the status of register REGNUM to STATUS. */ + void set_register_status (int regnum, enum register_status status); + /* See gdbsupport/common-regcache.h. */ void raw_supply (int regnum, const void *buf) override; From patchwork Tue Feb 28 11:28:13 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65744 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4FB63384FB67 for ; Tue, 28 Feb 2023 11:30:51 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4FB63384FB67 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583851; bh=jXM6x1NbIvIi9IW6lSRvjyRwA6GdkaikXcCD7o39V2w=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=LV5k3kZvHNBDooJTmkQLKeFf2k42SOnTS6Y0UYOCcAdgHKMirQWFdq1E06/MJRHEU O2z7pPKceiIkYdltjCxOqhYXd1NjKw4IQv75u25bO42JQBGE0gkWxUtPk11vYh9oYc NpUHJoPFczCf8e5fE0xysMQULNQwv1REpA7fEAAw= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 3BA633858C27 for ; Tue, 28 Feb 2023 11:30:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3BA633858C27 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="420374093" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="420374093" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:19 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848213584" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="848213584" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:18 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 15/26] gdbserver: check for nullptr condition in regcache::get_register_status Date: Tue, 28 Feb 2023 12:28:13 +0100 Message-Id: <893ba2a52032456c31cbb868c2f2ae4e0661b6e0.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" A regcache can be initialized with a register value buffer, in which case, the register_status pointer is null. This condition is checked in set_register_status, but not in get_register_status. Do this check for consistence and safety. --- gdbserver/regcache.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index ec11082be6f..0c6f1eb392b 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -489,7 +489,10 @@ regcache::get_register_status (int regnum) const { #ifndef IN_PROCESS_AGENT gdb_assert (regnum >= 0 && regnum < tdesc->reg_defs.size ()); - return (enum register_status) (register_status[regnum]); + if (register_status != nullptr) + return (enum register_status) (register_status[regnum]); + else + return REG_VALID; #else return REG_VALID; #endif From patchwork Tue Feb 28 11:28:14 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65749 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B9D7C384F037 for ; Tue, 28 Feb 2023 11:31:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B9D7C384F037 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583884; bh=9p5+yzl4UhWrLjn5GC7CJluxXQ5kiffD9Qs2pm3clUE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=rybzihPya2xjje2DOApJ2V0XGU/dLMz/zEc4PZf1IqvexAqrJ58IhVRG7mxg7ex6g hP7XZlrKZvzOEuHi/vT+kOHsRUdWBPY850Yvn5RgPvj2WSlZq7r3MHdtMPpKjWozUS ostuRcIV6WCXjYbCHd8jqFCrbZOS0B8XH6/LvESc= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by sourceware.org (Postfix) with ESMTPS id 096C8384F4AE for ; Tue, 28 Feb 2023 11:30:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 096C8384F4AE X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="420374109" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="420374109" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:25 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="848213625" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="848213625" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:24 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 16/26] gdbserver: boolify regcache fields Date: Tue, 28 Feb 2023 12:28:14 +0100 Message-Id: <9bbbc603a5966c9440bfa12484ced476bb80a3fa.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The registers_valid and registers_owned fields of the regcache struct are of type int. Make them bool. --- gdbserver/regcache.cc | 12 ++++++------ gdbserver/regcache.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 0c6f1eb392b..4b56750d06a 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -57,7 +57,7 @@ get_thread_regcache (struct thread_info *thread, bool fetch) void regcache::fetch () { - if (registers_valid == 0) + if (!registers_valid) { scoped_restore_current_thread restore_thread; gdb_assert (this->thread != nullptr); @@ -66,7 +66,7 @@ regcache::fetch () /* Invalidate all registers, to prevent stale left-overs. */ memset (register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); fetch_inferior_registers (this, -1); - registers_valid = 1; + registers_valid = true; } } @@ -128,7 +128,7 @@ regcache_invalidate (void) void regcache::discard () { - registers_valid = 0; + registers_valid = false; } void @@ -145,7 +145,7 @@ regcache::initialize (const target_desc *tdesc, this->tdesc = tdesc; this->registers = (unsigned char *) xcalloc (1, tdesc->registers_size); - this->registers_owned = 1; + this->registers_owned = true; this->register_status = (unsigned char *) xmalloc (tdesc->reg_defs.size ()); memset ((void *) this->register_status, REG_UNAVAILABLE, @@ -158,13 +158,13 @@ regcache::initialize (const target_desc *tdesc, { this->tdesc = tdesc; this->registers = regbuf; - this->registers_owned = 0; + this->registers_owned = false; #ifndef IN_PROCESS_AGENT this->register_status = nullptr; #endif } - this->registers_valid = 0; + this->registers_valid = false; } #ifndef IN_PROCESS_AGENT diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index ceef28086ce..f155ac631eb 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -41,8 +41,8 @@ struct regcache : public reg_buffer_common register cache is _not_ pass-through, unlike GDB's. Note that "valid" here is unrelated to whether the registers are available in a traceframe. For that, check REGISTER_STATUS below. */ - int registers_valid = 0; - int registers_owned = 0; + bool registers_valid = false; + bool registers_owned = false; unsigned char *registers = nullptr; #ifndef IN_PROCESS_AGENT /* One of REG_UNAVAILABLE or REG_VALID. */ From patchwork Tue Feb 28 11:28:15 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65755 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 887D7384D1BC for ; Tue, 28 Feb 2023 11:32:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 887D7384D1BC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583924; bh=S9UNjCgf0c4tSDKL0aw3yaRmSC3V0+UKpjI3y3/N8Is=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=gDYHOkcVQK6Mm8fHKpNDevYi2YMuClDjBZtZDtqanSEiQXPUPxg51IUdELtWiBgZr r0tml9bKXNSMP2ZaDWnE+Sxz5e+7ECvHXbZFZvug1xo3k10IDf1VyVjif5c3raDrUj vDEKa50AGUgKICMpHWcVvWWVR1Tqlno9SCvWgUjQ= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id CEF1138515DB for ; Tue, 28 Feb 2023 11:30:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CEF1138515DB X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313785106" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="313785106" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:32 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="623992172" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="623992172" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:31 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 17/26] gdbserver: rename regcache's registers_valid to registers_fetched Date: Tue, 28 Feb 2023 12:28:15 +0100 Message-Id: <7296899ef77a86051c398fc1c20338f2937386eb.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The registers_valid field of the regcache struct is used for tracking whether we have attempted to fetch all the registers from the target. Its name does not reflect this well, I think. It falsely gives the impression that all the registers are valid. This may conflict an individual register status, which could be REG_UNAVAILABLE. To better reflect the purpose, rename the field to "registers_fetched". --- gdbserver/regcache.cc | 12 ++++++------ gdbserver/regcache.h | 13 +++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 4b56750d06a..0e21c1aa7d1 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -57,7 +57,7 @@ get_thread_regcache (struct thread_info *thread, bool fetch) void regcache::fetch () { - if (!registers_valid) + if (!registers_fetched) { scoped_restore_current_thread restore_thread; gdb_assert (this->thread != nullptr); @@ -66,7 +66,7 @@ regcache::fetch () /* Invalidate all registers, to prevent stale left-overs. */ memset (register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); fetch_inferior_registers (this, -1); - registers_valid = true; + registers_fetched = true; } } @@ -92,7 +92,7 @@ regcache_invalidate_thread (struct thread_info *thread) void regcache::invalidate () { - if (registers_valid) + if (registers_fetched) { scoped_restore_current_thread restore_thread; gdb_assert (this->thread != nullptr); @@ -128,7 +128,7 @@ regcache_invalidate (void) void regcache::discard () { - registers_valid = false; + registers_fetched = false; } void @@ -164,7 +164,7 @@ regcache::initialize (const target_desc *tdesc, #endif } - this->registers_valid = false; + this->registers_fetched = false; } #ifndef IN_PROCESS_AGENT @@ -197,7 +197,7 @@ regcache::copy_from (regcache *src) memcpy (this->register_status, src->register_status, src->tdesc->reg_defs.size ()); #endif - this->registers_valid = src->registers_valid; + this->registers_fetched = src->registers_fetched; } /* Return a reference to the description of register N. */ diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index f155ac631eb..3fcd4643a42 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -36,12 +36,13 @@ struct regcache : public reg_buffer_common /* Back-link to the thread to which this regcache belongs. */ thread_info *thread = nullptr; - /* Whether the REGISTERS buffer's contents are valid. If false, we - haven't fetched the registers from the target yet. Not that this - register cache is _not_ pass-through, unlike GDB's. Note that - "valid" here is unrelated to whether the registers are available - in a traceframe. For that, check REGISTER_STATUS below. */ - bool registers_valid = false; + /* Whether the REGISTERS buffer's contents are fetched. If false, + we haven't fetched the registers from the target yet. Note that + this register cache is _not_ pass-through, unlike GDB's. Also, + note that "fetched" here is unrelated to whether the registers + are available in a traceframe. For that, check REGISTER_STATUS + below. */ + bool registers_fetched = false; bool registers_owned = false; unsigned char *registers = nullptr; #ifndef IN_PROCESS_AGENT From patchwork Tue Feb 28 11:28:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65750 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6084F384843A for ; Tue, 28 Feb 2023 11:31:27 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6084F384843A DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583887; bh=NbBhZllRbCwrUNnNKwlBfg9nLJEZb9B+IZucbz8NXc8=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=lqsxvnrCOUlRv1NZhc7sbfhe59WD7tOIH57zkvmgNK6K3FL184lIzpO2dgP8y3pnN /Nz0r0lg/AzH717kJnD3xkaxyz43S5XHDpUIxxeSaIXOnnvky2UkOweHTM4RY5JoF4 uZXLPgRzTtsrM0iZ72IcaxIf62+L04DbMjJSgd1s= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id 1405A3850206 for ; Tue, 28 Feb 2023 11:30:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1405A3850206 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313785130" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="313785130" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:39 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="623992189" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="623992189" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:38 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 18/26] gdbsupport: fix a typo in a comment in common-regcache.h Date: Tue, 28 Feb 2023 12:28:16 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Fix a typo. --- gdbsupport/common-regcache.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gdbsupport/common-regcache.h b/gdbsupport/common-regcache.h index e462f532407..bf14610f98f 100644 --- a/gdbsupport/common-regcache.h +++ b/gdbsupport/common-regcache.h @@ -33,10 +33,10 @@ enum register_status : signed char /* The register value is unavailable. E.g., we're inspecting a traceframe, and this register wasn't collected. Note that this - is different a different "unavailable" from saying the register - does not exist in the target's architecture --- in that case, - the target should have given us a target description that does - not include the register in the first place. */ + "unavailable" is different from saying the register does not + exist in the target's architecture --- in that case, the target + should have given us a target description that does not include + the register in the first place. */ REG_UNAVAILABLE = -1 }; From patchwork Tue Feb 28 11:28:17 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65754 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2C4B13850206 for ; Tue, 28 Feb 2023 11:31:57 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2C4B13850206 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583917; bh=9j0ytXxdgRHfcq2l0ziDip25WTnR7i70+6eowTl4faE=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=vdb8D7in8l4y+9nXW+clsYbpjJPV89hyELR5ByM7p7kWgr8NBnIY9JEXCI/DR9TGD UlKkkCDYczTDCqGBeaeWDG1WMM2fOYYrPvDnvQVSp+1+VwfUYRl1gdA4e1KrNHIoa8 Fzg1kMRvqT+Nl1rys8Wu/EX5+srMLWuvMaERoXEE= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id 9591B3850206 for ; Tue, 28 Feb 2023 11:30:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 9591B3850206 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313785148" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="313785148" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:46 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="623992205" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="623992205" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:45 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 19/26] gdbserver: fix the declared type of register_status in regcache Date: Tue, 28 Feb 2023 12:28:17 +0100 Message-Id: <0c082e1edb5933f2ac5a7aac06197f8957099628.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The register_status field of regcache is declared as `unsigned char *`. This is incorrect, because `enum register_status` from gdbsupport/common-regcache.h is based on signed char and REG_UNAVAILABLE is defined as -1. Fix the declared type. The get/set methods already use the correct type, but we update cast operations in two places. --- gdbserver/regcache.cc | 4 ++-- gdbserver/regcache.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 0e21c1aa7d1..09ea58bdbd6 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -147,7 +147,7 @@ regcache::initialize (const target_desc *tdesc, = (unsigned char *) xcalloc (1, tdesc->registers_size); this->registers_owned = true; this->register_status - = (unsigned char *) xmalloc (tdesc->reg_defs.size ()); + = (enum register_status *) xmalloc (tdesc->reg_defs.size ()); memset ((void *) this->register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); #else @@ -490,7 +490,7 @@ regcache::get_register_status (int regnum) const #ifndef IN_PROCESS_AGENT gdb_assert (regnum >= 0 && regnum < tdesc->reg_defs.size ()); if (register_status != nullptr) - return (enum register_status) (register_status[regnum]); + return register_status[regnum]; else return REG_VALID; #else diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 3fcd4643a42..ad71a9acaec 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -46,8 +46,8 @@ struct regcache : public reg_buffer_common bool registers_owned = false; unsigned char *registers = nullptr; #ifndef IN_PROCESS_AGENT - /* One of REG_UNAVAILABLE or REG_VALID. */ - unsigned char *register_status = nullptr; + /* See gdbsupport/common-regcache.h. */ + enum register_status *register_status = nullptr; /* Constructors. */ regcache () = default; From patchwork Tue Feb 28 11:28:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65758 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 8B8B1383E81B for ; Tue, 28 Feb 2023 11:32:33 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 8B8B1383E81B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583953; bh=TYzSRzRTkDHELmW0IsRy873PV+2s8m5mEY/j7geawb8=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Nc9V4rnJK1FEk6kgvaNGxqUsHdxpYD7Uuab0wTUlc01K/re5owWsXUveALdiHS9F+ PqyQFZOEe/mYM2y0i7TdaApImoFt3fPu1wmTsAjBAvLz2i5vt1tVnhPaMJO4tztWe/ VmSYzXy5N9wXxG+Z0xUzIsgWsrZY9dRUmijBnXqI= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id 347C03850229 for ; Tue, 28 Feb 2023 11:30:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 347C03850229 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313785167" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="313785167" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:52 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="623992214" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="623992214" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:51 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 20/26] gdbserver: make some regcache fields private Date: Tue, 28 Feb 2023 12:28:18 +0100 Message-Id: X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Some fields of the regcache struct are used for internal state tracking. Prevent direct access to them from outside by making them private. --- gdbserver/regcache.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index ad71a9acaec..be412bc3765 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -36,6 +36,8 @@ struct regcache : public reg_buffer_common /* Back-link to the thread to which this regcache belongs. */ thread_info *thread = nullptr; +private: + /* Whether the REGISTERS buffer's contents are fetched. If false, we haven't fetched the registers from the target yet. Note that this register cache is _not_ pass-through, unlike GDB's. Also, @@ -49,6 +51,8 @@ struct regcache : public reg_buffer_common /* See gdbsupport/common-regcache.h. */ enum register_status *register_status = nullptr; +public: + /* Constructors. */ regcache () = default; regcache (const target_desc *tdesc); @@ -59,6 +63,8 @@ struct regcache : public reg_buffer_common virtual ~regcache (); #endif +public: + /* Init the regcache data. */ void initialize (const target_desc *tdesc, unsigned char *regbuf); From patchwork Tue Feb 28 11:28:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65748 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 895F83848435 for ; Tue, 28 Feb 2023 11:31:24 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 895F83848435 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583884; bh=7V/5xAd4XFNukQAAHSqw7a2TBzM2Os1ze5URejpmePo=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=eYkjiJ/kJOpT63XAFQx5J5N76sKBr9XIFZMgOZE/Eg63saANqbI/c164m5qA+xIRF XupsKN4vsfI9uu1s37qKxLs4mZKD9P99qMqspgfRFTaULyS+yqr5cSYmXeyyHXBCoV Z2WpeCeU9c5Skcr6pjSc5TWi1vdaLkeQEBGPcB7g= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by sourceware.org (Postfix) with ESMTPS id 81467384D16E for ; Tue, 28 Feb 2023 11:30:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 81467384D16E X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="313785189" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="313785189" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:59 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="623992239" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="623992239" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:30:58 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 21/26] gdbserver: use REG_UNKNOWN for a regcache's register statuses Date: Tue, 28 Feb 2023 12:28:19 +0100 Message-Id: <1fcffbf8ffd62b07585baebff38b66f10ec0a112.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_PASS, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" When a regcache is initialized, the values of registers are not fetched yet. Thus, initialize the register statuses to REG_UNKNOWN instead of REG_UNAVAILABLE, because the latter rather means "we attempted to fetch but could not obtain the value". The definitions of the reg status enums (from gdbsupport/common-regcache.h) as a reminder: /* The register value is not in the cache, and we don't know yet whether it's available in the target (or traceframe). */ REG_UNKNOWN = 0, /* The register value is valid and cached. */ REG_VALID = 1, /* The register value is unavailable. E.g., we're inspecting a traceframe, and this register wasn't collected. Note that this "unavailable" is different from saying the register does not exist in the target's architecture --- in that case, the target should have given us a target description that does not include the register in the first place. */ REG_UNAVAILABLE = -1 Similarly, when the regcache is invalidated, change all the statuses back to REG_UNKNOWN. --- gdbserver/regcache.cc | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 09ea58bdbd6..2befb30e337 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -64,9 +64,17 @@ regcache::fetch () switch_to_thread (this->thread); /* Invalidate all registers, to prevent stale left-overs. */ - memset (register_status, REG_UNAVAILABLE, tdesc->reg_defs.size ()); + discard (); fetch_inferior_registers (this, -1); registers_fetched = true; + + /* Make sure that the registers that could not be fetched are + now unavailable. */ + for (int i = 0; i < tdesc->reg_defs.size (); ++i) + { + if (register_status[i] == REG_UNKNOWN) + set_register_status (i, REG_UNAVAILABLE); + } } } @@ -128,6 +136,9 @@ regcache_invalidate (void) void regcache::discard () { +#ifndef IN_PROCESS_AGENT + memset ((void *) register_status, REG_UNKNOWN, tdesc->reg_defs.size ()); +#endif registers_fetched = false; } @@ -148,8 +159,7 @@ regcache::initialize (const target_desc *tdesc, this->registers_owned = true; this->register_status = (enum register_status *) xmalloc (tdesc->reg_defs.size ()); - memset ((void *) this->register_status, REG_UNAVAILABLE, - tdesc->reg_defs.size ()); + discard (); #else gdb_assert_not_reached ("can't allocate memory from the heap"); #endif From patchwork Tue Feb 28 11:28:20 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65757 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A7A6A383EC51 for ; Tue, 28 Feb 2023 11:32:26 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A7A6A383EC51 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583946; bh=gIjob7XCXmkda0pa2BnCwm7LLSlpPuA3IoSZHsps8ZY=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=kWOpWuSDd0PFluPWZtFvVy6MQ+6fxjaabgYDY6Mw2dLpMrBTMYFTaJhRQ575Zm/tc LFnLBmvSfnmniBPm2RPtiPTD0lJWNLB9ss5RVycSf9P4CcnMlTjGiRHIqWejn4sEkP b1dRqEc3ZzBAQ9xs1HDufaAUZoTqXsA/Mk+9X8YI= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by sourceware.org (Postfix) with ESMTPS id 26C96384B10F for ; Tue, 28 Feb 2023 11:31:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 26C96384B10F X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="336401728" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="336401728" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:06 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="817058248" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="817058248" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:04 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 22/26] gdbserver: zero-out register values in regcache-discard Date: Tue, 28 Feb 2023 12:28:20 +0100 Message-Id: <877c74ccb7fb99d36242d9246d2824f181752a5a.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Zero-out register values when a regcache is discarded so that we avoid garbage values left in the buffer. --- gdbserver/regcache.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 2befb30e337..644f436c681 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -136,6 +136,7 @@ regcache_invalidate (void) void regcache::discard () { + memset (registers, 0, tdesc->registers_size); #ifndef IN_PROCESS_AGENT memset ((void *) register_status, REG_UNKNOWN, tdesc->reg_defs.size ()); #endif @@ -149,16 +150,17 @@ regcache::initialize (const target_desc *tdesc, if (regbuf == NULL) { #ifndef IN_PROCESS_AGENT - /* Make sure to zero-initialize the register cache when it is - created, in case there are registers the target never - fetches. This way they'll read as zero instead of - garbage. */ this->tdesc = tdesc; this->registers - = (unsigned char *) xcalloc (1, tdesc->registers_size); + = (unsigned char *) xmalloc (tdesc->registers_size); this->registers_owned = true; this->register_status = (enum register_status *) xmalloc (tdesc->reg_defs.size ()); + + /* Make sure to zero-initialize the register cache when it is + created, in case there are registers the target never + fetches. This way they'll read as zero instead of + garbage. */ discard (); #else gdb_assert_not_reached ("can't allocate memory from the heap"); From patchwork Tue Feb 28 11:28:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65752 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6CAF0383FBB7 for ; Tue, 28 Feb 2023 11:31:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6CAF0383FBB7 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583914; bh=UII4nydFbh8/XqpPQSG2sMgYMMwYxGsuAA8fsMYCOXU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=C5GO804hdjGb4lbXOv0Jinf55as95EZZAbzhXyezNak/pAMhmb1d1QTv7F8Mlp5ej C62ThnvepJca062GK3iaEC6PI5pIa6OMC1vDL/mLQE3NHBKWsaypGGgkePW0aTvSYN SS95ycCbsmE6MdJNbhsyigCurifX/k65ThfjFtPU= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by sourceware.org (Postfix) with ESMTPS id 0308038493DC for ; Tue, 28 Feb 2023 11:31:11 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 0308038493DC X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="336401749" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="336401749" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:11 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="817058290" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="817058290" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:10 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 23/26] gdbserver: set register statuses in registers_from_string Date: Tue, 28 Feb 2023 12:28:21 +0100 Message-Id: <23857f86bb74dc803b8deedc1c38e51363554500.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The registers_from_string function uses hex2bin to set the values of all registers. Set the register statuses to REG_VALID to reflect this change. --- gdbserver/regcache.cc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 644f436c681..32f0e1109e6 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -259,6 +259,8 @@ regcache::registers_from_string (const char *buf) len = tdesc->registers_size * 2; } hex2bin (buf, registers, len / 2); + /* All register data have been re-written. Update the statuses. */ + memset (register_status, REG_VALID, tdesc->reg_defs.size ()); } /* See regcache.h */ From patchwork Tue Feb 28 11:28:22 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65753 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id C89A8384FB7E for ; Tue, 28 Feb 2023 11:31:54 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org C89A8384FB7E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583914; bh=iC6kVUFiPxluFX1BZOTxTJAYZJSGE1GMVuRB9nKG+y0=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=XTByMyW9LHtVcqqa0+Qon/1z7gXieq08pSRXOKPB22kDpOxhHbbaqQSfXXukTaHGf utSBsPqdFMlUeFvLWKNJsLezFtNGjk4t4aCKhwsEMyA8Im05oO6N4cm0xjWF37ut0b nMj96QBGY5htJqYaSGGa+G79Jyko0ixz2T5jalog= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by sourceware.org (Postfix) with ESMTPS id EEE5E384F488 for ; Tue, 28 Feb 2023 11:31:17 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org EEE5E384F488 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="336401770" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="336401770" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:17 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="817058311" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="817058311" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:16 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 24/26] gdbserver: return tracked register status in regcache_raw_read_unsigned Date: Tue, 28 Feb 2023 12:28:22 +0100 Message-Id: <232ee024f5b957a07c047c724d7065074da1ef34.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" In regcache_raw_read_unsigned, we unconditionally return REG_VALID as the register status. This does not seem right, since the register may in fact be in another state, such as REG_UNAVAILABLE. Return the tracked status. --- gdbserver/regcache.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 32f0e1109e6..4533e9e9b12 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -451,7 +451,7 @@ regcache_raw_read_unsigned (struct regcache *regcache, int regnum, *val = 0; collect_register (regcache, regnum, val); - return REG_VALID; + return regcache->get_register_status (regnum); } #ifndef IN_PROCESS_AGENT From patchwork Tue Feb 28 11:28:23 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65756 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AE9E7385559E for ; Tue, 28 Feb 2023 11:32:23 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org AE9E7385559E DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583943; bh=eBkQHA1E0yynWc6J+nQSGNkGG+CqDWdE8hxDGtZjwf0=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=dz1mK54JZYl9QyZQ5pG3fLV4Q2f5kOp7h7WFeiXqPoSjtTAVSFk8KfG6NZSFBIPEy ZT7tT3XxUi8CQySY+IUoAHt83z0fwgdRNpOvvIP1+wY+DpM0m1NATSZSuYyyDiR/7z Z4f7GiWrN2njP/8lpErWU4/VO710BnlpJLcX0qlA= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by sourceware.org (Postfix) with ESMTPS id 24E8D385782B for ; Tue, 28 Feb 2023 11:31:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 24E8D385782B X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="336401798" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="336401798" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:23 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="817058343" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="817058343" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:22 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 25/26] gdbserver: refuse null argument in regcache::supply_regblock Date: Tue, 28 Feb 2023 12:28:23 +0100 Message-Id: <39a4774140afc2f7253756971398fc2cabceb289.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" The regcache::supply_regblock method implements two different behaviors based on whether its 'buf' argument is null. The null behavior is used only in tracepoint.cc. Refuse the null pointer argument and use the 'discard' method to obtain that second behavior. Note that the original code resets register statuses to REG_UNAVAILABLE, but 'discard' sets them to REG_UNKNOWN. For the current purposes of resetting the regcache, the difference does not seem to be important. --- gdbserver/regcache.cc | 19 +++++-------------- gdbserver/regcache.h | 3 +-- gdbserver/tracepoint.cc | 8 ++++---- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index 4533e9e9b12..cfb68774402 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -390,22 +390,13 @@ supply_register_by_name_zeroed (struct regcache *regcache, void regcache::supply_regblock (const void *buf) { - if (buf != nullptr) - { - memcpy (registers, buf, tdesc->registers_size); -#ifndef IN_PROCESS_AGENT - for (int i = 0; i < tdesc->reg_defs.size (); i++) - set_register_status (i, REG_VALID); -#endif - } - else - { - memset (registers, 0, tdesc->registers_size); + gdb_assert (buf != nullptr); + + memcpy (registers, buf, tdesc->registers_size); #ifndef IN_PROCESS_AGENT - for (int i = 0; i < tdesc->reg_defs.size (); i++) - set_register_status (i, REG_UNAVAILABLE); + for (int i = 0; i < tdesc->reg_defs.size (); i++) + set_register_status (i, REG_VALID); #endif - } } #ifndef IN_PROCESS_AGENT diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index be412bc3765..216044889ec 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -103,8 +103,7 @@ struct regcache : public reg_buffer_common void registers_from_string (const char *buf); /* Supply the whole register set whose contents are stored in BUF, - to this regcache. If BUF is NULL, all the registers' values are - recorded as unavailable. */ + to this regcache. BUF cannot be NULL. */ void supply_regblock (const void *buf); /* Return the pointer to the register with number REGNUM. */ diff --git a/gdbserver/tracepoint.cc b/gdbserver/tracepoint.cc index 9833e7c3b0f..9622d53cd82 100644 --- a/gdbserver/tracepoint.cc +++ b/gdbserver/tracepoint.cc @@ -4707,7 +4707,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) { fctx->regcache_initted = 1; fctx->regcache.initialize (ipa_tdesc, fctx->regspace); - fctx->regcache.supply_regblock (nullptr); + fctx->regcache.discard (); supply_fast_tracepoint_registers (&fctx->regcache, fctx->regs); } regcache = &fctx->regcache; @@ -4722,7 +4722,7 @@ get_context_regcache (struct tracepoint_hit_ctx *ctx) { sctx->regcache_initted = 1; sctx->regcache.initialize (ipa_tdesc, sctx->regspace); - sctx->regcache.supply_regblock (nullptr); + sctx->regcache.discard (); /* Pass down the tracepoint address, because REGS doesn't include the PC, but we know what it must have been. */ supply_static_tracepoint_registers (&sctx->regcache, @@ -5179,8 +5179,8 @@ fetch_traceframe_registers (int tfnum, struct regcache *regcache, int regnum) dataptr = traceframe_find_regblock (tframe, tfnum); if (dataptr == NULL) { - /* Mark registers unavailable. */ - regcache->supply_regblock (nullptr); + /* Wipe out the cache. */ + regcache->discard (); /* We can generally guess at a PC, although this will be misleading for while-stepping frames and multi-location From patchwork Tue Feb 28 11:28:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 65760 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6D44F3850868 for ; Tue, 28 Feb 2023 11:32:53 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6D44F3850868 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1677583973; bh=ALYKYtUxAnVembkCKkPnBao6hFurO213LvEzpxRyfFk=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=CcvfbkDPHZZWtSAhfM0Al/tDdW1sftGKmTREVMgwUyaTNuhQ2/aT/Y7gh8QYPHdWj ZrqrAe7/VQSTcdW9CeBha2PHpPWh1qwwDkkQaSnvPtDcpxs6CfW7eNmDnbCLDa5GDN A1E0IodlLp7FivP6zWwX46dQGQNnchTbKGsQxJEM= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by sourceware.org (Postfix) with ESMTPS id 713A4384DD17 for ; Tue, 28 Feb 2023 11:31:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 713A4384DD17 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="336401834" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="336401834" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:30 -0800 X-IronPort-AV: E=McAfee;i="6500,9779,10634"; a="817058381" X-IronPort-AV: E=Sophos;i="5.98,221,1673942400"; d="scan'208";a="817058381" Received: from ultl2604.iul.intel.com (HELO localhost) ([172.28.48.47]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 03:31:28 -0800 To: gdb-patches@sourceware.org Subject: [PATCH 26/26] gdbserver: allow gradually populating and selectively storing a regcache Date: Tue, 28 Feb 2023 12:28:24 +0100 Message-Id: <65c2083374c880b4802a8453dea62b23e2c0dda6.1677582745.git.tankut.baris.aktemur@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP 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-Patchwork-Original-From: Tankut Baris Aktemur via Gdb-patches From: "Aktemur, Tankut Baris" Reply-To: Tankut Baris Aktemur Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Currently, the regcache can be used by fetching all the registers from the target. For some targets, this could be a costly operation because there is a large number of threads with a large register file each. In this patch, we revise the regcache implementation to allow populating the contents gradually and storing the registers only when they have updated values. To this aim, we introduce a new register status: REG_DIRTY. This status denotes that a register value has been cached and also updated. When invalidating the cache, only the dirty registers are stored to the target. In a typical debug session, it is more likely that only a small subset of the register file has changed. Therefore, selectively storing the registers on targets with many threads and registers can save substantial costs, with respect to storing the whole set. The collect_register function now performs a lazy fetch. If the requested register value is not cached yet, it is requested from the target. The supply_register function updates the status of the supplied register as follows: if the register was not available in the cache, its status becomes REG_VALID, denoting that the value is now cached. If the register is supplied again, it becomes REG_DIRTY. The function that supply the whole register set (supply_regblock and registers_from_string) are also updated to compare the present and new values of each register, so that we can track the register statuses (i.e. dirty or not) properly. Regression-tested on an X86_64 Linux target using the native-gdbserver and native-extended-gdbserver board files. --- gdbserver/regcache.cc | 96 ++++++++++++++++++++++++++++++------ gdbserver/regcache.h | 6 +++ gdbsupport/common-regcache.h | 3 ++ 3 files changed, 91 insertions(+), 14 deletions(-) diff --git a/gdbserver/regcache.cc b/gdbserver/regcache.cc index cfb68774402..cf020985c31 100644 --- a/gdbserver/regcache.cc +++ b/gdbserver/regcache.cc @@ -63,6 +63,18 @@ regcache::fetch () gdb_assert (this->thread != nullptr); switch_to_thread (this->thread); + /* If there are individually-fetched dirty registers, first + store them, then fetch all. We prefer this to doing + individual fetch for each registers, if needed, because it is + more likely that very few registers are individually-fetched + at this moment and that fetching all in one go is more + efficient than fetching each reg one by one. */ + for (int i = 0; i < tdesc->reg_defs.size (); ++i) + { + if (register_status[i] == REG_DIRTY) + store_inferior_registers (this, i); + } + /* Invalidate all registers, to prevent stale left-overs. */ discard (); fetch_inferior_registers (this, -1); @@ -100,12 +112,17 @@ regcache_invalidate_thread (struct thread_info *thread) void regcache::invalidate () { - if (registers_fetched) + scoped_restore_current_thread restore_thread; + gdb_assert (this->thread != nullptr); + switch_to_thread (this->thread); + + /* Store dirty registers individually. We prefer this to a + store-all, because it is more likely that a small number of + registers have changed. */ + for (int i = 0; i < tdesc->reg_defs.size (); ++i) { - scoped_restore_current_thread restore_thread; - gdb_assert (this->thread != nullptr); - switch_to_thread (this->thread); - store_inferior_registers (this, -1); + if (register_status[i] == REG_DIRTY) + store_inferior_registers (this, i); } discard (); @@ -231,7 +248,8 @@ regcache::registers_to_string (char *buf) unsigned char *regs = registers; for (int i = 0; i < tdesc->reg_defs.size (); ++i) { - if (register_status[i] == REG_VALID) + if (register_status[i] == REG_VALID + || register_status[i] == REG_DIRTY) { bin2hex (regs, buf, register_size (tdesc, i)); buf += register_size (tdesc, i) * 2; @@ -258,9 +276,12 @@ regcache::registers_from_string (const char *buf) if (len > tdesc->registers_size * 2) len = tdesc->registers_size * 2; } - hex2bin (buf, registers, len / 2); - /* All register data have been re-written. Update the statuses. */ - memset (register_status, REG_VALID, tdesc->reg_defs.size ()); + + unsigned char *new_regs = + (unsigned char *) alloca (tdesc->registers_size); + + hex2bin (buf, new_regs, len / 2); + supply_regblock (new_regs); } /* See regcache.h */ @@ -350,7 +371,7 @@ regcache::raw_supply (int n, const void *buf) { memcpy (register_data (n), buf, register_size (tdesc, n)); #ifndef IN_PROCESS_AGENT - set_register_status (n, REG_VALID); + bump_register_status (n); #endif } else @@ -370,7 +391,7 @@ supply_register_zeroed (struct regcache *regcache, int n) memset (regcache->register_data (n), 0, register_size (regcache->tdesc, n)); #ifndef IN_PROCESS_AGENT - regcache->set_register_status (n, REG_VALID); + regcache->bump_register_status (n); #endif } @@ -392,11 +413,26 @@ regcache::supply_regblock (const void *buf) { gdb_assert (buf != nullptr); - memcpy (registers, buf, tdesc->registers_size); #ifndef IN_PROCESS_AGENT - for (int i = 0; i < tdesc->reg_defs.size (); i++) - set_register_status (i, REG_VALID); + /* First, update the statuses. Mark dirty only those that have + changed. */ + unsigned char *regs = registers; + unsigned char *new_regs = (unsigned char *) buf; + for (int i = 0; i < tdesc->reg_defs.size (); ++i) + { + int size = register_size (tdesc, i); + bool first_time = (get_register_status (i) == REG_UNKNOWN); + bool valid = (get_register_status (i) == REG_VALID); + + if (first_time + || (valid && (memcmp (new_regs, regs, size) != 0))) + bump_register_status (i); + + regs += size; + new_regs += size; + } #endif + memcpy (registers, buf, tdesc->registers_size); } #ifndef IN_PROCESS_AGENT @@ -413,6 +449,15 @@ supply_register_by_name (struct regcache *regcache, void collect_register (struct regcache *regcache, int n, void *buf) { +#ifndef IN_PROCESS_AGENT + if (regcache->get_register_status (n) == REG_UNKNOWN) + { + /* This register has not been fetched from the target, yet. + Do it now. */ + fetch_inferior_registers (regcache, n); + } +#endif + regcache->raw_collect (n, buf); } @@ -513,6 +558,29 @@ regcache::set_register_status (int regnum, enum register_status status) #endif } +void +regcache::bump_register_status (int regnum) +{ +#ifndef IN_PROCESS_AGENT + if (register_status == nullptr) + return; +#endif + + switch (get_register_status (regnum)) + { + case REG_UNKNOWN: + set_register_status (regnum, REG_VALID); + break; + + case REG_VALID: + set_register_status (regnum, REG_DIRTY); + break; + + default: + break; + } +} + /* See gdbsupport/common-regcache.h. */ bool diff --git a/gdbserver/regcache.h b/gdbserver/regcache.h index 216044889ec..132709fa71f 100644 --- a/gdbserver/regcache.h +++ b/gdbserver/regcache.h @@ -74,6 +74,12 @@ struct regcache : public reg_buffer_common /* Set the status of register REGNUM to STATUS. */ void set_register_status (int regnum, enum register_status status); + /* Shift the register status "one level" towards REG_DIRTY. + REG_UNKNOWN becomes REG_VALID; + REG_VALID becomes REG_DIRTY; + REG_DIRTY and REG_UNAVAILABLE stay the same. */ + void bump_register_status (int regnum); + /* See gdbsupport/common-regcache.h. */ void raw_supply (int regnum, const void *buf) override; diff --git a/gdbsupport/common-regcache.h b/gdbsupport/common-regcache.h index bf14610f98f..e81238fe7e0 100644 --- a/gdbsupport/common-regcache.h +++ b/gdbsupport/common-regcache.h @@ -31,6 +31,9 @@ enum register_status : signed char /* The register value is valid and cached. */ REG_VALID = 1, + /* The register value is valid, cached, and has been changed. */ + REG_DIRTY = 2, + /* The register value is unavailable. E.g., we're inspecting a traceframe, and this register wasn't collected. Note that this "unavailable" is different from saying the register does not