From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id oRvYL5z1EGngczAAWB0awg (envelope-from ) for ; Sun, 09 Nov 2025 15:12:12 -0500 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=CkcU+I4X; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id BEA361E0BC; Sun, 09 Nov 2025 15:12:12 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-2.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_VALIDITY_CERTIFIED_BLOCKED, RCVD_IN_VALIDITY_RPBL_BLOCKED,RCVD_IN_VALIDITY_SAFE_BLOCKED autolearn=ham autolearn_force=no version=4.0.1 Received: from server2.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 ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id DD7461E04C for ; Sun, 09 Nov 2025 15:12:10 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5809B3858406 for ; Sun, 9 Nov 2025 20:12:10 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 5809B3858406 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=CkcU+I4X Received: from mail-wr1-x430.google.com (mail-wr1-x430.google.com [IPv6:2a00:1450:4864:20::430]) by sourceware.org (Postfix) with ESMTPS id 74D943858C51 for ; Sun, 9 Nov 2025 20:11:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 74D943858C51 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 74D943858C51 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::430 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1762719090; cv=none; b=i6MjKI066MxNcLjfduwQ+V87vPs77IhMhKj4mc/9yafWlM5fsoJ5drYSas+6AH32qJDtohr9JpVZKxEfSqFe0hb/bFoUsT9m8o2nra6PDOoL9hPHkSF1rOsbLA1C2pRfL+vqZTL3wLdE2UMX83gmkouEG/rWkA8q62sfajYd1DU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1762719090; c=relaxed/simple; bh=vQRuEyfK/gBsFcw7f/vgbIA5pObeY/YVW9uTVJg6Xdk=; h=DKIM-Signature:Message-ID:Date:MIME-Version:Subject:To:From; b=bwXBlpfpi9AFZRavLGGgfXj4KwBY4Uu8cY8EwI9sotonKjEd+E7qAGsTFh/fMfYK+IhCXcQBIJEN1LUIchxNVmssG3Ju2NHtAX4wdd6G3o+NjxqLdu7xyR2SoEBFoNVO6tQ78mhnFr5X5z2NDGkwDTrUPtWKaE3rpS6bS/xea7k= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 74D943858C51 Received: by mail-wr1-x430.google.com with SMTP id ffacd0b85a97d-429ce7e79f8so1752704f8f.0 for ; Sun, 09 Nov 2025 12:11:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1762719089; x=1763323889; darn=sourceware.org; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=a2UQxQtU5fVLatYYfCUyL5vvnCqxUzMiR3XVjSfKkEk=; b=CkcU+I4XxiE5yerfkjgjGjfhGP7PH6++02QpHjfQ4RhNhNFbvrb+kdzoVKdHw+I6dF G1N6SsTwme+RYP25EbUzRW8xqceZZREb1xjMUP8u2LQt2kPYgIN/kAFCAqbt/EQwS3Be zMpBxfjp6933CkoqLNk+sLFP9AYXqDjqo2K3z+TBXQoK1LrFA7LeLk1ux1UgBylRnUTb 14S7Qkuz1lp5hNSaTLp83QHzs3kmQsEnt1k4xkg3jt/w/w5tcU1oeKjIRGIg++tkDFl6 Wgtrb9YZuXKBatu58xbBCekkUV4VDGSt0bjw4Gzv9WapByG60+/Fx6oR7cGb6RYryVSj /0oA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1762719089; x=1763323889; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=a2UQxQtU5fVLatYYfCUyL5vvnCqxUzMiR3XVjSfKkEk=; b=mUR64qBEXnJiF5f/SarLOJa/bvIm76Nsid5vlJRgxHAXpe/YoAlP4UxO1N/NN9EI70 uw7AKKhwMNYrvyMwpwtvYFR9KMA7PR25mwVCrUhspixJklH+1NY985ALuQhJcw434gWH NfkqAsUOEeTNajBS54pCHpsSZyk2e69KvF0aCdB583mHd2arf5Y1AKrxFbQuHp25GxMF MzuB5lqXywg5d9NQSJgHkRqvna6pu831f+CqDNRCPjP5eLaVZZsSv0UrE/Dlmb65saET pQZSHS6gcRe+Yq42PPnhjddvk1N0Vx6U1xuYqzYuRAWljdD0lDUFB76Zf6ToiiweVVdF q8Ng== X-Forwarded-Encrypted: i=1; AJvYcCUdypURm80tZOlctLaJeL8g/6iccg5faw67T9g9nOjH4jQB+KFqOHvwMlYED4h6dC7PRpX0iIpcK2wL0g==@sourceware.org X-Gm-Message-State: AOJu0Yx9V0vtEjU1VP1DdnG87CCCkvo2Qvoyl6gcRQ4L46odeibaUXbH yT9S5PNmQyvcVvKfh2+NE1G2ulqC7PHbKwnLVjQO0P1XKD1QqkazyC7zWkVvVbnV X-Gm-Gg: ASbGnctmBLtjKHNfOaqD4rvd3sdGjzyG9sYuWRWKguk+V0zA1br7GtLd8wZ4ZeaBKli mz8nQh95V4y8fl1yC97TqnxzKIYAdVi40LPvh5qQRskYtW78LmovcccMNbBRVWUxSf5p2FCNpTy 2z2APvfd37PzxUZZJOyUojecp4PWDqGRz6F3sf7Zzk7xFO26Z41YWZxB4yBI3KR/B5Twgx3CT3K GeudaJNs7JffpJ4htlEZCG4B6i2yAeZ6NqcZbDY4gjXom0mvw5s6u204Otm/pLe2h2d2t8Ouui7 hvY1Sc1ZfmmGv+ld5D62WuAuutpWsQIRnUcFbLHRYDqVzzpUOxqJfXnZDj0A76G5ejxvsraTSiT kS8VlltbWhga3g/5XUlaDVzbWTHal8G7rXnHtc7tFj+mlZX8+N7etTIsUchXHiTY/+T4kXzVC2M Op2hSwSsZ+tHS10DJ+m4pKNkU= X-Google-Smtp-Source: AGHT+IEl2i96+yvKKJ/GmbvaEGweITqhJHIgtuoU6MqidXhfg9qcgzOGO3JH+XqzcYz+7B/ySKLVeA== X-Received: by 2002:a5d:5848:0:b0:428:4354:aa26 with SMTP id ffacd0b85a97d-42b2dcc0ba7mr5029737f8f.47.1762719088898; Sun, 09 Nov 2025 12:11:28 -0800 (PST) Received: from [192.168.0.38] ([86.12.216.189]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-42ac679214asm19695452f8f.38.2025.11.09.12.11.28 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 09 Nov 2025 12:11:28 -0800 (PST) Message-ID: Date: Sun, 9 Nov 2025 20:11:27 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v4 5/6] gdb/aarch64: Tests for fpmr Content-Language: en-US To: Ezra.Sitorus@arm.com, gdb-patches@sourceware.org References: <20251031151641.83369-1-Ezra.Sitorus@arm.com> <20251031151641.83369-6-Ezra.Sitorus@arm.com> From: Luis In-Reply-To: <20251031151641.83369-6-Ezra.Sitorus@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Hi Ezra, On 31/10/2025 15:16, Ezra.Sitorus@arm.com wrote: > From: Ezra Sitorus > > Add tests for FPMR support in gdb/gdbserver. These tests check > availability of FPMR, reading/writing to FPMR, core file generation and > preservation under sighandler frame unwinding. > > A run of the full gdb testsuite has been done on aarch64-none-linux-gnu > without FPMR support. The gdb.arch tests were run on Shrinkwrap with > FPMR support. > --- > Changes from v1->v2: > * Removed fpmr modification functions to make the tests easier to > follow. > * Test writing to fpmr in aarch64-fpmr.exp from outside the inferior > program. > * Rewrite allow_aarch64_fpmr_tests to follow allow_aarch64_sve_tests. > > Changes from v2->v3: > * tclint: only messages now is for line length for aarch64-fpmr.exp. I > think this is ok as it makes the test string readable. > * Addressed comments/whitespace/formatting issues. > * gdb.exp:allow_aarch64_fpmr_tests reads FPMR in both cases. > > Changes from v3->v4: > * Formatting and comments > * I've tried to fix indentation issues. There's some differences in the > AArch64 tests, and they also don't quite matchup with tclformat which I > used in the previous patch. I've hopefully addressed them this time! > > Ezra > > gdb/testsuite/gdb.arch/aarch64-fpmr-core.c | 40 ++++++ > gdb/testsuite/gdb.arch/aarch64-fpmr-core.exp | 97 ++++++++++++++ > .../gdb.arch/aarch64-fpmr-sighandler.c | 55 ++++++++ > .../gdb.arch/aarch64-fpmr-sighandler.exp | 74 +++++++++++ > gdb/testsuite/gdb.arch/aarch64-fpmr.c | 118 ++++++++++++++++++ > gdb/testsuite/gdb.arch/aarch64-fpmr.exp | 99 +++++++++++++++ > gdb/testsuite/lib/gdb.exp | 66 ++++++++++ > 7 files changed, 549 insertions(+) > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr-core.c > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr-core.exp > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.c > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.exp > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr.c > create mode 100644 gdb/testsuite/gdb.arch/aarch64-fpmr.exp > > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr-core.c b/gdb/testsuite/gdb.arch/aarch64-fpmr-core.c > new file mode 100644 > index 00000000000..045f36b5351 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr-core.c > @@ -0,0 +1,40 @@ > +/* This file is part of GDB, the GNU debugger. > + > + Copyright 2008-2025 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 . */ > + > +#include > + > +uint64_t crash_address = 0; > + > +void > +set_fpmr (uint64_t value) > +{ > + register uint64_t x0_val asm ("x0") = value; > + /* msr fpmr, x0 */ > + __asm__ volatile (".inst 0xd51b4440" : : ); > +} > + > +int > +main (void) > +{ > + set_fpmr (0x3fff7fc049); > + > + /* Check FPMR. */ > + > + *((uint64_t *) crash_address) = 0xDEAD; /* crash point */ > + > + return 1; > +} > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr-core.exp b/gdb/testsuite/gdb.arch/aarch64-fpmr-core.exp > new file mode 100644 > index 00000000000..5ab2072c30f > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr-core.exp > @@ -0,0 +1,97 @@ > +# Copyright (C) 2018-2025 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 . > + > +# This file is part of the gdb testsuite. > + > +# Test generating and reading a core file with FPMR. > + > +proc check_fpmr_core_file {core_filename} { > + # Load the core file. > + if { > + [gdb_test "core $core_filename" \ > + [multi_line \ > + "Core was generated by .*" \ > + "Program terminated with signal SIGSEGV, Segmentation fault\\." \ > + "#0 ${::hex} in main \\(.*\\) at .*" \ > + ".* \\*\\(\\(uint64_t \\*\\) crash_address\\) = 0xDEAD.*"] \ > + "load core file"] > + } { > + untested "failed to generate core file" > + return -1 > + } > + > + # Check the value of FPMR in the core file. > + gdb_test "print/x \$fpmr" " = 0x3fff7fc049" \ > + "fpmr contents from core file" > +} > + > +require is_aarch64_target > +require allow_aarch64_fpmr_tests > + > +standard_testfile > +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { > + return -1 > +} > + > +set binfile [standard_output_file ${testfile}] > + > +if {![runto_main]} { > + return -1 > +} > + > +set crash_breakpoint "crash point" > +gdb_breakpoint [gdb_get_line_number $crash_breakpoint] > +gdb_continue_to_breakpoint $crash_breakpoint > + > +gdb_test "print/x \$fpmr" " = 0x3fff7fc049" "fpmr contents from core file" > + > +gdb_test "continue" \ > + [multi_line \ > + "Program received signal SIGSEGV, Segmentation fault\\." \ > + "${::hex} in main \\(\\).* at .*" \ > + ".* \\*\\(\\(uint64_t \\*\\) crash_address\\) = 0xDEAD.*"] \ > + "run to crash" > + > +# Generate the gcore core file. > +set gcore_filename [standard_output_file "${testfile}.gcore"] > +set gcore_generated [gdb_gcore_cmd "$gcore_filename" "generate gcore file"] > + > +# Generate a native core file. > +set core_filename [core_find ${binfile}] > +set core_generated [expr {$core_filename != ""}] > + > +# At this point we have a couple core files, the gcore one generated by GDB > +# and the native one generated by the Linux Kernel. Make sure GDB can read > +# both correctly. > + > +if {$gcore_generated} { > + clean_restart > + gdb_load ${binfile} > + with_test_prefix "gcore corefile" { > + check_fpmr_core_file $gcore_filename > + } > +} else { > + fail "gcore corefile not generated" > +} > + > +if {$core_generated} { > + clean_restart > + gdb_load ${binfile} > + with_test_prefix "native corefile" { > + check_fpmr_core_file $core_filename > + } > +} else { > + untested "native corefile not generated" > +} > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.c b/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.c > new file mode 100644 > index 00000000000..a561e7654a3 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.c > @@ -0,0 +1,55 @@ > +/* This file is part of GDB, the GNU debugger. > + > + Copyright 2008-2025 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 . */ > + > +#include > +#include > +#include > +#include > + > +void > +set_fpmr (uint64_t value) > +{ > + register uint64_t x0_val asm ("x0") = value; > + /* msr fpmr, x0 */ > + __asm__ volatile (".inst 0xd51b4440" : : ); > +} > + > +void > +handler (int sig) > +{ > + set_fpmr (0xff008041); > + exit (0); > +} > + > +int > +main () > +{ > + /* Ensure no signals are blocked. */ > + sigset_t newset; > + sigemptyset (&newset); > + sigprocmask (SIG_SETMASK, &newset, NULL); > + > + signal (SIGILL, handler); > + > + set_fpmr (0x3fff7fc049); > + > + /* 0x06000000 : Causes an illegal instruction. Value undefined as per ARM > + Architecture Reference Manual ARMv8, Section C4.1. */ > + __asm __volatile (".inst 0x06000000"); > + > + return 0; > +} > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.exp b/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.exp > new file mode 100644 > index 00000000000..ca8f29ec9e4 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr-sighandler.exp > @@ -0,0 +1,74 @@ > +# Copyright 2018-2025 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 . > +# > +# This file is part of the gdb testsuite. > +# > +# Test FPMR register set is properly preserved when unwinding sighandler frames. > + > +require is_aarch64_target > +require allow_aarch64_fpmr_tests > + > +standard_testfile > +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { > + return -1 > +} > + > +if {![runto_main]} { > + return -1 > +} > + > +set reg_main_value "0x3fff7fc049" > +set reg_handler_value "0xff008041" > + > +proc check_fpmr {value} { > + gdb_test "print /x \$fpmr" ".* = {?$value}?" \ > + "check register \$fpmr has value $value" > +} > + > +# Run until end of signal handler. > + > +gdb_test "continue" "Continuing.*Program received signal SIGILL.*" \ > + "continue until signal" > + > +gdb_breakpoint [gdb_get_line_number "exit (0)"] > +gdb_continue_to_breakpoint "exit" ".*exit.*" > + > +set handlerframe [get_current_frame_number] > +set mainframe [expr {$handlerframe + 2}] > + > +# Check register values. > + > +with_test_prefix "handler frame 1st" { > + check_fpmr $reg_handler_value > +} > + > +# Switch to the frame for main (), and check register values. > + > +gdb_test "frame $mainframe" "#$mainframe.*main ().*" \ > + "set to main frame" > + > +with_test_prefix "main frame" { > + check_fpmr $reg_main_value > +} > + > +# Switch back to the signal handler frame, and check register values. > + > +gdb_test "frame $handlerframe" \ > + "#$handlerframe.*handler \\\(sig=4\\\).*" \ > + "set to signal handler frame" > + > +with_test_prefix "handler frame 2nd" { > + check_fpmr $reg_handler_value > +} > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr.c b/gdb/testsuite/gdb.arch/aarch64-fpmr.c > new file mode 100644 > index 00000000000..89298d1c6a8 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr.c > @@ -0,0 +1,118 @@ > +/* This file is part of GDB, the GNU debugger. > + > + Copyright 2008-2025 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 . */ > + > +#include > + > +enum FPM_FORMAT > +{ > + E5M2, > + E4M3, > +}; > + > +enum FPM_OVERFLOW > +{ > + INFNAN, > + SATURATE, > +}; > + > +void > +set_fpmr (uint64_t value) > +{ > + register uint64_t x0_val asm ("x0") = value; > + __asm__ volatile (".inst 0xd51b4440" : : ); > + /* msr fpmr, x0 */ > +} > + > +uint64_t > +modify_src1_fmt (uint64_t fpmr, uint64_t fmt) > +{ > + return (fpmr & ~(0x7)) | (fmt & 0x7); > +} > + > +uint64_t > +modify_src2_fmt (uint64_t fpmr, uint64_t fmt) > +{ > + return (fpmr & ~((0x7) << 3)) | ((fmt & 0x7) << 3); > +} > + > +uint64_t > +modify_dst_fmt (uint64_t fpmr, uint64_t fmt) > +{ > + return (fpmr & ~((0x7) << 6)) | ((fmt & 0x7) << 6); > +} > + > +uint64_t > +modify_osm (uint64_t fpmr, uint64_t overflow) > +{ > + return (fpmr & ~((0x1) << 14)) | ((overflow & 0x1) << 14); > +} > + > +uint64_t > +modify_osc (uint64_t fpmr, uint64_t overflow) > +{ > + return (fpmr & ~((0x1) << 15)) | ((overflow & 0x1) << 15); > +} > + > +uint64_t > +modify_lscale (uint64_t fpmr, uint64_t scale) > +{ > + return (fpmr & ~((0x7f) << 16)) | ((scale & 0x7f) << 16); > +} > + > +uint64_t > +modify_nscale (uint64_t fpmr, uint64_t scale) > +{ > + return (fpmr & ~((0xff) << 24)) | ((scale & 0xff) << 24); > +} > + > +uint64_t > +modify_lscale2 (uint64_t fpmr, uint64_t scale) > +{ > + return (fpmr & ~((uint64_t)(0x3f) << 32)) | ((uint64_t)(scale & 0x3f) << 32); > +} > + > +int > +main (void) > +{ > + uint64_t fpmr = 0; > + > + fpmr = modify_src1_fmt (fpmr, E4M3); > + set_fpmr (fpmr); /* SRC1 */ > + > + fpmr = modify_src2_fmt (fpmr, E4M3); > + set_fpmr (fpmr); /* SRC2 */ > + > + fpmr = modify_dst_fmt (fpmr, E4M3); > + set_fpmr (fpmr); /* DST */ > + > + fpmr = modify_osm (fpmr, SATURATE); > + set_fpmr (fpmr); /* OSM */ > + > + fpmr = modify_osc (fpmr, SATURATE); > + set_fpmr (fpmr); /* OSC */ > + > + fpmr = modify_lscale (fpmr, -1); > + set_fpmr (fpmr); /* LSCALE */ > + > + fpmr = modify_nscale (fpmr, -1); > + set_fpmr (fpmr); /* NSCALE */ > + > + fpmr = modify_lscale2 (fpmr, -1); > + set_fpmr (fpmr); /* LSCALE2 */ > + > + return 1; > +} > diff --git a/gdb/testsuite/gdb.arch/aarch64-fpmr.exp b/gdb/testsuite/gdb.arch/aarch64-fpmr.exp > new file mode 100644 > index 00000000000..142d8172332 > --- /dev/null > +++ b/gdb/testsuite/gdb.arch/aarch64-fpmr.exp > @@ -0,0 +1,99 @@ > +# Copyright 2023-2025 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 reading/writing FPMR when it is present. > + > +require is_aarch64_target > +require allow_aarch64_fpmr_tests > + > +standard_testfile > +if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile}]} { > + return -1 > +} > + > +if {![runto_main]} { > + return -1 > +} > + > +gdb_test_multiple "info register \$fpmr" "Test FPMR SRC1 E5M2" { > + -re ".*\r\n.*\[ \ > + F8S1=E5M2 \ > + F8S2=E5M2 \ > + F8D=E5M2 \ > + OSM=Inf \ > + OSC=Inf/NaN \ > + LSCALE=0 \ > + NSCALE=0 \ > + LSCALE2=0 \]" { > + pass "FPMR SRC1 matches E5M2" > + } > +} > + > +set breakpoints \ > + [list \ > + "SRC1" \ > + "SRC2" \ > + "DST" \ > + "OSM" \ > + "OSC" \ > + "LSCALE" \ > + "NSCALE" \ > + "LSCALE2"] > + > +set reg_values \ > + [list \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E5M2 F8D=E5M2 OSM=Inf OSC=Inf/NaN LSCALE=0 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E5M2 OSM=Inf OSC=Inf/NaN LSCALE=0 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=Inf OSC=Inf/NaN LSCALE=0 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=MaxNormal OSC=Inf/NaN LSCALE=0 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=MaxNormal OSC=MaxNormal LSCALE=0 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=MaxNormal OSC=MaxNormal LSCALE=127 NSCALE=0 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=MaxNormal OSC=MaxNormal LSCALE=127 NSCALE=255 LSCALE2=0 \]" \ > + ".*\r\n.*\[ F8S1=E4M3 F8S2=E4M3 F8D=E4M3 OSM=MaxNormal OSC=MaxNormal LSCALE=127 NSCALE=255 LSCALE2=63 \]"] > + > +set pass_messages \ > + [list \ > + "FPMR SRC1 matches E4M3" \ > + "FPMR SRC2 matches E4M3" \ > + "FPMR DST matches E4M3" \ > + "FPMR OSM matches MaxNormal" \ > + "FPMR OSC matches MaxNormal" \ > + "FPMR LSCALE matches" \ > + "FPMR NSCALE matches" \ > + "FPMR LSCALE2 matches"] > + > +for {set i 0} {$i < 8} {incr i} { > + set bp [lindex $breakpoints $i] > + gdb_breakpoint [gdb_get_line_number $bp] > + gdb_continue_to_breakpoint $bp > + > + gdb_test_multiple "info register \$fpmr" "" { > + -re [lindex $reg_values $i] { > + pass [lindex $pass_messages $i] > + } > + } > +} > + > +gdb_test_multiple "set \$fpmr=0x0" "" { > + -re ".*\r\n.*\[ F8S1=E5M2 F8S2=E5M2 F8D=E5M2 OSM=Inf OSC=Inf/NaN LSCALE=0 NSCALE=0 LSCALE2=0 \]" { > + pass "Reset FPMR to 0 from GDB" > + } > +} > + > +gdb_test_multiple "set \$fpmr=0x3f007f4008" "" { > + -re ".*\r\n.*\[ F8S1=E5M2 F8S2=E4M3 F8D=E5M2 OSM=MaxNormal OSC=Inf/NaN LSCALE=127 NSCALE=0 LSCALE2=63 \]" { > + pass "Write to FPMR from GDB" > + } > +} > diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp > index 930462f63fa..cdb6ccdfa35 100644 > --- a/gdb/testsuite/lib/gdb.exp > +++ b/gdb/testsuite/lib/gdb.exp > @@ -5201,6 +5201,72 @@ proc aarch64_supports_sme_svl { length } { > return 1 > } > > +# Run a test on the target to see if it supports the AArch64 FPMR feature. > +# Return 1 if so, 0 if it does not. Note this causes a restart of GDB. > + > +gdb_caching_proc allow_aarch64_fpmr_tests {} { > + global srcdir subdir gdb_prompt inferior_exited_re > + > + set me "allow_aarch64_fpmr_tests" > + > + if { ![is_aarch64_target]} { > + return 0 > + } > + > + set compile_flags "{additional_flags=-march=armv8-a}" > + > + # Compile a test program reading FPMR. > + set src { > + int main() { > + asm volatile ("mrs x0, fpmr"); > + return 0; > + } > + } > + if {![gdb_simple_compile $me $src executable $compile_flags]} { > + # Try again, but with a raw hex instruction so we don't rely on > + # assembler support for FPMR. > + > + set compile_flags "{additional_flags=-march=armv8-a}" > + > + # Compile a test program reading FPMR. > + set src { > + int main() { > + asm volatile (".word 0xD53B4440"); > + return 0; > + } > + } > + > + if {![gdb_simple_compile $me $src executable $compile_flags]} { > + return 0 > + } > + } > + > + # Compilation succeeded so now run it via gdb. > + clean_restart > + gdb_load $obj > + gdb_run_cmd > + > + gdb_expect { > + -re ".*Illegal instruction.*${gdb_prompt} $" { > + verbose -log "\n$me fpmr support not detected" > + set allow_fpmr_tests 0 > + } > + -re ".*$inferior_exited_re normally.*${gdb_prompt} $" { > + verbose -log "\n$me: fpmr support detected" > + set allow_fpmr_tests 1 > + } > + default { > + warning "\n$me: default case taken" > + set allow_fpmr_tests 0 > + } > + } > + gdb_exit > + remote_file build delete $obj > + > + verbose "$me: returning $allow_fpmr_tests" 2 > + return $allow_fpmr_tests > +} > + > # Run a test on the target to see if it supports AArch64 MOPS (Memory > # Operations) extensions. Return 1 if so, 0 if it does not. Note this > # causes a restart of GDB. Thanks! This is OK. Approved-By: Luis Machado