From patchwork Fri Aug 29 13:51:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gary Benson X-Patchwork-Id: 2586 Received: (qmail 20014 invoked by alias); 29 Aug 2014 13:51:52 -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 19997 invoked by uid 89); 29 Aug 2014 13:51:51 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Fri, 29 Aug 2014 13:51:50 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s7TDplX9018108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Fri, 29 Aug 2014 09:51:47 -0400 Received: from blade.nx (ovpn-116-113.ams2.redhat.com [10.36.116.113]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s7TDpk4v028136; Fri, 29 Aug 2014 09:51:46 -0400 Received: from blade.nx (localhost [127.0.0.1]) by blade.nx (Postfix) with ESMTP id 0F37E2640EC; Fri, 29 Aug 2014 14:51:44 +0100 (BST) From: Gary Benson To: gdb-patches@sourceware.org Cc: Pedro Alves , Doug Evans Subject: [PATCH 3/9 v7] Introduce target_{stop,continue}_ptid Date: Fri, 29 Aug 2014 14:51:33 +0100 Message-Id: <1409320299-6812-4-git-send-email-gbenson@redhat.com> In-Reply-To: <1409320299-6812-1-git-send-email-gbenson@redhat.com> References: <1409320299-6812-1-git-send-email-gbenson@redhat.com> X-IsSubscribed: yes This commit introduces two new functions to stop and restart target processes that shared code can use and that clients must implement. It also changes some shared code to use these functions. The changes in this patch replace the target_stop, target_wait and target_resume parts of this patch I posted on August 1: https://sourceware.org/ml/gdb-patches/2014-08/msg00014.html The remainder of that patch is in patch 2 of this series. gdb/ChangeLog: * target/target.h (target_stop_ptid, target_continue_ptid): Declare. * target.c (target_stop_ptid, target_continue_ptid): New functions. * common/agent.c [!GDBSERVER]: Don't include infrun.h. (agent_run_command): Always use target_stop_ptid and target_continue_ptid. gdb/gdbserver/ChangeLog: * target.c (target_stop_ptid, target_continue_ptid): New functions. --- gdb/ChangeLog | 10 ++++++++++ gdb/common/agent.c | 37 ++----------------------------------- gdb/gdbserver/ChangeLog | 5 +++++ gdb/gdbserver/target.c | 32 ++++++++++++++++++++++++++++++++ gdb/target.c | 25 +++++++++++++++++++++++++ gdb/target/target.h | 12 ++++++++++++ 6 files changed, 86 insertions(+), 35 deletions(-) diff --git a/gdb/common/agent.c b/gdb/common/agent.c index 9f8ea9a..0ac73a9 100644 --- a/gdb/common/agent.c +++ b/gdb/common/agent.c @@ -21,7 +21,6 @@ #include "server.h" #else #include "defs.h" -#include "infrun.h" #include "objfiles.h" #endif #include "target/target.h" @@ -218,18 +217,7 @@ agent_run_command (int pid, const char *cmd, int len) DEBUG_AGENT ("agent: resumed helper thread\n"); /* Resume helper thread. */ -#ifdef GDBSERVER -{ - struct thread_resume resume_info; - - resume_info.thread = ptid; - resume_info.kind = resume_continue; - resume_info.sig = GDB_SIGNAL_0; - (*the_target->resume) (&resume_info, 1); -} -#else - target_resume (ptid, 0, GDB_SIGNAL_0); -#endif + target_continue_ptid (ptid); fd = gdb_connect_sync_socket (pid); if (fd >= 0) @@ -261,30 +249,9 @@ agent_run_command (int pid, const char *cmd, int len) /* Need to read response with the inferior stopped. */ if (!ptid_equal (ptid, null_ptid)) { - struct target_waitstatus status; - int was_non_stop = non_stop; /* Stop thread PTID. */ DEBUG_AGENT ("agent: stop helper thread\n"); -#ifdef GDBSERVER - { - struct thread_resume resume_info; - - resume_info.thread = ptid; - resume_info.kind = resume_stop; - resume_info.sig = GDB_SIGNAL_0; - (*the_target->resume) (&resume_info, 1); - } - - non_stop = 1; - mywait (ptid, &status, 0, 0); -#else - non_stop = 1; - target_stop (ptid); - - memset (&status, 0, sizeof (status)); - target_wait (ptid, &status, 0); -#endif - non_stop = was_non_stop; + target_stop_ptid (ptid); } if (fd >= 0) diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c index 08506e5..e51b7db 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -134,6 +134,38 @@ mywait (ptid_t ptid, struct target_waitstatus *ourstatus, int options, return ret; } +/* See target/target.h. */ + +void +target_stop_ptid (ptid_t ptid) +{ + struct target_waitstatus status; + int was_non_stop = non_stop; + struct thread_resume resume_info; + + resume_info.thread = ptid; + resume_info.kind = resume_stop; + resume_info.sig = GDB_SIGNAL_0; + (*the_target->resume) (&resume_info, 1); + + non_stop = 1; + mywait (ptid, &status, 0, 0); + non_stop = was_non_stop; +} + +/* See target/target.h. */ + +void +target_continue_ptid (ptid_t ptid) +{ + struct thread_resume resume_info; + + resume_info.thread = ptid; + resume_info.kind = resume_continue; + resume_info.sig = GDB_SIGNAL_0; + (*the_target->resume) (&resume_info, 1); +} + int start_non_stop (int nonstop) { diff --git a/gdb/target.c b/gdb/target.c index 711e7cb..339b1d1 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -3027,6 +3027,31 @@ target_stop (ptid_t ptid) (*current_target.to_stop) (¤t_target, ptid); } +/* See target/target.h. */ + +void +target_stop_ptid (ptid_t ptid) +{ + struct target_waitstatus status; + int was_non_stop = non_stop; + + non_stop = 1; + target_stop (ptid); + + memset (&status, 0, sizeof (status)); + target_wait (ptid, &status, 0); + + non_stop = was_non_stop; +} + +/* See target/target.h. */ + +void +target_continue_ptid (ptid_t ptid) +{ + target_resume (ptid, 0, GDB_SIGNAL_0); +} + /* Concatenate ELEM to LIST, a comma separate list, and return the result. The LIST incoming argument is released. */ diff --git a/gdb/target/target.h b/gdb/target/target.h index 0a3c4b7..902de64 100644 --- a/gdb/target/target.h +++ b/gdb/target/target.h @@ -59,4 +59,16 @@ extern int target_read_uint32 (CORE_ADDR memaddr, uint32_t *result); extern int target_write_memory (CORE_ADDR memaddr, const gdb_byte *myaddr, ssize_t len); +/* Make target stop in a continuable fashion. (For instance, under + Unix, this should act like SIGSTOP). This function must be + provided by the client. This function is normally used by GUIs + to implement a stop button. */ + +extern void target_stop_ptid (ptid_t ptid); + +/* Restart a target that was previously stopped by target_stop_ptid. + This function must be provided by the client. */ + +extern void target_continue_ptid (ptid_t ptid); + #endif /* TARGET_COMMON_H */