From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25379 invoked by alias); 27 Jun 2008 15:56:10 -0000 Received: (qmail 25368 invoked by uid 22791); 27 Jun 2008 15:56:09 -0000 X-Spam-Check-By: sourceware.org Received: from snape.ecoscentric.com (HELO snape.ecoscentric.com) (212.13.207.199) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 27 Jun 2008 15:55:44 +0000 Received: from localhost (snape.ecoscentric.com [127.0.0.1]) by snape.ecoscentric.com (Postfix) with ESMTP id 7A87F2C13F for ; Fri, 27 Jun 2008 16:55:41 +0100 (BST) Received: from snape.ecoscentric.com ([127.0.0.1]) by localhost (snape.ecoscentric.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SlEapiSJe1RF; Fri, 27 Jun 2008 16:55:38 +0100 (BST) Message-ID: <48650D79.6080502@eCosCentric.com> Date: Fri, 27 Jun 2008 16:25:00 -0000 From: Jonathan Larmour User-Agent: Thunderbird 1.5.0.12 (X11/20070530) MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: remote.c Z0 packet detection robustness OpenPGP: id=A5FB74E6 Content-Type: multipart/mixed; boundary="------------060004000804070701080604" Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-06/txt/msg00501.txt.bz2 This is a multi-part message in MIME format. --------------060004000804070701080604 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-length: 1742 Hi, The attached patch improves the robustness of Z0 packet detection. In some rare cases on some targets, the remote_insert_breakpoint behaves differently for the first breakpoint attempted, as a result of the Z0 packet support detection. The problem is that GDB modifies the address information used as part of the detection, by passing in the address to use to gdbarch_breakpoint_from_pc, which on some target vectors (in my case MIPS16, although it's also conceivable for Thumb to be affected) modifies the address. If the Z0 packet is unknown, it drops through to memory_insert_breakpoint passing it the modified address. This can cause a change in later heuristics within the target support when the target tries to detect the form of breakpoint required (e.g. 2 versus 4 byte). You can see this in the implementation of e.g. mips_breakpoint_from_pc, which will look at the PC first, to determine the breakpoint style to use, not the length. Most of the times this works, but in some particular cases, depending on particular characteristics of the symbol, it can fail to detect mips16 addresses. Whereas it could detect them if the address had been unmodified. I have check-in permissions, so can commit after approval if that helps. Jifl 2008-06-27 Jonathan Larmour * remote.c (remote_insert_breakpoint): Ensure that if Z0 unsupported and we fall back to memory_insert_breakpoint, we use the unmodified requested address. -- eCosCentric Limited http://www.eCosCentric.com/ The eCos experts Barnwell House, Barnwell Drive, Cambridge, UK. Tel: +44 1223 245571 Registered in England and Wales: Reg No 4422071. ------["Si fractum non sit, noli id reficere"]------ Opinions==mine --------------060004000804070701080604 Content-Type: text/x-patch; name="remotebp.z0.detect.tweak.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="remotebp.z0.detect.tweak.patch" Content-length: 1025 --- gdb/remote.c~ 2008-06-11 13:56:36.000000000 +0100 +++ gdb/remote.c 2008-06-20 19:56:54.000000000 +0100 @@ -5250,12 +5250,13 @@ remote_insert_breakpoint (struct bp_targ if (remote_protocol_packets[PACKET_Z0].support != PACKET_DISABLE) { - CORE_ADDR addr; + CORE_ADDR addr = bp_tgt->placed_address; struct remote_state *rs; char *p; + int bpsize; gdbarch_breakpoint_from_pc - (current_gdbarch, &bp_tgt->placed_address, &bp_tgt->placed_size); + (current_gdbarch, &addr, &bpsize); rs = get_remote_state (); p = rs->buf; @@ -5263,9 +5264,9 @@ remote_insert_breakpoint (struct bp_targ *(p++) = 'Z'; *(p++) = '0'; *(p++) = ','; - addr = (ULONGEST) remote_address_masked (bp_tgt->placed_address); + addr = (ULONGEST) remote_address_masked (addr); p += hexnumstr (p, addr); - sprintf (p, ",%d", bp_tgt->placed_size); + sprintf (p, ",%d", bpsize); putpkt (rs->buf); getpkt (&rs->buf, &rs->buf_size, 0); --------------060004000804070701080604--