From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 2NVtGzXl4WL2rBsAWB0awg (envelope-from ) for ; Wed, 27 Jul 2022 21:24:05 -0400 Received: by simark.ca (Postfix, from userid 112) id 6CA751E9ED; Wed, 27 Jul 2022 21:24:05 -0400 (EDT) Authentication-Results: simark.ca; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=DHpVmfVe; dkim-atps=neutral X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-3.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from sourceware.org (server2.sourceware.org [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 B4A271E87E for ; Wed, 27 Jul 2022 21:24:04 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 46CBA385829F for ; Thu, 28 Jul 2022 01:24:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 46CBA385829F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1658971444; bh=MCiDwr3n6bf+mLCGLV1rUL3G54tvNOx7rApdPpLNaPw=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=DHpVmfVeivZ97skkwQyUsOYPDAOFSlc0x7cAh4i09SzgovqP11njuAxfubzpjbm1v pjyy/YtThbDo0rAMZPj6nDcsfOWSge4gbvlr+Kow4bLqlnVdGKfselSKNpK2QANeYW W0ZjHB1tvFCnfNtLCmz4LcgDTwwr7vbMRhSDuQBA= Received: from mail-oi1-x22d.google.com (mail-oi1-x22d.google.com [IPv6:2607:f8b0:4864:20::22d]) by sourceware.org (Postfix) with ESMTPS id 341AC3856DF2 for ; Thu, 28 Jul 2022 01:23:43 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 341AC3856DF2 Received: by mail-oi1-x22d.google.com with SMTP id p132so814633oif.9 for ; Wed, 27 Jul 2022 18:23:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=MCiDwr3n6bf+mLCGLV1rUL3G54tvNOx7rApdPpLNaPw=; b=wvzDRSlJzFCbUXimGdRcr/AU2BDbRi37uzLkR34vG5HD3Qrn9UYC6406FEYfGKvbhg AdAwXT8n8zwhawF9zTE2Fdb/C2SH1q3hZAmf8eDqaHQsv0ECSgpa6FvJ+ejw/kiA+80J Yys2ZeFNNBLUGBSSim9IZEoA+JHlHRlFLcv7MAsosKXTnFG4dwv9LW5PETqDCbR9++5r cryqbJlk96CB2C6Y1Cbj2I1GsARtAfmDzrvEe2sg7SlPVCjCCFjJxHHRK7DZ4VE3INTa CMECNZK5h3NU/9HAC1feQgOOW9YBUoSZt46aCGl6pmyLYo6cZqlZ7Vf1IkPgoYqzIUFl c97A== X-Gm-Message-State: AJIora9s27N+CzicR5GTU+nK1A2ALnqbWk4+GMYYUEnS0KoH8/gGNFCP vK4qexI1AF14VjIdA/GH2X609wzUXSj5CQ== X-Google-Smtp-Source: AGRyM1u/iR9QKmxHSm4lj/0Vq2Wupm2lLfnlC0+5KwdQSqqRgqY/8iYqLB3ZToZpMBpgjx0EEOmJBQ== X-Received: by 2002:a05:6808:1525:b0:33a:9c3f:c2cb with SMTP id u37-20020a056808152500b0033a9c3fc2cbmr3222233oiw.160.1658971422483; Wed, 27 Jul 2022 18:23:42 -0700 (PDT) Received: from localhost ([2804:14d:7e39:8470:40de:7e97:7485:cc8e]) by smtp.gmail.com with ESMTPSA id v40-20020a4a8c6b000000b00435ae9a836asm7878163ooj.15.2022.07.27.18.23.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Jul 2022 18:23:41 -0700 (PDT) To: gdb-patches@sourceware.org Subject: [PATCH 2/2] gdb/testsuite: Add test for AArch64 Scalable Vector Extension Date: Thu, 28 Jul 2022 01:23:06 +0000 Message-Id: <20220728012306.157639-3-thiago.bauermann@linaro.org> X-Mailer: git-send-email 2.37.1 In-Reply-To: <20220728012306.157639-1-thiago.bauermann@linaro.org> References: <20220728012306.157639-1-thiago.bauermann@linaro.org> 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: , From: Thiago Jung Bauermann via Gdb-patches Reply-To: Thiago Jung Bauermann Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" It exercises a bug that GDB previously had where it would lose track of some registers when the inferior changed its vector length. --- gdb/testsuite/gdb.arch/aarch64-sve.c | 61 +++++++++++++++++++ gdb/testsuite/gdb.arch/aarch64-sve.exp | 81 ++++++++++++++++++++++++++ gdb/testsuite/lib/gdb.exp | 4 ++ gdb/testsuite/lib/mi-support.exp | 4 -- 4 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 gdb/testsuite/gdb.arch/aarch64-sve.c create mode 100644 gdb/testsuite/gdb.arch/aarch64-sve.exp diff --git a/gdb/testsuite/gdb.arch/aarch64-sve.c b/gdb/testsuite/gdb.arch/aarch64-sve.c new file mode 100644 index 000000000000..f56a5799a522 --- /dev/null +++ b/gdb/testsuite/gdb.arch/aarch64-sve.c @@ -0,0 +1,61 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2022 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 . */ + +/* Exercise AArch64's Scalable Vector Extension. */ + +/* This test was based on QEMU's sve-ioctls.c test file, which at the time had + the following copyright statement: + + Copyright (c) 2019 Linaro Ltd + + SPDX-License-Identifier: GPL-2.0-or-later */ + +#include +#include +#include + +static int do_sve_ioctl_test(void) +{ + int i, res, init_vl; + + res = prctl(PR_SVE_GET_VL, 0, 0, 0, 0); + if (res < 0) { + printf("FAILED to PR_SVE_GET_VL (%d)", res); + return -1; + } + init_vl = res & PR_SVE_VL_LEN_MASK; + + for (i = init_vl; i > 15; i /= 2) { + printf("Checking PR_SVE_SET_VL=%d\n", i); + res = prctl(PR_SVE_SET_VL, i, 0, 0, 0, 0); /* break here */ + if (res < 0) { + printf("FAILED to PR_SVE_SET_VL (%d)", res); + return -1; + } + } + return 0; +} + +int main(int argc, char **argv) +{ + if (getauxval(AT_HWCAP) & HWCAP_SVE) { + return do_sve_ioctl_test(); + } else { + printf("SKIP: no HWCAP_SVE on this system\n"); + return 1; + } +} diff --git a/gdb/testsuite/gdb.arch/aarch64-sve.exp b/gdb/testsuite/gdb.arch/aarch64-sve.exp new file mode 100644 index 000000000000..5c4a9fa2d770 --- /dev/null +++ b/gdb/testsuite/gdb.arch/aarch64-sve.exp @@ -0,0 +1,81 @@ +# Copyright 2022 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 a binary that uses SVE and exercise SVE-related scenarios. + +if {![is_aarch64_target]} { + verbose "Skipping ${gdb_test_file_name}." + return +} + +standard_testfile +if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { + return +} + +set linespec ${srcfile}:[gdb_get_line_number "break here"] + +if ![runto ${linespec}] { + return +} + +# Count number of lines in "info registers" output. +proc count_info_registers {} { + global gdb_prompt + set ret 0 + + gdb_test_multiple "info registers" "" { + -re ".*$gdb_prompt $" { + set ret [count_newlines $expect_out(buffer)] + } + } + + return ${ret} +} + +# The test executable halves the vector length in a loop, so loop along +# to check it. +set i 0 +while 1 { + incr i + + set lines_before [count_info_registers] + + gdb_test "next" ".*if .res < 0. ." "step over prctl iteration ${i}" + + set lines_after [count_info_registers] + + # There was a bug where GDB would lose track of some registers when the + # vector length changed. Make sure they're still all there. + if {${lines_before} == ${lines_after}} { + pass "same number of registers iteration ${i}" + } else { + fail "same number of registers iteration ${i}" + } + + gdb_test_multiple "continue" "" { + -re ".*Breakpoint $decimal, do_sve_ioctl_test .*$gdb_prompt $" { + # Next iteration. + } + -re "Inferior 1 .* exited normally.*$gdb_prompt $" { + # We're done. + break + } + -re "$gdb_prompt $" { + fail "unexpected output" + break; + } + } +} diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp index a8f25b5f0dd5..3a8b880c074d 100644 --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -7885,6 +7885,10 @@ proc multi_line_input { args } { return [join $args "\n"] } +proc count_newlines { string } { + return [regexp -all "\n" $string] +} + # Return the version of the DejaGnu framework. # # The return value is a list containing the major, minor and patch version diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp index ca56e12b06bf..e821c0f6914f 100644 --- a/gdb/testsuite/lib/mi-support.exp +++ b/gdb/testsuite/lib/mi-support.exp @@ -1728,10 +1728,6 @@ set mi_autotest_data "" # The name of the source file for autotesting. set mi_autotest_source "" -proc count_newlines { string } { - return [regexp -all "\n" $string] -} - # Prepares for running inline tests in FILENAME. # See comments for mi_run_inline_test for detailed # explanation of the idea and syntax.