From patchwork Tue Oct 29 17:57:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 35428 Received: (qmail 53263 invoked by alias); 29 Oct 2019 17:58:34 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 49915 invoked by uid 89); 29 Oct 2019 17:58:17 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy=tdesc X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 29 Oct 2019 17:58:15 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 9C03621324; Tue, 29 Oct 2019 13:58:13 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id D1803215AC for ; Tue, 29 Oct 2019 13:57:56 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id C910B20AF6 for ; Tue, 29 Oct 2019 13:57:56 -0400 (EDT) X-Gerrit-PatchSet: 1 Date: Tue, 29 Oct 2019 13:57:56 -0400 From: "Tom Tromey (Code Review)" To: gdb-patches@sourceware.org Message-ID: Auto-Submitted: auto-generated X-Gerrit-MessageType: newchange Subject: [review] Add read_pc / write_pc support to win32-low X-Gerrit-Change-Id: I4dcb72f262b778c2db554f6ff9b675a35f14318b X-Gerrit-Change-Number: 430 X-Gerrit-ChangeURL: X-Gerrit-Commit: ce5f69956143d385ea58de1da1eab38b7661ac28 References: Reply-To: tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-74-g460fb0f7e9 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/430 ...................................................................... Add read_pc / write_pc support to win32-low This changes win32-low.c to implement the read_pc and write_pc methods. A subsequent patch will need these. Note that I have no way to test, or even compile, the win32-arm-low.c change. Change-Id: I83552edd4ec61204a7e56f1adbd5a9c941bb52e5 gdb/gdbserver/ChangeLog 2019-10-29 Tom Tromey * win32-low.c (win32_read_pc, win32_write_pc): New functions. (win32_target_ops): Update. * win32-i386-low.c (i386_win32_get_pc, i386_win32_set_pc): New functions. (the_low_target): Update. * win32-arm-low.c (arm_win32_get_pc, arm_win32_set_pc): New functions. (the_low_target): Update. Change-Id: I4dcb72f262b778c2db554f6ff9b675a35f14318b --- M gdb/gdbserver/ChangeLog M gdb/gdbserver/win32-arm-low.c M gdb/gdbserver/win32-i386-low.c M gdb/gdbserver/win32-low.c M gdb/gdbserver/win32-low.h 5 files changed, 95 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index c36dcb0..fb2fbef 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,16 @@ 2019-10-29 Tom Tromey + * win32-low.c (win32_read_pc, win32_write_pc): New functions. + (win32_target_ops): Update. + * win32-i386-low.c (i386_win32_get_pc, i386_win32_set_pc): New + functions. + (the_low_target): Update. + * win32-arm-low.c (arm_win32_get_pc, arm_win32_set_pc): New + functions. + (the_low_target): Update. + +2019-10-29 Tom Tromey + * win32-low.c (win32_kill, get_child_debug_event): Use wait_for_debug_event. diff --git a/gdb/gdbserver/win32-arm-low.c b/gdb/gdbserver/win32-arm-low.c index c465aed..f2052c6 100644 --- a/gdb/gdbserver/win32-arm-low.c +++ b/gdb/gdbserver/win32-arm-low.c @@ -113,6 +113,23 @@ static const unsigned long arm_wince_breakpoint = 0xe6000010; #define arm_wince_breakpoint_len 4 +static CORE_ADDR +arm_win32_get_pc (struct regcache *regcache) +{ + uint32_t pc; + + collect_register_by_name (regcache, "pc", &pc); + return (CORE_ADDR) pc; +} + +static void +arm_win32_set_pc (struct regcache *regcache, CORE_ADDR pc) +{ + uint32_t newpc = pc; + + supply_register_by_name (regcache, "pc", &newpc); +} + struct win32_target_ops the_low_target = { arm_arch_setup, sizeof (mappings) / sizeof (mappings[0]), @@ -125,6 +142,8 @@ NULL, /* single_step */ (const unsigned char *) &arm_wince_breakpoint, arm_wince_breakpoint_len, + arm_win32_get_pc, + arm_win32_set_pc, /* Watchpoint related functions. See target.h for comments. */ NULL, /* supports_z_point_type */ NULL, /* insert_point */ diff --git a/gdb/gdbserver/win32-i386-low.c b/gdb/gdbserver/win32-i386-low.c index b834b16..421f969 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -448,6 +448,46 @@ win32_tdesc = tdesc; } +static CORE_ADDR +i386_win32_get_pc (struct regcache *regcache) +{ + int use_64bit = register_size (regcache->tdesc, 0) == 8; + + if (use_64bit) + { + uint64_t pc; + + collect_register_by_name (regcache, "rip", &pc); + return (CORE_ADDR) pc; + } + else + { + uint32_t pc; + + collect_register_by_name (regcache, "eip", &pc); + return (CORE_ADDR) pc; + } +} + +static void +i386_win32_set_pc (struct regcache *regcache, CORE_ADDR pc) +{ + int use_64bit = register_size (regcache->tdesc, 0) == 8; + + if (use_64bit) + { + uint64_t newpc = pc; + + supply_register_by_name (regcache, "rip", &newpc); + } + else + { + uint32_t newpc = pc; + + supply_register_by_name (regcache, "eip", &newpc); + } +} + struct win32_target_ops the_low_target = { i386_arch_setup, sizeof (mappings) / sizeof (mappings[0]), @@ -460,6 +500,8 @@ i386_single_step, &i386_win32_breakpoint, i386_win32_breakpoint_len, + i386_win32_get_pc, + i386_win32_set_pc, i386_supports_z_point_type, i386_insert_point, i386_remove_point, diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index 10b14df..14bd79f 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -1585,6 +1585,22 @@ return the_low_target.breakpoint; } +/* Implementation of the target_ops method "read_pc". */ + +static CORE_ADDR +win32_read_pc (struct regcache *regcache) +{ + return (*the_low_target.get_pc) (regcache); +} + +/* Implementation of the target_ops method "write_pc". */ + +static void +win32_write_pc (struct regcache *regcache, CORE_ADDR pc) +{ + return (*the_low_target.set_pc) (regcache, pc); +} + static struct target_ops win32_target_ops = { win32_create_inferior, NULL, /* post_create_inferior */ @@ -1637,8 +1653,8 @@ NULL, /* read_loadmap */ NULL, /* process_qsupported */ NULL, /* supports_tracepoints */ - NULL, /* read_pc */ - NULL, /* write_pc */ + win32_read_pc, + win32_write_pc, NULL, /* thread_stopped */ win32_get_tib_address, NULL, /* pause_all */ diff --git a/gdb/gdbserver/win32-low.h b/gdb/gdbserver/win32-low.h index 5a94686..73ceb4b 100644 --- a/gdb/gdbserver/win32-low.h +++ b/gdb/gdbserver/win32-low.h @@ -63,6 +63,11 @@ const unsigned char *breakpoint; int breakpoint_len; + /* Get the PC register from REGCACHE. */ + CORE_ADDR (*get_pc) (struct regcache *regcache); + /* Set the PC register in REGCACHE. */ + void (*set_pc) (struct regcache *regcache, CORE_ADDR newpc); + /* Breakpoint/Watchpoint related functions. See target.h for comments. */ int (*supports_z_point_type) (char z_type); int (*insert_point) (enum raw_bkpt_type type, CORE_ADDR addr,