From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id uKKCNnSRu19WRgAAWB0awg (envelope-from ) for ; Mon, 23 Nov 2020 05:39:48 -0500 Received: by simark.ca (Postfix, from userid 112) id D31261F0AC; Mon, 23 Nov 2020 05:39:48 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.4 required=5.0 tests=DKIM_SIGNED,MAILING_LIST_MULTI, RDNS_NONE,T_DKIM_INVALID,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 329611F0A9 for ; Mon, 23 Nov 2020 05:39:48 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AECFE384B438; Mon, 23 Nov 2020 10:39:47 +0000 (GMT) Received: from mail-wm1-x344.google.com (mail-wm1-x344.google.com [IPv6:2a00:1450:4864:20::344]) by sourceware.org (Postfix) with ESMTPS id E4B853865C2A for ; Mon, 23 Nov 2020 10:39:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org E4B853865C2A Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wm1-x344.google.com with SMTP id s13so16740846wmh.4 for ; Mon, 23 Nov 2020 02:39:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=kl3k7oBJQjRUTkA7HAgXPkQ8UsXF920ZUrexjnnWDsE=; b=N23tpP+lQhLPLi3di2XqE5J1n/hm53IJ5KWxMJ4FXz0fqCipwCLhSQHZgeXBuTm0aa h77jx+Q5u5arX0Cc16D/m9GY0MqqNI64vgtCTqRzWa/FZLfh8ZD5OyVIS7oIL5SvInLj 66YRdKnqOxrtr6bAU6t7AxBmK9ALi5WsTutbSvwvOUvRHhU/c63b/tjB4/rx3d3zAw5t GWWODmn+OVdKNsVj4tmjcpjWoeHAexgYc8Q78Gbk3cj7U98Q/sApxRlwmh5a0+0zTXNf XhZ5j+FDHl9GrLsC6Udx5P9myMIQgqiKQwz+VJFPYLZBJovgWBgogluyUos83tfdq6RS jWhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=kl3k7oBJQjRUTkA7HAgXPkQ8UsXF920ZUrexjnnWDsE=; b=ilCyuvZQrmfeybuoeZ+7to88WPpWaBxl0yC8mZ6NsHA3oI1ZDQzLo8tWJbEHv+SVe9 HBkgo7zyKOThMpexHinTZRdnIDrYcHBSfsOFsemnCvei0YWVNQ9w7tS8BKR80NutK/f9 k4liZ1MGAxVdGXhxirZ4N/3FZR0+7AwDcPd/7oDLYrIw+c7ugMsC6bhWmjOFX0oMJkWz hCwiMFh+9xIzuZWreQ62WWAl22Fp88DQsafQG3smJVon/FUcBEInBpvBkIfA/Pelxg3z uaQ12TcsyKasLsVx4YSUn35tw5y8kiDWjbZNz8PRjN7PUQASnZohozoImHo79whNmDHb Hs2w== X-Gm-Message-State: AOAM5300UhEj+U8KCa96x9+3gBZBV4hPIgnNgnavL/VmEnFRiIoCgcrc 5+U5SUdk+2WQCnOQoHrfL0rIjjL+xyscwQ== X-Google-Smtp-Source: ABdhPJxHeNL6MUnE/qia05CRgTfgxaJn6ElOlcjjBQV8+jSYMa5t7BiaqQpDo/Sa1jdS5sCl2j/qzA== X-Received: by 2002:a7b:c412:: with SMTP id k18mr4935404wmi.36.1606127983729; Mon, 23 Nov 2020 02:39:43 -0800 (PST) Received: from localhost (host86-128-12-89.range86-128.btcentralplus.com. [86.128.12.89]) by smtp.gmail.com with ESMTPSA id d15sm20011511wrx.93.2020.11.23.02.39.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Nov 2020 02:39:43 -0800 (PST) From: Andrew Burgess To: gdb-patches@sourceware.org Subject: [PATCH 2/2] gdb: new command 'maint flush dcache' Date: Mon, 23 Nov 2020 10:39:37 +0000 Message-Id: X-Mailer: git-send-email 2.25.4 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" Add a new command to flush the dcache. gdb/ChangeLog: * NEWS: Mention new commands. * target-dcache.c: Add 'cli/cli-cmds.h' include. (maint_flush_dcache_command): New function. (_initialize_target_dcache): Create new 'maint flush dcache' command. gdb/doc/ChangeLog: * gdb.texinfo (Caching Target Data): Document 'maint flush dcache'. gdb/testsuite/ChangeLog: * gdb.base/dcache-flush.c: New file. * gdb.base/dcache-flush.exp: New file. --- gdb/ChangeLog | 8 ++++ gdb/NEWS | 3 ++ gdb/doc/ChangeLog | 5 ++ gdb/doc/gdb.texinfo | 6 +++ gdb/target-dcache.c | 19 ++++++++ gdb/testsuite/ChangeLog | 5 ++ gdb/testsuite/gdb.base/dcache-flush.c | 33 +++++++++++++ gdb/testsuite/gdb.base/dcache-flush.exp | 64 +++++++++++++++++++++++++ 8 files changed, 143 insertions(+) create mode 100644 gdb/testsuite/gdb.base/dcache-flush.c create mode 100644 gdb/testsuite/gdb.base/dcache-flush.exp diff --git a/gdb/NEWS b/gdb/NEWS index b07b054223f..ef59c7c1e69 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -32,6 +32,9 @@ maintenance flush register-cache These new commands are equivalent to the already existing commands 'maintenance flush-symbol-cache' and 'flushregs' respectively. +maintenance flush dcache + A new command to flush the dcache. + * Changed commands break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM] diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 3745aa52973..7017823ef75 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -13494,6 +13494,12 @@ @kindex show dcache line-size Show default size of dcache lines. +@item maint flush dcache +@cindex dcache, flushing +@kindex maint flush dcache +Flush the contents (if any) of the dcache. This maintainer command is +useful when debugging the dcache implementation. + @end table @node Searching Memory diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c index 0226d672780..90b60f62f2e 100644 --- a/gdb/target-dcache.c +++ b/gdb/target-dcache.c @@ -19,6 +19,7 @@ #include "target-dcache.h" #include "gdbcmd.h" #include "progspace.h" +#include "cli/cli-cmds.h" /* The target dcache is kept per-address-space. This key lets us associate the cache with the address space. */ @@ -152,6 +153,16 @@ code_cache_enabled_p (void) return code_cache_enabled; } +/* Implement the 'maint flush dcache' command. */ + +static void +maint_flush_dcache_command (const char *command, int from_tty) +{ + target_dcache_invalidate (); + if (from_tty) + printf_filtered (_("The dcache was flushed.\n")); +} + void _initialize_target_dcache (); void _initialize_target_dcache () @@ -178,4 +189,12 @@ access is on."), set_code_cache, show_code_cache, &setlist, &showlist); + + add_cmd ("dcache", class_maintenance, maint_flush_dcache_command, + _("\ +Force gdb to flush its target memory data cache.\n\ +\n\ +The dcache caches all target memory accesses where possible, this\n\ +includes the stack-cache and the code-cache."), + &maintenanceflushlist); } diff --git a/gdb/testsuite/gdb.base/dcache-flush.c b/gdb/testsuite/gdb.base/dcache-flush.c new file mode 100644 index 00000000000..b512ea31760 --- /dev/null +++ b/gdb/testsuite/gdb.base/dcache-flush.c @@ -0,0 +1,33 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2020 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 . */ + +int __attribute__((noinline)) +func (int *v1, int *v2) +{ + return *v1 - *v2 - 1; +} + +int +main () +{ + int var1 = 4; + int var2 = 3; + int res; + + res = func (&var1, &var2); + return res; +} diff --git a/gdb/testsuite/gdb.base/dcache-flush.exp b/gdb/testsuite/gdb.base/dcache-flush.exp new file mode 100644 index 00000000000..6c7d2f4bef8 --- /dev/null +++ b/gdb/testsuite/gdb.base/dcache-flush.exp @@ -0,0 +1,64 @@ +# Copyright 2020 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 that the dcache can be flushed. + +standard_testfile + +if { [prepare_for_testing "failed to prepare" ${testfile}] } { + return -1 +} + +if ![runto func] { + return -1 +} + +gdb_test "up" ".* main .*" +gdb_test "p var1" " = 4" +gdb_test "p var2" " = 3" + +# By reading var1 and var2 we should have at least one line in the +# dcache. +gdb_test "info dcache" \ + [multi_line \ + "Dcache $decimal lines of $decimal bytes each." \ + "Contains data for process $decimal" \ + "Line 0: address $hex \[$decimal hits\].*" \ + "Cache state: $decimal active lines, $decimal hits" ] \ + "check dcache before flushing" + +# Flush the dcache. +gdb_test "maint flush dcache" "The dcache was flushed\." + +# Check the dcache is now empty. +gdb_test "info dcache" \ + [multi_line "Dcache $decimal lines of $decimal bytes each." \ + "No data cache available." ] \ + "check dcache after flushing" + +# Read the stack variables again, refilling the dcache. +with_test_prefix "refilling" { + gdb_test "p var1" " = 4" + gdb_test "p var2" " = 3" +} + +# And check we have some content back in the dcache. +gdb_test "info dcache" \ + [multi_line \ + "Dcache $decimal lines of $decimal bytes each." \ + "Contains data for process $decimal" \ + "Line 0: address $hex \[$decimal hits\].*" \ + "Cache state: $decimal active lines, $decimal hits" ] \ + "check dcache before refilling" -- 2.25.4