From nobody Sat Oct 4 03:17:46 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47F5627B328; Wed, 20 Aug 2025 18:29:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714571; cv=none; b=eeq1Uk67prwBedAgzfkIzy0JcGv7OniRjwN4zhWPFstuigo1FaPiIGE6X1nBey4OU+zTEiRU++w1CDOaR5t25pnlv2zUXi2nkJP9op5CXZ/UW3YmIzr3QeeE3yDKLzilVHmQX4h8gIdrTy50VbXT02qx09j2/kzDuRjKJxyI3xw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714571; c=relaxed/simple; bh=xFa+NeJG2jF6wE7Joj16Oc51n2//5XUYYYZ0eG8q3lU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EnuHZsWCfi12acbn0nOpGtixhmTeOHbJrVKM2jOMUFbS6p+9tryittjXWStcMPxjvFlGcpuPHPxhYY5Tqvj8uChQhZ5ld3tdcOQxAfJCmaFS2yJTr+/oUH87rAxMVYYDPHqZMlCzUruFbUAv6nsfJjMZxxYjm/wdbh8IhI+CHe8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=L/E5hUdy; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="L/E5hUdy" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3F287C116B1; Wed, 20 Aug 2025 18:29:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755714570; bh=xFa+NeJG2jF6wE7Joj16Oc51n2//5XUYYYZ0eG8q3lU=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=L/E5hUdy/Zq7DwlSV0lPuwRI4qKR/gShAYBuHGCXtWSw1T+zi3r4KS/3B3e9ZKCuZ Lu6er1KZgxXNzYBURZeBKIMtXwAAZTnpwv6K8fop1co5id4aR+W/s2WVibsyXdLFmQ cHhv2l+O3IyvE0NFtWnRNwOH+uY7jRnIURC6wSFe047cetUW+W8YwQeu3CMhTuqSVd OePOrOfoH4nn9KXTrR5S+AXxd9fKu88FheFdmfxzUdDSt1+LNU0btTkDI4ACpJ03mG RqeOlQAOHKADvzKpES6vvcX4mTsUM15tvGPX7CNFuWZ+aNBhtuaMte7JznQNFRNwip +cEcPTGiCUTHQ== From: Mark Brown Date: Wed, 20 Aug 2025 19:29:03 +0100 Subject: [PATCH 1/5] kselftest/arm64: Verify that we reject out of bounds VLs in sve-ptrace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-arm64-sme-ptrace-sme-only-v1-1-f7c22b2871f8@kernel.org> References: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> In-Reply-To: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> To: Catalin Marinas , Will Deacon , Shuah Khan , Jonathan Corbet , Oleg Nesterov Cc: Mark Rutland , David Spickett , Thiago Jung Bauermann , Luis Machado , linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=2329; i=broonie@kernel.org; h=from:subject:message-id; bh=xFa+NeJG2jF6wE7Joj16Oc51n2//5XUYYYZ0eG8q3lU=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBophQBBnrnyJoBRFW07hBrEL9iNoVV/fdd5wyni /xIOYEjiUWJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaKYUAQAKCRAk1otyXVSH 0PvRB/9HIoad8JkWcAcMr/vzFQGFNApVF/Y7Cxbekiy2xFDCnzN5ih7L//v6ELI/8AqffCg8lkG XGBWKHeOkxxLwgd1ZluEFrH3NmdwvvGJbsuGaryl4oqje3yoaLtOJo6Dq0AI2/f45CY8JNRdwcA 2+WIlTGpFcy4ikG0o/jBeoMd7k5WNsmU7Tl4cB6l1s/gXmdY2pHzg8S5SsJKuY/j86aUQ1UREo+ VVqoaZ37uymnkTgcVFcOGxGyYCwXQd1ejXjEfYKQi3V7ADTlJoh9k7pKJOcJ44kgSNGVmaSyPCc NMDy7iHNt0auoOQveAajjJ1ADUmHNfguB10Eyc1SEV7eHG6O X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB We do not currently have a test that asserts that we reject attempts to set a vector length smaller than SVE_VL_MIN or larger than SVE_VL_MAX, add one since that is our current behaviour. Signed-off-by: Mark Brown --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 32 +++++++++++++++++++++++= +++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/= selftests/arm64/fp/sve-ptrace.c index b22303778fb0..a9b2377c46b8 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -66,7 +66,7 @@ static const struct vec_type vec_types[] =3D { }; =20 #define VL_TESTS (((TEST_VQ_MAX - SVE_VQ_MIN) + 1) * 4) -#define FLAG_TESTS 2 +#define FLAG_TESTS 4 #define FPSIMD_TESTS 2 =20 #define EXPECTED_TESTS ((VL_TESTS + FLAG_TESTS + FPSIMD_TESTS) * ARRAY_SIZ= E(vec_types)) @@ -270,6 +270,25 @@ static void check_u32(unsigned int vl, const char *reg, } } =20 +/* Set out of range VLs */ +static void ptrace_set_vl_ranges(pid_t child, const struct vec_type *type) +{ + struct user_sve_header sve; + int ret; + + memset(&sve, 0, sizeof(sve)); + sve.flags =3D SVE_PT_REGS_SVE; + sve.size =3D sizeof(sve); + + ret =3D set_sve(child, type, &sve); + ksft_test_result(ret !=3D 0, "%s Set invalid VL 0\n", type->name); + + sve.vl =3D SVE_VL_MAX + SVE_VQ_BYTES; + ret =3D set_sve(child, type, &sve); + ksft_test_result(ret !=3D 0, "%s Set invalid VL %d\n", type->name, + SVE_VL_MAX + SVE_VQ_BYTES); +} + /* Access the FPSIMD registers via the SVE regset */ static void ptrace_sve_fpsimd(pid_t child, const struct vec_type *type) { @@ -703,6 +722,17 @@ static int do_parent(pid_t child) vec_types[i].name); } =20 + /* Setting out of bounds VLs should fail */ + if (getauxval(vec_types[i].hwcap_type) & vec_types[i].hwcap) { + ptrace_set_vl_ranges(child, &vec_types[i]); + } else { + ksft_test_result_skip("%s Set invalid VL 0\n", + vec_types[i].name); + ksft_test_result_skip("%s Set invalid VL %d\n", + vec_types[i].name, + SVE_VL_MAX + SVE_VQ_BYTES); + } + /* Step through every possible VQ */ for (vq =3D SVE_VQ_MIN; vq <=3D TEST_VQ_MAX; vq++) { vl =3D sve_vl_from_vq(vq); --=20 2.39.5 From nobody Sat Oct 4 03:17:46 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 12D6427B332; Wed, 20 Aug 2025 18:29:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714574; cv=none; b=jrz/7sbnYUe6fhjL0Th7xTg3AFfdil9cT3hE2O9Iwru51pppFj+L9wr3aS7xaePslQUDaAt2wgLFknnZuqgA0NhsjNBu+iHxSs5YCEZbPf7TL2x1jzrfPs6sz0PIwuBpmNF+4NP2E7FKblxYcM1kSMNXEG+/3OGuSEnYRdP1QW8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714574; c=relaxed/simple; bh=OMuQjCF+LEZgzxsBMcsJNa9yV1ZyVyIxF/02RSfwA9w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rIz1uknG7VTdLG6UHniV3JcSCyYHrmoPhtKFg8wDpM7uFhtj4Xpk//gd524PBF31coIPuMYa/ijYJJhvQKyo1OHEg8NXZZwqp6KUdHCX1qvAookv16asyZWFPJo1eraHk5XkllHmY3bdu5xn81DdwDXf7J/9uAg5yySB8FCkiiE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=OhBmXqQL; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="OhBmXqQL" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 35B4AC113CF; Wed, 20 Aug 2025 18:29:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755714573; bh=OMuQjCF+LEZgzxsBMcsJNa9yV1ZyVyIxF/02RSfwA9w=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=OhBmXqQL69XWfsGVFWp2pL/cMtfurNw6+7j363cugbyi8aJf+ZqZm+iHOy1eKLZn2 8QRQu7MxHqvJDgmu7QoxZ0WsPicOVAch51AjpUW/ZecIYUfeS+LcciVcglsrT04m64 gClvL9u+u1cr/1wtBQboezre3jeoVqzMJPrOz9d/9ZRQgbdUo63s+4YiawIzgaMME4 0zUEV1WfvWVYeQuXuvbNLTRBc53PxTE93gL8QTYDV46U14N2JeCnGA+9LMqRTx9u9L bDmMU8EqTuZ19PGO4lMvPCTgi/O4H3rymQppPdZfvW/BatIyg14RonP8G7NJf6QCT4 ls007xoMEHJOw== From: Mark Brown Date: Wed, 20 Aug 2025 19:29:04 +0100 Subject: [PATCH 2/5] kselftest/arm64: Check that unsupported regsets fail in sve-ptrace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-arm64-sme-ptrace-sme-only-v1-2-f7c22b2871f8@kernel.org> References: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> In-Reply-To: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> To: Catalin Marinas , Will Deacon , Shuah Khan , Jonathan Corbet , Oleg Nesterov Cc: Mark Rutland , David Spickett , Thiago Jung Bauermann , Luis Machado , linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=2392; i=broonie@kernel.org; h=from:subject:message-id; bh=OMuQjCF+LEZgzxsBMcsJNa9yV1ZyVyIxF/02RSfwA9w=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBophQBEDrSy5gbCqYmjEOVsYPzA4r4WdGUBR02Q RVoZ08qRU+JATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaKYUAQAKCRAk1otyXVSH 0LFHB/oC7r5NmS8rvezdaqGX2+jaZs1ybK8ILWXxbmD+IDd6cmq1X8uUwnciGXVu22tSN9cG/Wq 3KWsSiqlDjt1kXrsRDAzETo67WqYE7X7J0+Dk+trnLio0RCAhEaKImXWuOJ4x8aZLHSer9ighDu ehY4ZcFL1aRkV/BGAgDvHGxf4HBSJp4jzcyGx4PH1Z4ImeCyNvTgAVSr8ou9CbuRzLvWj8os9B6 iQrDaF3OxR+AaeZ4MbstnNh0o8ZMCODMfiek2GRRBhgYfNyP/TmPzOdygh1JvY976Bp2sM74AT0 9onIDfm5+mSUwp7qBm7f4QbxWhEtVqO8dtOseV4qykTrTeua X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Add a test which verifies that NT_ARM_SVE and NT_ARM_SSVE reads and writes are rejected as expected when the relevant architecture feature is not supported. Signed-off-by: Mark Brown --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 46 +++++++++++++++++++++++= ++++ 1 file changed, 46 insertions(+) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/= selftests/arm64/fp/sve-ptrace.c index a9b2377c46b8..5f39ca0b4194 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -158,6 +158,38 @@ static int set_sve(pid_t pid, const struct vec_type *t= ype, return ptrace(PTRACE_SETREGSET, pid, type->regset, &iov); } =20 +/* A read operation fails */ +static void read_fails(pid_t child, const struct vec_type *type) +{ + struct user_sve_header *new_sve =3D NULL; + size_t new_sve_size =3D 0; + void *ret; + + ret =3D get_sve(child, type, (void **)&new_sve, &new_sve_size); + + ksft_test_result(ret =3D=3D NULL, "%s unsupported read fails\n", + type->name); + + free(new_sve); +} + +/* A write operation fails */ +static void write_fails(pid_t child, const struct vec_type *type) +{ + struct user_sve_header sve; + int ret; + + /* Just the header, no data */ + memset(&sve, 0, sizeof(sve)); + sve.size =3D sizeof(sve); + sve.flags =3D SVE_PT_REGS_SVE; + sve.vl =3D SVE_VL_MIN; + ret =3D set_sve(child, type, &sve); + + ksft_test_result(ret !=3D 0, "%s unsupported write fails\n", + type->name); +} + /* Validate setting and getting the inherit flag */ static void ptrace_set_get_inherit(pid_t child, const struct vec_type *typ= e) { @@ -702,6 +734,20 @@ static int do_parent(pid_t child) } =20 for (i =3D 0; i < ARRAY_SIZE(vec_types); i++) { + /* + * If the vector type isn't supported reads and writes + * should fail. + */ + if (!(getauxval(vec_types[i].hwcap_type) & vec_types[i].hwcap)) { + read_fails(child, &vec_types[i]); + write_fails(child, &vec_types[i]); + } else { + ksft_test_result_skip("%s unsupported read fails\n", + vec_types[i].name); + ksft_test_result_skip("%s unsupported write fails\n", + vec_types[i].name); + } + /* FPSIMD via SVE regset */ if (getauxval(vec_types[i].hwcap_type) & vec_types[i].hwcap) { ptrace_sve_fpsimd(child, &vec_types[i]); --=20 2.39.5 From nobody Sat Oct 4 03:17:46 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 279E12798F0; Wed, 20 Aug 2025 18:29:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714577; cv=none; b=tf3W1erNXZ6I9lcWeG1bfaFCCdBeTfyw930EpxDspK7WKzvDRDCSDRRPfco4zrrGqLFCA2WiXyUKM1E4D9ALldKp67Jk1FL79sAUBJ9rgelHwNAhH/Uo3DhEHN41HGqlYO6Nxvl4Njco2BPDWThTEraB5zkkDqwRardwN2uf2Uo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714577; c=relaxed/simple; bh=0cwUclnjLWnGliCQcpa8hoycuIbbaDjLpbHWDzHQVD0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JL+LN6FkzPYw1UEDiR3L+cVI17fjTiA2FcSrPkEqiL7mrWEud49QqcY8xjwQtsL3EVa/nIX4OkAld9OxezbnfSQzgx9Sa7ygXfk/07bQc8survjSeMPyONwx76D4jmkEijU0ZEA8ShRpA3cxi0BMa39gJSFSKBvQNpgaHS54HdA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=emGAKO6l; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="emGAKO6l" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 26D45C116B1; Wed, 20 Aug 2025 18:29:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755714576; bh=0cwUclnjLWnGliCQcpa8hoycuIbbaDjLpbHWDzHQVD0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=emGAKO6lq7bMnTNnm3mU1HIyCSA9ocOLpKGhpoxGOygM6sqbufmP4kwRhMGv6fHy7 YTzIm8s0M5JcIMnQKqZlGFpHOCZy7XYdabrsDp1hmhlqOss2UuelTkDhGqjkF4K7yd l++K3WldnJQvAv+kCYFDCPIOnCwaaRwAZVkf1isYlXySyNvMeFnpN1zBTp0SvQVks6 qfCq9H/0f+TpARHNmmtCAnm1b+Qvn+eI0hj5EJt9mCld82ZYwT7Ys7Z2KO4+wk8I5z QtiBh2cr0wfD8btHthGVz4irIXazi4wYRtNxEKMwsLeojiSU/BWbbGGbTGhp7BWYSR cBE/WUykzd0zg== From: Mark Brown Date: Wed, 20 Aug 2025 19:29:05 +0100 Subject: [PATCH 3/5] arm64/sme: Support disabling streaming mode via ptrace on SME only systems Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-arm64-sme-ptrace-sme-only-v1-3-f7c22b2871f8@kernel.org> References: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> In-Reply-To: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> To: Catalin Marinas , Will Deacon , Shuah Khan , Jonathan Corbet , Oleg Nesterov Cc: Mark Rutland , David Spickett , Thiago Jung Bauermann , Luis Machado , linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=5057; i=broonie@kernel.org; h=from:subject:message-id; bh=0cwUclnjLWnGliCQcpa8hoycuIbbaDjLpbHWDzHQVD0=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBophQCUfs2yu78q+NnrMRmVLiS0xhc90jY1beJh 69Mi/yRMfSJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaKYUAgAKCRAk1otyXVSH 0AnVB/sE4E2/WH5Q+UMNHOb1lJpIUoWhABDCsgPhH/0D64cih6wUSP19mAaYUERBq11NR1MMLo4 tvISRMvkgkn3CsbDgxIw1u1vzSYwJzS2+3KouCKwaslYrD8JSwL80sbLsa3kUO8jDCAqWc2NCEj WVj9l0xPcFJ8yTmpvqO9iEJyZwQmmelgFCTiXdY1ZHUhHB6RIw2kjFpLbxC08bqgTrsYRPLv9S2 j7bLp+hRaUyJm7BzXmpq78lF4QdlToyhCFcpH8qYQs8Y1LUM2rfQjt9xrVUHS870EGXa2TgOrLl 6mF0dm6t+QY25SxCOuJWaatlZjNI1R/8X2Cjd/bVk0CQXiOY X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB Currently it is not possible to disable streaming mode via ptrace on SME only systems, the interface for doing this is to write via NT_ARM_SVE but such writes will be rejected on a system without SVE support. Enable this functionality by allowing userspace to write SVE_PT_REGS_FPSIMD format data via NT_ARM_SVE with the vector length set to 0 on SME only systems. Such writes currently error since we require that a vector length is specified which should minimise the risk that existing software is relying on current behaviour. Reads are not supported since I am not aware of any use case for this and there is some risk that an existing userspace application may be confused if it reads NT_ARM_SVE on a system without SVE. Existing kernels will return FPSIMD formatted register state from NT_ARM_SVE if full SVE state is not stored, for example if the task has not used SVE. Returning a vector length of 0 would create a risk that software would try to do things like allocate space for register state with zero sizes, while returning a vector length of 128 bits would look like SVE is supported. It seems safer to just not make the changes to add read support. It remains possible for userspace to detect a SME only system via the ptrace interface only since reads of NT_ARM_SSVE and NT_ARM_ZA will succeed while reads of NT_ARM_SVE will fail. Read/write access to the FPSIMD registers in non-streaming mode is available via REGSET_FPR. sve_set_common() already avoids allocating SVE storage when doing a FPSIMD formatted write and allocating SME storage when doing a NT_ARM_SVE write so we change the function to validate the new case and skip setting a vector length for it. The aim is to make a minimally invasive change, no operation that would previously have succeeded will be affected, and we use a previously defined interface in new circumstances rather than define completely new ABI. Signed-off-by: Mark Brown --- Documentation/arch/arm64/sve.rst | 5 +++++ arch/arm64/kernel/ptrace.c | 40 +++++++++++++++++++++++++++++++++---= ---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/Documentation/arch/arm64/sve.rst b/Documentation/arch/arm64/sv= e.rst index 28152492c29c..a61c9d0efe4d 100644 --- a/Documentation/arch/arm64/sve.rst +++ b/Documentation/arch/arm64/sve.rst @@ -402,6 +402,11 @@ The regset data starts with struct user_sve_header, co= ntaining: streaming mode and any SETREGSET of NT_ARM_SSVE will enter streaming mode if the target was not in streaming mode. =20 +* On systems that do not support SVE it is permitted to use SETREGSET to + write SVE_PT_REGS_FPSIMD formatted data via NT_ARM_SVE, in this case the + vector length should be specified as 0. This allows streaming mode to be + disabled on systems with SME but not SVE. + * If any register data is provided along with SVE_PT_VL_ONEXEC then the registers data will be interpreted with the current vector length, not the vector length configured for use on exec. diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c index 4b001121c72d..b9bdd83fbbca 100644 --- a/arch/arm64/kernel/ptrace.c +++ b/arch/arm64/kernel/ptrace.c @@ -912,13 +912,39 @@ static int sve_set_common(struct task_struct *target, return -EINVAL; =20 /* - * Apart from SVE_PT_REGS_MASK, all SVE_PT_* flags are consumed by - * vec_set_vector_length(), which will also validate them for us: + * On systems without SVE we accept FPSIMD format writes with + * a VL of 0 to allow exiting streaming mode, otherwise a VL + * is required. */ - ret =3D vec_set_vector_length(target, type, header.vl, - ((unsigned long)header.flags & ~SVE_PT_REGS_MASK) << 16); - if (ret) - return ret; + if (header.vl) { + /* + * If the system does not support SVE we can't + * configure a SVE VL. + */ + if (!system_supports_sve() && type =3D=3D ARM64_VEC_SVE) + return -EINVAL; + + /* + * Apart from SVE_PT_REGS_MASK, all SVE_PT_* flags are + * consumed by vec_set_vector_length(), which will + * also validate them for us: + */ + ret =3D vec_set_vector_length(target, type, header.vl, + ((unsigned long)header.flags & ~SVE_PT_REGS_MASK) << 16); + if (ret) + return ret; + } else { + /* If the system supports SVE we require a VL. */ + if (system_supports_sve()) + return -EINVAL; + + /* + * Only FPSIMD formatted data with no flags set is + * supported. + */ + if (header.flags !=3D SVE_PT_REGS_FPSIMD) + return -EINVAL; + } =20 /* Allocate SME storage if necessary, preserving any existing ZA/ZT state= */ if (type =3D=3D ARM64_VEC_SME) { @@ -1016,7 +1042,7 @@ static int sve_set(struct task_struct *target, unsigned int pos, unsigned int count, const void *kbuf, const void __user *ubuf) { - if (!system_supports_sve()) + if (!system_supports_sve() && !system_supports_sme()) return -EINVAL; =20 return sve_set_common(target, regset, pos, count, kbuf, ubuf, --=20 2.39.5 From nobody Sat Oct 4 03:17:46 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0BBD1280CFA; Wed, 20 Aug 2025 18:29:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714580; cv=none; b=T7YbE2MOAP4+RK3pma6DAl2K3vPvmx3odyQUXGtX//Fy2OyowH5uIqEdq2QfCDOOHe7POKCLs5m4BL6GKYUf09GGAFbLrAVAc0kvgYn5GNe0M58b+GUum0tnmT6S+7N4+tVPpxMfT++W6gtl+lTkirZ3CnNHq9wPz3ug5m8AcZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714580; c=relaxed/simple; bh=7yYQgVpvwR50FjsSjL4YhMM/gAvl6YUZb0wor5dneuY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=amWtftpkK/I/vpxRSaj4nbDAHBcCNZhoZOtXIszmROMuVXroVGicMlXxvZx4D+1MUcJ4ajnxPkGebWHQVFqO6rlIE5/WLY2t07eGzpvjFaId13+YI9NIvZ6GN65ldhLIPkZTtmYEu13WgtuJWCutIatd+reNc9YdtUN4G1x0cyY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=MgHvn3Wb; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="MgHvn3Wb" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1A900C116C6; Wed, 20 Aug 2025 18:29:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755714579; bh=7yYQgVpvwR50FjsSjL4YhMM/gAvl6YUZb0wor5dneuY=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=MgHvn3WbTwCQyqYCVGAUi1nOpKIIYwqfk2QqGPUzrFMYPOgDYvpwA4cawpaV+oT5l 8Iy4qDlUfBAsWBKGHLkqt3OL56fGoaDfO1dLA5npQO5FV8l+C1Xj/bJVYogzk/Sb2e jiYVed9+cSVfdIVHpn1JvkbCxKGiDBsXx7z8nnFyaEmI88EH0AI5ufGYhJEe+SOGCS EwZjA57ubwKm5RUEt1x4QbEojF+DY8J2fKZCcc9CV5w3H/3q0I8eJ+tcwXaoMdohvU UX+siKVjqePcl39RV1b5+/tw8NHicJQRbJifyPmVWe7F030UQz0ZGw/tpuOdBOtQdh qGFLedDq0Wbrw== From: Mark Brown Date: Wed, 20 Aug 2025 19:29:06 +0100 Subject: [PATCH 4/5] kselftst/arm64: Test NT_ARM_SVE FPSIMD format writes on non-SVE systems Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-arm64-sme-ptrace-sme-only-v1-4-f7c22b2871f8@kernel.org> References: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> In-Reply-To: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> To: Catalin Marinas , Will Deacon , Shuah Khan , Jonathan Corbet , Oleg Nesterov Cc: Mark Rutland , David Spickett , Thiago Jung Bauermann , Luis Machado , linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=2876; i=broonie@kernel.org; h=from:subject:message-id; bh=7yYQgVpvwR50FjsSjL4YhMM/gAvl6YUZb0wor5dneuY=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBophQDBCnwEb501FLky81u9LBxHlAhDWR4gmn9k mEJosS/c1OJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaKYUAwAKCRAk1otyXVSH 0LfPCACA73choIeRJkU3n15ARoQsj6wSJ4dWK3BIH5qL6LaiyaCFmR9pGo90ITc9K3MQI3R5RuD NfWln+t4vCHrrbV4FJzo0vH1EJC8k70J8ZVAJT+AoYbBEejdXeyZGJEPd+NJP1YgPKNDblzKEcq IORUZ5vmvUP5EU2lMpoiWQPwvH7pYPZ0kbOykQ4Rwh385LX4VrkMzyX9Fw7FvLisz5Y7NJiaG2v 9uBw37OjcjKxKDK+TXLth7oBqzpeEQXfxqTTZ7shCMdU2KKdHaj+aoZZi7g8p2UCFJJ3bv/zeE9 3aGX0zOsm1hbyBolt4ecosh8w9aoJsWGsEM6fpBNU/NLezP2 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB In order to allow exiting streaming mode on systems with SME but not SVE we allow writes of FPSIMD format data via NT_ARM_SVE even when SVE is not supported, add a test case that covers this to sve-ptrace. We do not support reads. Signed-off-by: Mark Brown --- tools/testing/selftests/arm64/fp/sve-ptrace.c | 61 +++++++++++++++++++++++= ++++ 1 file changed, 61 insertions(+) diff --git a/tools/testing/selftests/arm64/fp/sve-ptrace.c b/tools/testing/= selftests/arm64/fp/sve-ptrace.c index 5f39ca0b4194..fe43fb07ee6c 100644 --- a/tools/testing/selftests/arm64/fp/sve-ptrace.c +++ b/tools/testing/selftests/arm64/fp/sve-ptrace.c @@ -378,6 +378,58 @@ static void ptrace_sve_fpsimd(pid_t child, const struc= t vec_type *type) free(svebuf); } =20 +/* Write the FPSIMD registers via the SVE regset when SVE is not supported= */ +static void ptrace_sve_fpsimd_no_sve(pid_t child) +{ + void *svebuf; + struct user_sve_header *sve; + struct user_fpsimd_state *fpsimd, new_fpsimd; + unsigned int i, j; + unsigned char *p; + int ret; + + svebuf =3D malloc(SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD)); + if (!svebuf) { + ksft_test_result_fail("Failed to allocate FPSIMD buffer\n"); + return; + } + + /* On a system without SVE the VL should be set to 0 */ + memset(svebuf, 0, SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD)); + sve =3D svebuf; + sve->flags =3D SVE_PT_REGS_FPSIMD; + sve->size =3D SVE_PT_SIZE(0, SVE_PT_REGS_FPSIMD); + sve->vl =3D 0; + + /* Try to set a known FPSIMD state via PT_REGS_SVE */ + fpsimd =3D (struct user_fpsimd_state *)((char *)sve + + SVE_PT_FPSIMD_OFFSET); + for (i =3D 0; i < 32; ++i) { + p =3D (unsigned char *)&fpsimd->vregs[i]; + + for (j =3D 0; j < sizeof(fpsimd->vregs[i]); ++j) + p[j] =3D j; + } + + ret =3D set_sve(child, &vec_types[0], sve); + ksft_test_result(ret =3D=3D 0, "FPSIMD write via SVE\n"); + if (ret) { + ksft_test_result_skip("Verify FPSIMD write via SVE\n"); + goto out; + } + + /* Verify via the FPSIMD regset */ + if (get_fpsimd(child, &new_fpsimd)) { + ksft_test_result_skip("Verify FPSIMD write via SVE\n"); + goto out; + } + ksft_test_result(memcmp(fpsimd, &new_fpsimd, sizeof(*fpsimd)) =3D=3D 0, + "Verify FPSIMD write via SVE\n"); + +out: + free(svebuf); +} + /* Validate attempting to set SVE data and read SVE data */ static void ptrace_set_sve_get_sve_data(pid_t child, const struct vec_type *type, @@ -810,6 +862,15 @@ static int do_parent(pid_t child) } } =20 + /* We support SVE writes of FPSMID format on SME only systems */ + if (!(getauxval(AT_HWCAP) & HWCAP_SVE) && + (getauxval(AT_HWCAP2) & HWCAP2_SME)) { + ptrace_sve_fpsimd_no_sve(child); + } else { + ksft_test_result_skip("FPSIMD write via SVE\n"); + ksft_test_result_skip("Verify FPSIMD write via SVE\n"); + } + ret =3D EXIT_SUCCESS; =20 error: --=20 2.39.5 From nobody Sat Oct 4 03:17:46 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACB3A27A91D; Wed, 20 Aug 2025 18:29:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714582; cv=none; b=aOoQyyTIPDB1gLCJqfNyhRlIcMfgDEg4O0EyA8KDDdyEUQsF9W6uNOjFF/hyrOW2AJjOrsVVtZfzr04Ja7xHaPg4ov0KxFuIAtcARIGZ5iR/izvV3CSP8QqqZsMJ9lb1dZjjHJPPhwtcPJgdnGWs2fM93yqLGlEafBxtNZn0xo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755714582; c=relaxed/simple; bh=GwelV5LaIEzscbAlxJJsBp+tkWj6WmmOlhFzMPKmCGg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iWYspbsvilc05Vc6UnzPmSMD6B9maOXZhb3t5PfeCzPhwQQ8gBTvcz5Is+3FZdPw4a5QWYceDsA3AVLZmPG0l/DWq9QnmXrD6jBXKiwe/C/l+rhexcPRSEs1f+Cp7h9sbAVVP+WN3sX9QJ7YUtddLXXr6pdxg8mciFOi6t+AEnM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=JaNraaPs; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="JaNraaPs" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0D4BAC113D0; Wed, 20 Aug 2025 18:29:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1755714582; bh=GwelV5LaIEzscbAlxJJsBp+tkWj6WmmOlhFzMPKmCGg=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=JaNraaPsML5Qc1tIxPjIpxw6r84mMnvT0ZzLb0ODANQe1pV+3xQ5+OX6hjtRvDBqg 8KxM206jloGSlTFdW/rsswOiJNDGlXYEQgpSsRaEn+gAuu9dptq5rPUJEkW8tRQRtl pVlCASshs5zrD2h3+cu3Us/Y3+sUCMhiLJF7V8gQDRQCSjP51zBanQ6NTyffzcEiZz dJB9Rl4jWWlelr6v7zukv3xpVcnW3isJgACzzVQHuZRvbPo3LSz1A+WyUrHkMVGACl G5btUQF7m8wQzvfuziQAxeoJ8LBNGbK+gczvVoRciUtBySij+dnWhRkfKnp56fo7uZ 9eF5E511Bl9Jw== From: Mark Brown Date: Wed, 20 Aug 2025 19:29:07 +0100 Subject: [PATCH 5/5] kselftest/arm64: Cover disabling streaming mode without SVE in fp-ptrace Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250820-arm64-sme-ptrace-sme-only-v1-5-f7c22b2871f8@kernel.org> References: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> In-Reply-To: <20250820-arm64-sme-ptrace-sme-only-v1-0-f7c22b2871f8@kernel.org> To: Catalin Marinas , Will Deacon , Shuah Khan , Jonathan Corbet , Oleg Nesterov Cc: Mark Rutland , David Spickett , Thiago Jung Bauermann , Luis Machado , linux-arm-kernel@lists.infradead.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, Mark Brown X-Mailer: b4 0.15-dev-cff91 X-Developer-Signature: v=1; a=openpgp-sha256; l=1409; i=broonie@kernel.org; h=from:subject:message-id; bh=GwelV5LaIEzscbAlxJJsBp+tkWj6WmmOlhFzMPKmCGg=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBophQEmL7YR3MYjzO1vG3QUOVkCppXRHzu9l8if U0cm+pxwKeJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCaKYUBAAKCRAk1otyXVSH 0F0NB/94TAcfPdpxW7X2dovVYEJ/U4M+3O9CS2qasqzlNqOkJsMii/if3DdQmbDhBlMfOlEMa34 F589eg9i23JU/mE+uvGkdY2Rmluye7U2EJStnb9Wj4KLCaNIjCZJjgg/YU0yCqAy4lxkH5O4X+X taFmvGpqZILHY8sTKiZWUkXyh0SxPgUdOs/Yul+CXbSejNoVVD+aD27dxrOREAedGiEwOB3CA+m 0kSxJT8Ea1zNDiY2GfFmYjWkzLOkdPivi47EHBEq/fOSswzaTZcTV4M/TVW66i85SJ+9DiIEtkB fwuwtL54MhiiNJ92LsmOP/cjTgsok/SQMAxCyskWdK2wzX44 X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB On a system which support SME but not SVE we can now disable streaming mode via ptrace by writing FPSIMD formatted data through NT_ARM_SVE with a VL of 0. Extend fp-ptrace to cover rather than skip these cases, relax the check for SVE writes of FPSIMD format data to not skip if SME is supported and accept 0 as the VL when performing the ptrace write. Signed-off-by: Mark Brown --- tools/testing/selftests/arm64/fp/fp-ptrace.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tools/testing/selftests/arm64/fp/fp-ptrace.c b/tools/testing/s= elftests/arm64/fp/fp-ptrace.c index cdd7a45c045d..3bb4bbff120f 100644 --- a/tools/testing/selftests/arm64/fp/fp-ptrace.c +++ b/tools/testing/selftests/arm64/fp/fp-ptrace.c @@ -1071,7 +1071,7 @@ static bool sve_write_supported(struct test_config *c= onfig) =20 static bool sve_write_fpsimd_supported(struct test_config *config) { - if (!sve_supported()) + if (!sve_supported() && !sme_supported()) return false; =20 if ((config->svcr_in & SVCR_ZA) !=3D (config->svcr_expected & SVCR_ZA)) @@ -1231,9 +1231,6 @@ static void sve_write_fpsimd(pid_t child, struct test= _config *config) vl =3D vl_expected(config); vq =3D __sve_vq_from_vl(vl); =20 - if (!vl) - return; - iov.iov_len =3D SVE_PT_SIZE(vq, SVE_PT_REGS_FPSIMD); iov.iov_base =3D malloc(iov.iov_len); if (!iov.iov_base) { --=20 2.39.5