From patchwork Tue Nov 26 17:11:33 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: 36227 Received: (qmail 97171 invoked by alias); 26 Nov 2019 17:12:19 -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 95938 invoked by uid 89); 26 Nov 2019 17:12:10 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= 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, 26 Nov 2019 17:12:08 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id B3B182064A; Tue, 26 Nov 2019 12:12:07 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id BF9E82226F for ; Tue, 26 Nov 2019 12:11:33 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id AE4E428175 for ; Tue, 26 Nov 2019 12:11:33 -0500 (EST) X-Gerrit-PatchSet: 1 Date: Tue, 26 Nov 2019 12:11:33 -0500 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: I83552edd4ec61204a7e56f1adbd5a9c941bb52e5 X-Gerrit-Change-Number: 721 X-Gerrit-ChangeURL: X-Gerrit-Commit: 03506cb875d6269c1505cd589f933a605441c32a References: Reply-To: tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/721 ...................................................................... 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. 2019-11-26 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: I83552edd4ec61204a7e56f1adbd5a9c941bb52e5 --- 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, 103 insertions(+), 2 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index d05734a..df6206e 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,16 @@ 2019-11-26 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-11-26 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..c13089a 100644 --- a/gdb/gdbserver/win32-arm-low.c +++ b/gdb/gdbserver/win32-arm-low.c @@ -113,6 +113,27 @@ static const unsigned long arm_wince_breakpoint = 0xe6000010; #define arm_wince_breakpoint_len 4 +/* Implement win32_target_ops "get_pc" method. */ + +static CORE_ADDR +arm_win32_get_pc (struct regcache *regcache) +{ + uint32_t pc; + + collect_register_by_name (regcache, "pc", &pc); + return (CORE_ADDR) pc; +} + +/* Implement win32_target_ops "set_pc" method. */ + +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 +146,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..b99afcf 100644 --- a/gdb/gdbserver/win32-i386-low.c +++ b/gdb/gdbserver/win32-i386-low.c @@ -448,6 +448,50 @@ win32_tdesc = tdesc; } +/* Implement win32_target_ops "get_pc" method. */ + +static CORE_ADDR +i386_win32_get_pc (struct regcache *regcache) +{ + bool 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; + } +} + +/* Implement win32_target_ops "set_pc" method. */ + +static void +i386_win32_set_pc (struct regcache *regcache, CORE_ADDR pc) +{ + bool 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 +504,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 7b5ae07..9d88d1a 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,