From patchwork Fri Dec 8 10:04:30 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yao Qi X-Patchwork-Id: 24814 Received: (qmail 25707 invoked by alias); 8 Dec 2017 10:04:43 -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 25512 invoked by uid 89); 8 Dec 2017 10:04:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy=assisted, Hx-languages-length:4650, H*r:sk:static. X-HELO: mail-wr0-f193.google.com Received: from mail-wr0-f193.google.com (HELO mail-wr0-f193.google.com) (209.85.128.193) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 08 Dec 2017 10:04:41 +0000 Received: by mail-wr0-f193.google.com with SMTP id z34so10256425wrz.10 for ; Fri, 08 Dec 2017 02:04:40 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=ALECKJc6UDNEsQVMT0j9JRo0KleI6b/NKwqepmoKRwA=; b=hIqVmiFEwNh7Vcqw1Eo+eFLHlS7kXA3OymR1YqL6hLbKKSre1R/ERIERlRarFZDCOK +O8xqMro3rZ9hZ8Sqm9M41ct1Wom0vhFd+7KAXTFNESoG9iWSem/0vUX6JO7Y1Oi20zB 9nbHbHV4l3KvnsrAY4J8N/K6AqxzpnF7g4usBRNbHBAWT0hau/pI7Rr2QHQ2/S5feTjH Bu/sD04VThaPMnnOiFToJ3l/YXcWi6bNdiawGXOBvOuTWegPicrdTguEtu5L+4F488xL 37pxX/p6B84My9smUA4pDSUA7tK7NQAye7H+u06GZxfLs59Eb6LThD/FI5NxPXqmOxoI WVuw== X-Gm-Message-State: AKGB3mIG9p5owBNvt/Un15FV/zoCEM8kvzvhfAjEU225tKebWSoxj8iv IDE95BQtQia9U3OAM3PR/ZJ8kw== X-Google-Smtp-Source: AGs4zMa6bTo8l4PBJzXTV/k8+qPPDwDWTtJFX0bjvNNU1B7xBRUdFFMgcNxoD8VjAuMoIaoaLHgkvw== X-Received: by 10.223.156.202 with SMTP id h10mr5186062wre.174.1512727478134; Fri, 08 Dec 2017 02:04:38 -0800 (PST) Received: from E107787-LIN.cambridge.arm.com (static.42.136.251.148.clients.your-server.de. [148.251.136.42]) by smtp.gmail.com with ESMTPSA id a22sm1194394wme.46.2017.12.08.02.04.37 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 08 Dec 2017 02:04:37 -0800 (PST) From: Yao Qi X-Google-Original-From: Yao Qi To: gdb-patches@sourceware.org Subject: [PATCH 2/3] Adjust breakpoint address by clearing non-significant bits Date: Fri, 8 Dec 2017 10:04:30 +0000 Message-Id: <1512727471-30745-3-git-send-email-yao.qi@linaro.org> In-Reply-To: <1512727471-30745-1-git-send-email-yao.qi@linaro.org> References: <1512727471-30745-1-git-send-email-yao.qi@linaro.org> X-IsSubscribed: yes Tag in tagged address on AArch64 is treated as a non-significant bits of address, which can be got by gdbarch method significant_addr_bit, and gdb can clear these bits. With this patch, when user sets a breakpoint on tagged address on AArch64, GDB will drop the top byte of address, and put breakpoint at the new place, as shown below, (gdb) hbreak *func_ptr warning: Breakpoint address adjusted from 0xf000000000400690 to 0x00400690. Hardware assisted breakpoint 2 at 0x400690 (gdb) break *func_ptr warning: Breakpoint address adjusted from 0xf000000000400690 to 0x00400690. Breakpoint 3 at 0x400690 When program hits a breakpoint, the stopped pc reported by Linux kernel is the address *without* tag, so it is better the address recorded in breakpoint location is the one without tag too, so we can still match breakpoint location address and stopped pc reported by Linux kernel, by simple compare. gdb: 2017-10-24 Yao Qi * breakpoint.c (adjust_breakpoint_address): Call address_significant. gdb/testsuite: 2017-10-24 Yao Qi * gdb.arch/aarch64-tagged-pointer.c (main): Update. * gdb.arch/aarch64-tagged-pointer.exp: Add test for breakpoint. --- gdb/breakpoint.c | 20 +++++++++---------- gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c | 8 ++++++++ gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp | 24 +++++++++++++++++++++++ 3 files changed, 42 insertions(+), 10 deletions(-) diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 76bfd53..22b3069 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -6987,12 +6987,7 @@ static CORE_ADDR adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr, enum bptype bptype) { - if (!gdbarch_adjust_breakpoint_address_p (gdbarch)) - { - /* Very few targets need any kind of breakpoint adjustment. */ - return bpaddr; - } - else if (bptype == bp_watchpoint + if (bptype == bp_watchpoint || bptype == bp_hardware_watchpoint || bptype == bp_read_watchpoint || bptype == bp_access_watchpoint @@ -7014,11 +7009,16 @@ adjust_breakpoint_address (struct gdbarch *gdbarch, } else { - CORE_ADDR adjusted_bpaddr; + CORE_ADDR adjusted_bpaddr = bpaddr; + + if (gdbarch_adjust_breakpoint_address_p (gdbarch)) + { + /* Some targets have architectural constraints on the placement + of breakpoint instructions. Obtain the adjusted address. */ + adjusted_bpaddr = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr); + } - /* Some targets have architectural constraints on the placement - of breakpoint instructions. Obtain the adjusted address. */ - adjusted_bpaddr = gdbarch_adjust_breakpoint_address (gdbarch, bpaddr); + adjusted_bpaddr = address_significant (gdbarch, adjusted_bpaddr); /* An adjusted breakpoint address can significantly alter a user's expectations. Print a warning if an adjustment diff --git a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c index 7c90132..9bfe41e 100644 --- a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c +++ b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.c @@ -45,4 +45,12 @@ main (void) void (*func_ptr) (void) = foo; func_ptr = (void (*) (void)) ((uintptr_t) func_ptr | 0xf000000000000000ULL); sp2->i = 4321; /* breakpoint here. */ + + for (int i = 0; i < 2; i++) + { + foo (); + (*func_ptr) (); + } + + sp1->i = 8765; } diff --git a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp index 4f2b44c..fcab1b7 100644 --- a/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp +++ b/gdb/testsuite/gdb.arch/aarch64-tagged-pointer.exp @@ -65,3 +65,27 @@ gdb_test_multiple $test $test { gdb_test "disassemble func_ptr,+8" \ ":\[\t \]+$insn1\[ \r\n\]+.*:\[\t \]+$insn2.*" + +foreach_with_prefix bptype {"hbreak" "break"} { + + # Set a breakpoint on a tagged address, func_ptr, + gdb_test "$bptype *func_ptr" \ + "warning: Breakpoint address adjusted from .*reakpoint $decimal at .*" \ + "breakpoint at *func_ptr" + # Resume the program and expect it hits foo, + gdb_test "continue" \ + "Continuing\\..*Breakpoint \[0-9\]+, foo \\(\\) at .*" \ + "run until breakpoint set *func_ptr" + gdb_test "up" "foo \\(\\).*" "caller is foo" + delete_breakpoints + + # Set a breakpoint on normal function, call it through tagged + # function pointer. + gdb_test "$bptype foo" "reakpoint $decimal at .*" \ + "hardware breakpoint at foo" + gdb_test "continue" \ + "Continuing\\..*Breakpoint \[0-9\]+, foo \\(\\) at .*" \ + "run until breakpoint set foo" + gdb_test "up" "\\(\*func_ptr\\) \\(\\).*" "caller is *func_ptr" + delete_breakpoints +}