From patchwork Fri Jul 31 15:16:39 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 7961 Received: (qmail 58544 invoked by alias); 31 Jul 2015 15:17:14 -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 58248 invoked by uid 89); 31 Jul 2015 15:17:11 -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, FREEMAIL_FROM, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-pd0-f171.google.com Received: from mail-pd0-f171.google.com (HELO mail-pd0-f171.google.com) (209.85.192.171) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Fri, 31 Jul 2015 15:17:02 +0000 Received: by pdjr16 with SMTP id r16so45337486pdj.3 for ; Fri, 31 Jul 2015 08:17:00 -0700 (PDT) X-Received: by 10.70.23.196 with SMTP id o4mr8042385pdf.164.1438355820472; Fri, 31 Jul 2015 08:17:00 -0700 (PDT) Received: from E107787-LIN.cambridge.arm.com (gcc1-power7.osuosl.org. [140.211.15.137]) by smtp.gmail.com with ESMTPSA id pd10sm8253798pdb.66.2015.07.31.08.16.59 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 31 Jul 2015 08:16:59 -0700 (PDT) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 5/7] Disable Z0 packet on aarch64 on multi-arch debugging Date: Fri, 31 Jul 2015 16:16:39 +0100 Message-Id: <1438355801-25798-6-git-send-email-yao.qi@linaro.org> In-Reply-To: <1438355801-25798-1-git-send-email-yao.qi@linaro.org> References: <1438355801-25798-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes In multi-arch debugging, if GDB sends Z0 packet, GDBserver should be able to do several things below: - choose the right breakpoint instruction to insert according to the information available, such as 'kind' in Z0 packet and address, - choose the right breakpoint instruction to check memory writes and validate inserted memory breakpoint - be aware of different breakpoint instructions in $ARCH_breakpoint_at. unfortunately GDBserver can't do them now. Although x86 GDBserver supports multi-arch, it doesn't need to support them above because breakpoint instruction on i686 and x86_64 is the same. However, breakpoint instructions on aarch64 and arm (arm mode, thumb1, and thumb2) are different. I tried to teach aarch64 GDBserver backend to be really multi-arch-capable in the following ways, - linux_low_target return the right breakpoint instruction according to the 'kind' in Z0 packet, and insert_memory_breakpoint can do the right thing. - once breakpoint is inserted, the breakpoint data and length is recorded in each breakpoint object, so that validate_breakpoint and check_mem_write can get the right breakpoint instruction from each breakpoint object, rather than from global variable breakpoint_data. - linux_low_target needs another hook function for pc increment after hitting a breakpoint. - let set_breakpoint_at, which is widely used for tracepoint, use the 'default' breakpoint instruction. We can always use aarch64 breakpoint instruction since arm doesn't support tracepoint yet. looks it is not a small piece of work, so I decide to disable Z0 packet on multi-arch, which means aarch64 GDBserver only supports Z0 packet if it is started to debug only one process (extended protocol is not used) and process target description is 64-bit. gdb/gdbserver: 2015-07-28 Yao Qi * linux-aarch64-low.c (aarch64_supports_z_point_type): Return 0 for Z_PACKET_SW_BP if it may be used in multi-arch debugging. * server.c (extended_protocol): Remove "static". * server.h (extended_protocol): Declare it. --- gdb/gdbserver/linux-aarch64-low.c | 16 ++++++++++++++++ gdb/gdbserver/server.c | 2 +- gdb/gdbserver/server.h | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/gdb/gdbserver/linux-aarch64-low.c b/gdb/gdbserver/linux-aarch64-low.c index 3512ce9..90d2b43 100644 --- a/gdb/gdbserver/linux-aarch64-low.c +++ b/gdb/gdbserver/linux-aarch64-low.c @@ -364,6 +364,22 @@ aarch64_supports_z_point_type (char z_type) switch (z_type) { case Z_PACKET_SW_BP: + { + if (!extended_protocol && is_64bit_tdesc ()) + { + /* Only enable Z0 packet in non-multi-arch debugging. If + extended protocol is used, don't enable Z0 packet because + GDBserver may attach to 32-bit process. */ + return 1; + } + else + { + /* Disable Z0 packet so that GDBserver doesn't have to handle + different breakpoint instructions (aarch64, arm, thumb etc) + in multi-arch debugging. */ + return 0; + } + } case Z_PACKET_HW_BP: case Z_PACKET_WRITE_WP: case Z_PACKET_READ_WP: diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 2918770..f15b7be 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -49,7 +49,7 @@ ptid_t general_thread; int server_waiting; -static int extended_protocol; +int extended_protocol; static int response_needed; static int exit_requested; diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h index 09a5624..9080151 100644 --- a/gdb/gdbserver/server.h +++ b/gdb/gdbserver/server.h @@ -87,6 +87,7 @@ extern int multi_process; extern int report_fork_events; extern int report_vfork_events; extern int non_stop; +extern int extended_protocol; /* True if the "swbreak+" feature is active. In that case, GDB wants us to report whether a trap is explained by a software breakpoint