From patchwork Mon Apr 4 09:06:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 558437 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9AA92C433F5 for ; Mon, 4 Apr 2022 09:06:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1347958AbiDDJI1 (ORCPT ); Mon, 4 Apr 2022 05:08:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34604 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244472AbiDDJIZ (ORCPT ); Mon, 4 Apr 2022 05:08:25 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2C1F93B01F for ; Mon, 4 Apr 2022 02:06:30 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id D6E3DB80A29 for ; Mon, 4 Apr 2022 09:06:28 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 13D88C340F3; Mon, 4 Apr 2022 09:06:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649063187; bh=8vVvI2qZ+WS2PpGgoEgf6Xhiefrm6qpFKgw1EK5Sp1U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BJGod9ZA8tWmPgrlmYbxPCt70Ze/NW5aw5mLQpEM6fkB2i4SyThfh03X+cQvz9Djn RgwPPMRvRqb1mU1+EZR2KJUChxqIw7od6ASPZRE2EiOIQy3qZ94ymhS0pgrTOUBCPP R9wUfLPVsIIsx7L97xFG7wjnogMTuydmkOnr/+z3x49AtTin879SZ6m2yhvpYG2dVG rZS1x8dYiZrAG0vMWnAeGhLd1DTqW6uDnWOiB//hHJ6ca0abQ52Q/NqdCnX7H4kF4R iUWcp29md5XbE8kTPXgu6QyqXte+nRJXh9D/9UAW4z74DVHzDyjAloKElFpcxLwjxc KlgOVPz+u4Ulg== From: Mark Brown To: Catalin Marinas , Will Deacon , Shuah Khan , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, Mark Brown Subject: [PATCH v2 1/3] kselftest/arm64: Fix comment for ptrace_sve_get_fpsimd_data() Date: Mon, 4 Apr 2022 10:06:11 +0100 Message-Id: <20220404090613.181272-2-broonie@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220404090613.181272-1-broonie@kernel.org> References: <20220404090613.181272-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=947; h=from:subject; bh=8vVvI2qZ+WS2PpGgoEgf6Xhiefrm6qpFKgw1EK5Sp1U=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBiSrUAO+w0M52wR5OGcu7Rb9aMmx7Vhd+DLVQSaszX 8TQxkxaJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYkq1AAAKCRAk1otyXVSH0G9gB/ 0WaFJ3qS5yRT+KGo662sL7pUHtaJaYDRxATCFDfeGl5s5TiOvlXskz8L8eE5smmIYtQuMb1NDi0hTI ChSdeK9xHZlftnoZiKAmaVpYDR4pzHaBc+hGTIrrpW5f8w2OoqRFCEycESmDZqBKBizWq6h3f/d2o4 j9sZ4BG0J4SlXzH38L5n0GNq86jpbFwunEO55ADwUM1iZhO0/QBRjDuha70W7vaUgwbKLD0+9+WYzR kAN94NxC0t/pwODpjp4oAq26zuv8F+kHmNBqx/m4Y5620bMmSByfh2R0iJptzdT1EYB1BqHdjIxqpp Pke/9CnB+porkbmg01KEkt4qVQk1Lh X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org The comment for ptrace_sve_get_fpsimd_data() doesn't describe what the test does at all, fix that. Signed-off-by: Mark Brown Reviewed-by: Shuah Khan --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/selftests/arm64/fp/sve-ptrace.c index 4c418b2021e0..7682798adbba 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -395,7 +395,7 @@ static void ptrace_set_sve_get_sve_data(pid_t child, free(write_buf); } -/* Validate attempting to set SVE data and read SVE data */ +/* Validate attempting to set SVE data and read it via the FPSIMD regset */ static void ptrace_set_sve_get_fpsimd_data(pid_t child, const struct vec_type *type, unsigned int vl) From patchwork Mon Apr 4 09:06:12 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 556111 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7EC0DC4332F for ; Mon, 4 Apr 2022 09:06:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1349477AbiDDJIa (ORCPT ); Mon, 4 Apr 2022 05:08:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1346223AbiDDJI0 (ORCPT ); Mon, 4 Apr 2022 05:08:26 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B24A63BA61 for ; Mon, 4 Apr 2022 02:06:30 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 3C96761252 for ; Mon, 4 Apr 2022 09:06:30 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1843FC34112; Mon, 4 Apr 2022 09:06:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649063189; bh=a4jTOkRQpJP6+3na2bi7YpmqAd5XXyn7buPNcfTQ1WE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=j+oZlCxkNMpQKAOlHkdZnT0qUTDjKnqAtPys0wFfICS44T/k13Sn04Y9D7X7rf1Jj uLm4+P/yEOY8B/OJUNrEt74ZRR9SOpKMYUa6ZuCMJJW4zqNcNNzF0t6L77HpFTZrqX melQuKI5XgKk55kFjjK4JZFkIh+DyDdWaoOsvVAXdY5zrxdMA0pORVqfYCVjUwoxgX pky/ZCnH3eehRFOmhOCWbgiJ8c/DhpHqCBORBQd2iSorHd+JFk7STVafOVvfTyJS8n K4wr8aM9JOFdMSAVNR8OO2l0XG/UJzJiLBhRKqO4xVN+OU5MLsyiGsdpwsmEvpdGEh C/+ac37sI5MLQ== From: Mark Brown To: Catalin Marinas , Will Deacon , Shuah Khan , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, Mark Brown Subject: [PATCH v2 2/3] kselftest/arm64: Remove assumption that tasks start FPSIMD only Date: Mon, 4 Apr 2022 10:06:12 +0100 Message-Id: <20220404090613.181272-3-broonie@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220404090613.181272-1-broonie@kernel.org> References: <20220404090613.181272-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3717; h=from:subject; bh=a4jTOkRQpJP6+3na2bi7YpmqAd5XXyn7buPNcfTQ1WE=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBiSrUB2Yj2qaE22cbeGjQpnhdqs87ucVV8by5rRUVN s+bZuxeJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYkq1AQAKCRAk1otyXVSH0HcIB/ 4yo8lPRrVzFAnelE/fFyAoL2rrArx3J0hwCcyOQxZ2fvarKxUmanOohVVqVg1daP9WZ4QMi5tXIqlm 6yHjjC8eFZk+DV/W4HgtIvrV/NQE7fYFdvVlFf+V0PpM9F5DJIUA4IvEVIQ0S8ivqcXKUNk+w0ocHG 3QrKZlrc5bsMWIrv45btKR23PkO6ofQJvyhoymbqUOJcaPhto/h72phiRfvkRshUp7X7iYiY6cHKeT RsupYZfwP5YvfxcAiJljTXSCt0DmE3udxeuXxE90kGm7vdAsa9S99i/iWfYTdz1BD0GzgWN8yCwsOY YKRf5vlPn5T8x8JxRFcgFvybJpYKrM X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Currently the sve-ptrace test for setting and reading FPSIMD data assumes that the child will start off in FPSIMD only mode and that it can use this to read some FPSIMD mode SVE ptrace data, skipping the test if it can't. This isn't an assumption guaranteed by the ABI and also limits how we can use this testcase within the program. Instead skip the initial read and just generate a FPSIMD format buffer for the write part of the test, making the coverage more robust in the face of future kernel and test program changes. Signed-off-by: Mark Brown Reviewed-by: Shuah Khan --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 39 ++++++++----------- 1 file changed, 16 insertions(+), 23 deletions(-) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/selftests/arm64/fp/sve-ptrace.c index 7682798adbba..8f6146d89ca4 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -46,7 +46,7 @@ static const struct vec_type vec_types[] = { #define VL_TESTS (((SVE_VQ_MAX - SVE_VQ_MIN) + 1) * 3) #define FLAG_TESTS 2 -#define FPSIMD_TESTS 3 +#define FPSIMD_TESTS 2 #define EXPECTED_TESTS ((VL_TESTS + FLAG_TESTS + FPSIMD_TESTS) * ARRAY_SIZE(vec_types)) @@ -240,28 +240,24 @@ static void check_u32(unsigned int vl, const char *reg, /* Access the FPSIMD registers via the SVE regset */ static void ptrace_sve_fpsimd(pid_t child, const struct vec_type *type) { - void *svebuf = NULL; - size_t svebufsz = 0; + void *svebuf; struct user_sve_header *sve; struct user_fpsimd_state *fpsimd, new_fpsimd; unsigned int i, j; unsigned char *p; + int ret; - /* New process should start with FPSIMD registers only */ - sve = get_sve(child, type, &svebuf, &svebufsz); - if (!sve) { - ksft_test_result_fail("get_sve(%s): %s\n", - type->name, strerror(errno)); - + svebuf = malloc(SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD)); + if (!svebuf) { + ksft_test_result_fail("Failed to allocate FPSIMD buffer\n"); return; - } else { - ksft_test_result_pass("get_sve(%s FPSIMD)\n", type->name); } - ksft_test_result((sve->flags & SVE_PT_REGS_MASK) == SVE_PT_REGS_FPSIMD, - "Got FPSIMD registers via %s\n", type->name); - if ((sve->flags & SVE_PT_REGS_MASK) != SVE_PT_REGS_FPSIMD) - goto out; + memset(svebuf, 0, SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD)); + sve = svebuf; + sve->flags = SVE_PT_REGS_FPSIMD; + sve->size = SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD); + sve->vl = 16; /* We don't care what the VL is */ /* Try to set a known FPSIMD state via PT_REGS_SVE */ fpsimd = (struct user_fpsimd_state *)((char *)sve + @@ -273,12 +269,11 @@ static void ptrace_sve_fpsimd(pid_t child, const struct vec_type *type) p[j] = j; } - if (set_sve(child, type, sve)) { - ksft_test_result_fail("set_sve(%s FPSIMD): %s\n", - type->name, strerror(errno)); - + ret = set_sve(child, type, sve); + ksft_test_result(ret == 0, "%s FPSIMD set via SVE: %d\n", + type->name, ret); + if (ret) goto out; - } /* Verify via the FPSIMD regset */ if (get_fpsimd(child, &new_fpsimd)) { @@ -548,11 +543,9 @@ static int do_parent(pid_t child) if (getauxval(vec_types[i].hwcap_type) & vec_types[i].hwcap) { ptrace_sve_fpsimd(child, &vec_types[i]); } else { - ksft_test_result_skip("%s FPSIMD get via SVE\n", - vec_types[i].name); ksft_test_result_skip("%s FPSIMD set via SVE\n", vec_types[i].name); - ksft_test_result_skip("%s set read via FPSIMD\n", + ksft_test_result_skip("%s FPSIMD read\n", vec_types[i].name); } From patchwork Mon Apr 4 09:06:13 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Brown X-Patchwork-Id: 558436 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 06100C43217 for ; Mon, 4 Apr 2022 09:06:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1346223AbiDDJIb (ORCPT ); Mon, 4 Apr 2022 05:08:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34660 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244472AbiDDJIa (ORCPT ); Mon, 4 Apr 2022 05:08:30 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [IPv6:2604:1380:4601:e00::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A10A53BA61 for ; Mon, 4 Apr 2022 02:06:34 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id F26CFB80A29 for ; Mon, 4 Apr 2022 09:06:32 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1A9AEC34110; Mon, 4 Apr 2022 09:06:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1649063191; bh=hTDQKdT5F+BSqNgIL8TDune/CjD4xt6fI7FgizPNL8s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fmzU7FEw7uuym8slJe0LEQqyYRffg0fdN2H2KiLQ4CfkSVykotSnB3MD/1LII2GF3 5J5OZVKra8JDvJeaNhFS3jJvNNHsi7suvDD3nzLCH7/c6/2wZQiu7hq8eEiNS3dles ACqgn4WgQsd6A1LRzQtzgt2NMTbyb0y0Va+k7qVLgxQWpXS80FdFyVt+tiULbykw4N o6gyOG3jY78ofcTbnUfQdoD7lkJBYAvCi+qNpXxn4uYTR13Z5ezKfX49pFO18iVGYZ PB2QEqYbDGzqsbLXF02zTl6wU1Imqrv2tyfYnZZZEZrmHlvr1mT5cY1nRRmHXTELBa lacXm8BFYRbiA== From: Mark Brown To: Catalin Marinas , Will Deacon , Shuah Khan , Shuah Khan Cc: linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, Mark Brown Subject: [PATCH v2 3/3] kselftest/arm64: Validate setting via FPSIMD and read via SVE regsets Date: Mon, 4 Apr 2022 10:06:13 +0100 Message-Id: <20220404090613.181272-4-broonie@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220404090613.181272-1-broonie@kernel.org> References: <20220404090613.181272-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=5398; h=from:subject; bh=hTDQKdT5F+BSqNgIL8TDune/CjD4xt6fI7FgizPNL8s=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBiSrUCAAFyUwM2l4gYv+3Nl9h/gjOV+NbsLBXSDTCf vbbfb0mJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCYkq1AgAKCRAk1otyXVSH0ElKB/ 4+4V7CCjSl2PBIcIKS55ucQ+RxOmWPp4iUYtSjOWmiFkLFvV+8IzXFPZ6Ra5SuGMv/vyVCb7YJU1xA EddLXPxWl6v7UfDWu3oZXJkULGOMTnlqtJ/zveugOK7LDX8AQLKVZTtT49DQSQdOJcWkUs48LVMR7a cY7OAT8H0VI33dlbDPtXv9BNJtE7qaSvTT1+F3iqdZMyHQporQr/AmhOXkW2FGocbTapGZ5oftipPD NvabGA6Hb/H2VnbCw4GGHoFg2YZ/QOSm5a+7rRrNiwzsx5CpVzMq8UeGdmqVIB+0EWzq4FZHyh+pcK 47S9QKgu1O6bOXTz/A3OaGI9pIxRBi X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Precedence: bulk List-ID: X-Mailing-List: linux-kselftest@vger.kernel.org Currently we validate that we can set the floating point state via the SVE regset and read the data via the FPSIMD regset but we do not valiate that the opposite case works as expected. Add a test that covers this case, noting that when reading via SVE regset the kernel has the option of returning either SVE or FPSIMD data so we need to accept both formats. Signed-off-by: Mark Brown Reviewed-by: Shuah Khan --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 123 +++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/selftests/arm64/fp/sve-ptrace.c index 8f6146d89ca4..36b6f0749f23 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -44,7 +44,7 @@ static const struct vec_type vec_types[] = { }, }; -#define VL_TESTS (((SVE_VQ_MAX - SVE_VQ_MIN) + 1) * 3) +#define VL_TESTS (((SVE_VQ_MAX - SVE_VQ_MIN) + 1) * 4) #define FLAG_TESTS 2 #define FPSIMD_TESTS 2 @@ -78,6 +78,15 @@ static int get_fpsimd(pid_t pid, struct user_fpsimd_state *fpsimd) return ptrace(PTRACE_GETREGSET, pid, NT_PRFPREG, &iov); } +static int set_fpsimd(pid_t pid, struct user_fpsimd_state *fpsimd) +{ + struct iovec iov; + + iov.iov_base = fpsimd; + iov.iov_len = sizeof(*fpsimd); + return ptrace(PTRACE_SETREGSET, pid, NT_PRFPREG, &iov); +} + static struct user_sve_header *get_sve(pid_t pid, const struct vec_type *type, void **buf, size_t *size) { @@ -473,6 +482,115 @@ static void ptrace_set_sve_get_fpsimd_data(pid_t child, free(write_buf); } +/* Validate attempting to set FPSIMD data and read it via the SVE regset */ +static void ptrace_set_fpsimd_get_sve_data(pid_t child, + const struct vec_type *type, + unsigned int vl) +{ + void *read_buf = NULL; + unsigned char *p; + struct user_sve_header *read_sve; + unsigned int vq = sve_vq_from_vl(vl); + struct user_fpsimd_state write_fpsimd; + int ret, i, j; + size_t read_sve_size = 0; + size_t expected_size; + int errors = 0; + + if (__BYTE_ORDER == __BIG_ENDIAN) { + ksft_test_result_skip("Big endian not supported\n"); + return; + } + + for (i = 0; i < 32; ++i) { + p = (unsigned char *)&write_fpsimd.vregs[i]; + + for (j = 0; j < sizeof(write_fpsimd.vregs[i]); ++j) + p[j] = j; + } + + ret = set_fpsimd(child, &write_fpsimd); + if (ret != 0) { + ksft_test_result_fail("Failed to set FPSIMD state: %d\n)", + ret); + return; + } + + if (!get_sve(child, type, (void **)&read_buf, &read_sve_size)) { + ksft_test_result_fail("Failed to read %s VL %u data\n", + type->name, vl); + return; + } + read_sve = read_buf; + + if (read_sve->vl != vl) { + ksft_test_result_fail("Child VL != expected VL %d\n", + read_sve->vl, vl); + goto out; + } + + /* The kernel may return either SVE or FPSIMD format */ + switch (read_sve->flags & SVE_PT_REGS_MASK) { + case SVE_PT_REGS_FPSIMD: + expected_size = SVE_PT_FPSIMD_SIZE(vq, SVE_PT_REGS_FPSIMD); + if (read_sve_size < expected_size) { + ksft_test_result_fail("Read %d bytes, expected %d\n", + read_sve_size, expected_size); + goto out; + } + + ret = memcmp(&write_fpsimd, read_buf + SVE_PT_FPSIMD_OFFSET, + sizeof(write_fpsimd)); + if (ret != 0) { + ksft_print_msg("Read FPSIMD data mismatch\n"); + errors++; + } + break; + + case SVE_PT_REGS_SVE: + expected_size = SVE_PT_SVE_SIZE(vq, SVE_PT_REGS_SVE); + if (read_sve_size < expected_size) { + ksft_test_result_fail("Read %d bytes, expected %d\n", + read_sve_size, expected_size); + goto out; + } + + for (i = 0; i < __SVE_NUM_ZREGS; i++) { + __uint128_t tmp = 0; + + /* + * Z regs are stored endianness invariant, this won't + * work for big endian + */ + memcpy(&tmp, read_buf + SVE_PT_SVE_ZREG_OFFSET(vq, i), + sizeof(tmp)); + + if (tmp != write_fpsimd.vregs[i]) { + ksft_print_msg("Mismatch in FPSIMD for %s VL %u Z%d/V%d\n", + type->name, vl, i, i); + errors++; + } + } + + check_u32(vl, "FPSR", &write_fpsimd.fpsr, + read_buf + SVE_PT_SVE_FPSR_OFFSET(vq), &errors); + check_u32(vl, "FPCR", &write_fpsimd.fpcr, + read_buf + SVE_PT_SVE_FPCR_OFFSET(vq), &errors); + break; + default: + ksft_print_msg("Unexpected regs type %d\n", + read_sve->flags & SVE_PT_REGS_MASK); + errors++; + break; + } + + ksft_test_result(errors == 0, "Set FPSIMD, read via SVE for %s VL %u\n", + type->name, vl); + +out: + free(read_buf); +} + static int do_parent(pid_t child) { int ret = EXIT_FAILURE; @@ -578,11 +696,14 @@ static int do_parent(pid_t child) if (vl_supported) { ptrace_set_sve_get_sve_data(child, &vec_types[i], vl); ptrace_set_sve_get_fpsimd_data(child, &vec_types[i], vl); + ptrace_set_fpsimd_get_sve_data(child, &vec_types[i], vl); } else { ksft_test_result_skip("%s set SVE get SVE for VL %d\n", vec_types[i].name, vl); ksft_test_result_skip("%s set SVE get FPSIMD for VL %d\n", vec_types[i].name, vl); + ksft_test_result_skip("%s set FPSIMD get SVE for VL %d\n", + vec_types[i].name, vl); } } }