From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8234 invoked by alias); 10 Aug 2012 17:06:27 -0000 Received: (qmail 8219 invoked by uid 22791); 10 Aug 2012 17:06:21 -0000 X-SWARE-Spam-Status: No, hits=-4.0 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,TW_BL,TW_XT X-Spam-Check-By: sourceware.org Received: from relay1.mentorg.com (HELO relay1.mentorg.com) (192.94.38.131) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 10 Aug 2012 17:06:08 +0000 Received: from svr-orw-exc-10.mgc.mentorg.com ([147.34.98.58]) by relay1.mentorg.com with esmtp id 1Szsf1-0000Dj-Py from joseph_myers@mentor.com for gdb-patches@sourceware.org; Fri, 10 Aug 2012 10:06:07 -0700 Received: from SVR-IES-FEM-02.mgc.mentorg.com ([137.202.0.106]) by SVR-ORW-EXC-10.mgc.mentorg.com with Microsoft SMTPSVC(6.0.3790.4675); Fri, 10 Aug 2012 10:06:07 -0700 Received: from digraph.polyomino.org.uk (137.202.0.76) by SVR-IES-FEM-02.mgc.mentorg.com (137.202.0.106) with Microsoft SMTP Server id 14.1.289.1; Fri, 10 Aug 2012 18:06:05 +0100 Received: from jsm28 (helo=localhost) by digraph.polyomino.org.uk with local-esmtp (Exim 4.76) (envelope-from ) id 1Szsez-0002zZ-1F for gdb-patches@sourceware.org; Fri, 10 Aug 2012 17:06:05 +0000 Date: Fri, 10 Aug 2012 17:06:00 -0000 From: "Joseph S. Myers" To: Subject: Fix ARM stepping over Thumb-mode "bx pc" or "blx pc" Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" 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: 2012-08/txt/msg00321.txt.bz2 arm-tdep.c has code to determine the next instruction for use in single stepping. This code fails to handle a Thumb-mode "bx pc" or "blx pc" correctly; it acts as if the branch target (four bytes after the current instruction) should be in Thumb mode, when actually these instructions switch to ARM mode (results being UNPREDICTABLE if the bx instruction is not at a four-byte aligned address). In particular, this breaks stepping through PLT entries called from Thumb-mode code (those start with a "bx pc; nop" to switch to ARM mode for the rest of the PLT entry). This patch fixes this by masking off the low bits from a value that was computed with the low bit set (I followed another case that masks off two low bits, though as noted above the results are UNPREDICTABLE if the address has bit 1 set). Tested with no regressions with cross to arm-none-linux-gnueabi; the new test fails with unpatched GDB and passes with patched GDB. OK to commit? 2012-08-10 Joseph Myers * arm-tdep.c (thumb_get_next_pc_raw): Mask off low bits for bx pc and blx pc. testsuite: 2012-08-10 Joseph Myers * gdb.arch/thumb-bx-pc.S: New file. * gdb.arch/thumb-bx-pc.exp: New file. Index: gdb/arm-tdep.c =================================================================== RCS file: /cvs/src/src/gdb/arm-tdep.c,v retrieving revision 1.365 diff -u -r1.365 arm-tdep.c --- gdb/arm-tdep.c 25 Jun 2012 12:32:45 -0000 1.365 +++ gdb/arm-tdep.c 10 Aug 2012 15:18:37 -0000 @@ -4541,7 +4541,7 @@ else if ((inst1 & 0xff00) == 0x4700) /* bx REG, blx REG */ { if (bits (inst1, 3, 6) == 0x0f) - nextpc = pc_val; + nextpc = pc_val & 0xfffffffc; else nextpc = get_frame_register_unsigned (frame, bits (inst1, 3, 6)); } Index: gdb/testsuite/gdb.arch/thumb-bx-pc.S =================================================================== RCS file: gdb/testsuite/gdb.arch/thumb-bx-pc.S diff -N gdb/testsuite/gdb.arch/thumb-bx-pc.S --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.arch/thumb-bx-pc.S 10 Aug 2012 15:18:38 -0000 @@ -0,0 +1,34 @@ +/* Test PC adjustment from Thumb-mode "bx pc" instruction. + + Copyright 2012 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + + .syntax unified + .thumb + .text + .p2align 2 + .global main + .thumb + .thumb_func + .type main, %function +main: + bx pc + nop +.code 32 + mov r0, #0 + bx lr + .size main, .-main Index: gdb/testsuite/gdb.arch/thumb-bx-pc.exp =================================================================== RCS file: gdb/testsuite/gdb.arch/thumb-bx-pc.exp diff -N gdb/testsuite/gdb.arch/thumb-bx-pc.exp --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/testsuite/gdb.arch/thumb-bx-pc.exp 10 Aug 2012 15:18:38 -0000 @@ -0,0 +1,41 @@ +# Copyright 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Test PC adjustment from Thumb-mode "bx pc" instruction. + +if {![istarget arm*-*]} then { + verbose "Skipping ARM tests." + return +} + +set testfile "thumb-bx-pc" +set srcfile ${testfile}.S +set opts {} + +if [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] { + untested ${testfile}.exp + return -1 +} + +if ![runto_main] then { + untested ${testfile}.exp + return -1 +} + +gdb_test "stepi" "0x\[0-9a-fA-F\]+ in main \\(\\)" "stepi for bx pc" + +gdb_test "x /i \$pc" \ + "0x\[0-9a-fA-F\]+ :\[ \t\]+mov\[ \t\]+r0,\[ \t\]+#0.*" \ + "stepi reached correct instruction" -- Joseph S. Myers joseph@codesourcery.com