From: Mark Brown <broonie@kernel.org>
To: Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Marc Zyngier <maz@kernel.org>,
Shuah Khan <skhan@linuxfoundation.org>,
Shuah Khan <shuah@kernel.org>
Cc: Alan Hayward <alan.hayward@arm.com>,
Luis Machado <luis.machado@arm.com>,
Salil Akerkar <Salil.Akerkar@arm.com>,
Basant Kumar Dwivedi <Basant.KumarDwivedi@arm.com>,
Szabolcs Nagy <szabolcs.nagy@arm.com>,
James Morse <james.morse@arm.com>,
Alexandru Elisei <alexandru.elisei@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Luca Salabrino <luca.scalabrino@arm.com>,
linux-arm-kernel@lists.infradead.org,
linux-kselftest@vger.kernel.org, kvmarm@lists.cs.columbia.edu,
Mark Brown <broonie@kernel.org>
Subject: [PATCH v13 11/39] arm64/sme: Implement vector length configuration prctl()s
Date: Fri, 8 Apr 2022 12:43:00 +0100 [thread overview]
Message-ID: <20220408114328.1401034-12-broonie@kernel.org> (raw)
In-Reply-To: <20220408114328.1401034-1-broonie@kernel.org>
As for SVE provide a prctl() interface which allows processes to
configure their SME vector length.
Signed-off-by: Mark Brown <broonie@kernel.org>
Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
---
arch/arm64/include/asm/fpsimd.h | 4 ++++
arch/arm64/include/asm/processor.h | 4 +++-
arch/arm64/include/asm/thread_info.h | 1 +
arch/arm64/kernel/fpsimd.c | 32 ++++++++++++++++++++++++++++
include/uapi/linux/prctl.h | 9 ++++++++
kernel/sys.c | 12 +++++++++++
6 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/arch/arm64/include/asm/fpsimd.h b/arch/arm64/include/asm/fpsimd.h
index 32cd682258d9..38fd6aab7feb 100644
--- a/arch/arm64/include/asm/fpsimd.h
+++ b/arch/arm64/include/asm/fpsimd.h
@@ -288,6 +288,8 @@ static inline int sme_max_virtualisable_vl(void)
}
extern unsigned int sme_get_vl(void);
+extern int sme_set_current_vl(unsigned long arg);
+extern int sme_get_current_vl(void);
#else
@@ -299,6 +301,8 @@ static inline void sme_setup(void) { }
static inline unsigned int sme_get_vl(void) { return 0; }
static inline int sme_max_vl(void) { return 0; }
static inline int sme_max_virtualisable_vl(void) { return 0; }
+static inline int sme_set_current_vl(unsigned long arg) { return -EINVAL; }
+static inline int sme_get_current_vl(void) { return -EINVAL; }
#endif /* ! CONFIG_ARM64_SME */
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h
index abf34a9c2eab..7a57cbff8a03 100644
--- a/arch/arm64/include/asm/processor.h
+++ b/arch/arm64/include/asm/processor.h
@@ -355,9 +355,11 @@ extern void __init minsigstksz_setup(void);
*/
#include <asm/fpsimd.h>
-/* Userspace interface for PR_SVE_{SET,GET}_VL prctl()s: */
+/* Userspace interface for PR_S[MV]E_{SET,GET}_VL prctl()s: */
#define SVE_SET_VL(arg) sve_set_current_vl(arg)
#define SVE_GET_VL() sve_get_current_vl()
+#define SME_SET_VL(arg) sme_set_current_vl(arg)
+#define SME_GET_VL() sme_get_current_vl()
/* PR_PAC_RESET_KEYS prctl */
#define PAC_RESET_KEYS(tsk, arg) ptrauth_prctl_reset_keys(tsk, arg)
diff --git a/arch/arm64/include/asm/thread_info.h b/arch/arm64/include/asm/thread_info.h
index e1317b7c4525..4e6b58dcd6f9 100644
--- a/arch/arm64/include/asm/thread_info.h
+++ b/arch/arm64/include/asm/thread_info.h
@@ -82,6 +82,7 @@ int arch_dup_task_struct(struct task_struct *dst,
#define TIF_SVE_VL_INHERIT 24 /* Inherit SVE vl_onexec across exec */
#define TIF_SSBD 25 /* Wants SSB mitigation */
#define TIF_TAGGED_ADDR 26 /* Allow tagged user addresses */
+#define TIF_SME_VL_INHERIT 28 /* Inherit SME vl_onexec across exec */
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
diff --git a/arch/arm64/kernel/fpsimd.c b/arch/arm64/kernel/fpsimd.c
index 754a96563f6f..39f44fcb9b99 100644
--- a/arch/arm64/kernel/fpsimd.c
+++ b/arch/arm64/kernel/fpsimd.c
@@ -149,6 +149,8 @@ static unsigned int vec_vl_inherit_flag(enum vec_type type)
switch (type) {
case ARM64_VEC_SVE:
return TIF_SVE_VL_INHERIT;
+ case ARM64_VEC_SME:
+ return TIF_SME_VL_INHERIT;
default:
WARN_ON_ONCE(1);
return 0;
@@ -807,6 +809,36 @@ int sve_get_current_vl(void)
return vec_prctl_status(ARM64_VEC_SVE, 0);
}
+#ifdef CONFIG_ARM64_SME
+/* PR_SME_SET_VL */
+int sme_set_current_vl(unsigned long arg)
+{
+ unsigned long vl, flags;
+ int ret;
+
+ vl = arg & PR_SME_VL_LEN_MASK;
+ flags = arg & ~vl;
+
+ if (!system_supports_sme() || is_compat_task())
+ return -EINVAL;
+
+ ret = vec_set_vector_length(current, ARM64_VEC_SME, vl, flags);
+ if (ret)
+ return ret;
+
+ return vec_prctl_status(ARM64_VEC_SME, flags);
+}
+
+/* PR_SME_GET_VL */
+int sme_get_current_vl(void)
+{
+ if (!system_supports_sme() || is_compat_task())
+ return -EINVAL;
+
+ return vec_prctl_status(ARM64_VEC_SME, 0);
+}
+#endif /* CONFIG_ARM64_SME */
+
static void vec_probe_vqs(struct vl_info *info,
DECLARE_BITMAP(map, SVE_VQ_MAX))
{
diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h
index e998764f0262..a5e06dcbba13 100644
--- a/include/uapi/linux/prctl.h
+++ b/include/uapi/linux/prctl.h
@@ -272,6 +272,15 @@ struct prctl_mm_map {
# define PR_SCHED_CORE_SCOPE_THREAD_GROUP 1
# define PR_SCHED_CORE_SCOPE_PROCESS_GROUP 2
+/* arm64 Scalable Matrix Extension controls */
+/* Flag values must be in sync with SVE versions */
+#define PR_SME_SET_VL 63 /* set task vector length */
+# define PR_SME_SET_VL_ONEXEC (1 << 18) /* defer effect until exec */
+#define PR_SME_GET_VL 64 /* get task vector length */
+/* Bits common to PR_SME_SET_VL and PR_SME_GET_VL */
+# define PR_SME_VL_LEN_MASK 0xffff
+# define PR_SME_VL_INHERIT (1 << 17) /* inherit across exec */
+
#define PR_SET_VMA 0x53564d41
# define PR_SET_VMA_ANON_NAME 0
diff --git a/kernel/sys.c b/kernel/sys.c
index 374f83e95239..b911fa6d81ab 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -117,6 +117,12 @@
#ifndef SVE_GET_VL
# define SVE_GET_VL() (-EINVAL)
#endif
+#ifndef SME_SET_VL
+# define SME_SET_VL(a) (-EINVAL)
+#endif
+#ifndef SME_GET_VL
+# define SME_GET_VL() (-EINVAL)
+#endif
#ifndef PAC_RESET_KEYS
# define PAC_RESET_KEYS(a, b) (-EINVAL)
#endif
@@ -2541,6 +2547,12 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
case PR_SVE_GET_VL:
error = SVE_GET_VL();
break;
+ case PR_SME_SET_VL:
+ error = SME_SET_VL(arg2);
+ break;
+ case PR_SME_GET_VL:
+ error = SME_GET_VL();
+ break;
case PR_GET_SPECULATION_CTRL:
if (arg3 || arg4 || arg5)
return -EINVAL;
--
2.30.2
next prev parent reply other threads:[~2022-04-08 11:56 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-08 11:42 [PATCH v13 00/39] arm64/sme: Initial support for the Scalable Matrix Extension Mark Brown
2022-04-08 11:42 ` [PATCH v13 01/39] kselftest/arm64: Fix comment for ptrace_sve_get_fpsimd_data() Mark Brown
2022-04-08 11:42 ` [PATCH v13 02/39] kselftest/arm64: Remove assumption that tasks start FPSIMD only Mark Brown
2022-04-08 11:42 ` [PATCH v13 03/39] kselftest/arm64: Validate setting via FPSIMD and read via SVE regsets Mark Brown
2022-04-08 11:42 ` [PATCH v13 04/39] arm64/sme: Provide ABI documentation for SME Mark Brown
2022-04-13 14:31 ` Szabolcs Nagy
2022-04-08 11:42 ` [PATCH v13 05/39] arm64/sme: System register and exception syndrome definitions Mark Brown
2022-04-08 11:42 ` [PATCH v13 06/39] arm64/sme: Manually encode SME instructions Mark Brown
2022-04-08 11:42 ` [PATCH v13 07/39] arm64/sme: Early CPU setup for SME Mark Brown
2022-04-08 11:42 ` [PATCH v13 08/39] arm64/sme: Basic enumeration support Mark Brown
2022-04-08 11:42 ` [PATCH v13 09/39] arm64/sme: Identify supported SME vector lengths at boot Mark Brown
2022-04-08 11:42 ` [PATCH v13 10/39] arm64/sme: Implement sysctl to set the default vector length Mark Brown
2022-04-08 11:43 ` Mark Brown [this message]
2022-04-08 11:43 ` [PATCH v13 12/39] arm64/sme: Implement support for TPIDR2 Mark Brown
2022-04-08 11:43 ` [PATCH v13 13/39] arm64/sme: Implement SVCR context switching Mark Brown
2022-04-08 11:43 ` [PATCH v13 14/39] arm64/sme: Implement streaming SVE " Mark Brown
2022-04-08 11:43 ` [PATCH v13 15/39] arm64/sme: Implement ZA " Mark Brown
2022-04-08 11:43 ` [PATCH v13 16/39] arm64/sme: Implement traps and syscall handling for SME Mark Brown
2022-04-08 11:43 ` [PATCH v13 17/39] arm64/sme: Disable ZA and streaming mode when handling signals Mark Brown
2022-04-08 11:43 ` [PATCH v13 18/39] arm64/sme: Implement streaming SVE signal handling Mark Brown
2022-04-08 11:43 ` [PATCH v13 19/39] arm64/sme: Implement ZA " Mark Brown
2022-04-08 11:43 ` [PATCH v13 20/39] arm64/sme: Implement ptrace support for streaming mode SVE registers Mark Brown
2022-04-08 11:43 ` [PATCH v13 21/39] arm64/sme: Add ptrace support for ZA Mark Brown
2022-04-08 11:43 ` [PATCH v13 22/39] arm64/sme: Disable streaming mode and ZA when flushing CPU state Mark Brown
2022-04-08 11:43 ` [PATCH v13 23/39] arm64/sme: Save and restore streaming mode over EFI runtime calls Mark Brown
2022-04-08 11:43 ` [PATCH v13 24/39] KVM: arm64: Hide SME system registers from guests Mark Brown
2022-04-08 11:43 ` [PATCH v13 25/39] KVM: arm64: Trap SME usage in guest Mark Brown
2022-04-08 11:43 ` [PATCH v13 26/39] KVM: arm64: Handle SME host state when running guests Mark Brown
2022-04-08 11:43 ` [PATCH v13 27/39] arm64/sme: Provide Kconfig for SME Mark Brown
2022-04-08 11:43 ` [PATCH v13 28/39] kselftest/arm64: Add manual encodings for SME instructions Mark Brown
2022-04-08 11:43 ` [PATCH v13 29/39] kselftest/arm64: sme: Add SME support to vlset Mark Brown
2022-04-08 11:43 ` [PATCH v13 30/39] kselftest/arm64: Add tests for TPIDR2 Mark Brown
2022-04-08 11:43 ` [PATCH v13 31/39] kselftest/arm64: Extend vector configuration API tests to cover SME Mark Brown
2022-04-08 11:43 ` [PATCH v13 32/39] kselftest/arm64: sme: Provide streaming mode SVE stress test Mark Brown
2022-04-08 11:43 ` [PATCH v13 33/39] kselftest/arm64: signal: Handle ZA signal context in core code Mark Brown
2022-04-08 11:43 ` [PATCH v13 34/39] kselftest/arm64: Add stress test for SME ZA context switching Mark Brown
2022-04-08 11:43 ` [PATCH v13 35/39] kselftest/arm64: signal: Add SME signal handling tests Mark Brown
2022-04-08 11:43 ` [PATCH v13 36/39] kselftest/arm64: Add streaming SVE to SVE ptrace tests Mark Brown
2022-04-08 11:43 ` [PATCH v13 37/39] kselftest/arm64: Add coverage for the ZA ptrace interface Mark Brown
2022-04-08 11:43 ` [PATCH v13 38/39] kselftest/arm64: Add SME support to syscall ABI test Mark Brown
2022-04-08 11:43 ` [PATCH v13 39/39] selftests/arm64: Add a testcase for handling of ZA on clone() Mark Brown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220408114328.1401034-12-broonie@kernel.org \
--to=broonie@kernel.org \
--cc=Basant.KumarDwivedi@arm.com \
--cc=Salil.Akerkar@arm.com \
--cc=alan.hayward@arm.com \
--cc=alexandru.elisei@arm.com \
--cc=catalin.marinas@arm.com \
--cc=james.morse@arm.com \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=luca.scalabrino@arm.com \
--cc=luis.machado@arm.com \
--cc=maz@kernel.org \
--cc=shuah@kernel.org \
--cc=skhan@linuxfoundation.org \
--cc=suzuki.poulose@arm.com \
--cc=szabolcs.nagy@arm.com \
--cc=will@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).