From mboxrd@z Thu Jan 1 00:00:00 1970 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7035AFA3746 for ; Mon, 31 Oct 2022 20:41:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=wuw1u9KD15fn3wSa30kDnYj4XLb31FvRNHwX97u1XAo=; b=T/p2R60r0Yu3lR AT1DE//9u5R5BjT0tR8ZnbzEAS16I9TuE52frLhTyGDXVjwwHXeN0vi9cjcPg1I1zXcE17w6IwfZf C88BWq258JAx02S0v92ZBocRNBBP1kQ2guJrVfIhBMG5/RtiwucmJNbL2HkOUCY58q7Yuavx1JS14 HFjc4jCP/1G5gsWy6X0w3wSjf/CwuH1e8kPGTXKH1u1X2LgDG0G8BI7SsWHj/cqPTQ41AaUd4CiQb pXazYoeQ1DlKS8qJjzFThw5sETKAUJFrjPe5TDRwaAtTlel8NFhryH0Zyn6dGREST769rfYY1k1Hr vaqQFeOdZxOWa6hnWXqQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1opbaB-00FFzi-6R; Mon, 31 Oct 2022 20:40:31 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1opbZv-00FFwf-I8 for linux-arm-kernel@lists.infradead.org; Mon, 31 Oct 2022 20:40:17 +0000 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 E6E4A60693; Mon, 31 Oct 2022 20:40:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 5C785C433D6; Mon, 31 Oct 2022 20:40:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1667248814; bh=mfhW4oLP3sTOppat05G+cpVhvUWyC31f8hi9C4xghG4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=FTlfJ94DICBdc2eqQ3RsHE25mXkSUewcWq1FQpRZapPTZW30O/QSucq7R4oCr5ft7 u4GRNwSCUUN+YmDC6rQ6I6gh6z+Sw5xAF5iwTYD0pX/VR0sAuXNeUa0+APIPvc4tp4 ZZHaFMZQqpJoTsfPKV8nNGKbA54gnr9rGQkY9PX7RuxO1UQlxd3mzF1Eb5fsQG/EzM ZaznIckFihLMsaiTMSxpd91TeLSnJB1TERINensgtoSM/mDRX8HG6JCTxjd+fqeAkp FFBtI550iGXp6F3GNSqDFkUVm7+aA2FMDt68uYM7UJKdslmp/7ClnX9QtCOXp9QWUE 0nXXUo/RvtwUg== From: Mark Brown To: Catalin Marinas , Will Deacon , Shuah Khan , Shuah Khan Cc: Szabolcs Nagy , linux-arm-kernel@lists.infradead.org, Mark Brown Subject: [PATCH v2 2/4] arm64/signal: Include TPIDR2 in the signal context Date: Mon, 31 Oct 2022 20:17:34 +0000 Message-Id: <20221031201736.894374-3-broonie@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20221031201736.894374-1-broonie@kernel.org> References: <20221031201736.894374-1-broonie@kernel.org> MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=4933; i=broonie@kernel.org; h=from:subject; bh=mfhW4oLP3sTOppat05G+cpVhvUWyC31f8hi9C4xghG4=; b=owEBbQGS/pANAwAKASTWi3JdVIfQAcsmYgBjYC1eqwRuL7CBm/159XL/T3lCtH4beYccTk4JVjeW w0cwgoeJATMEAAEKAB0WIQSt5miqZ1cYtZ/in+ok1otyXVSH0AUCY2AtXgAKCRAk1otyXVSH0KxwB/ 4kphkjCZCEfqFZ/A/IC9okpNNRGJYKR41znDwSZj9zhiu3f5qIBFP3+R5wkEcZzT3avaBukfMzT8T8 kKxt2rPxmrPnm1UDg9caElqee6Hwoaao38FHVgHHOnkxFksmp0j6614njRSoG/6aJTdDMiQtTFxPPz 364+y4W3UivimMrN+7V31UVUntrPHSyv8O0hGgL0ZnSADPJ9D3n1t3EopfgkJZGMQ3Ss0X1/0NnNjY ssCKRjyCZKS5AQxUaGAgd/qAiWBn1pM5PgwJH/OEnxYWc5nJBh0sIr/gCNvQioVxHMjgl1f3AC+55F bHRJ6FpzA4TAo8gp5LkqElp9qFByQX X-Developer-Key: i=broonie@kernel.org; a=openpgp; fpr=3F2568AAC26998F9E813A1C5C3F436CA30F5D8EB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221031_134015_698674_B480D9BD X-CRM114-Status: GOOD ( 20.04 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Add a new signal frame record for TPIDR2 using the same format as we already use for ESR with different magic, a header with the value from the register appended as the only data. If SME is supported then this record is always included. Signed-off-by: Mark Brown Reviewed-by: Szabolcs Nagy --- arch/arm64/include/uapi/asm/sigcontext.h | 8 ++++ arch/arm64/kernel/signal.c | 59 ++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/arch/arm64/include/uapi/asm/sigcontext.h b/arch/arm64/include/uapi/asm/sigcontext.h index 4aaf31e3bf16..46ce097ca8c0 100644 --- a/arch/arm64/include/uapi/asm/sigcontext.h +++ b/arch/arm64/include/uapi/asm/sigcontext.h @@ -140,6 +140,14 @@ struct sve_context { #define SVE_SIG_FLAG_SM 0x1 /* Context describes streaming mode */ +/* TPIDR2_EL0 context */ +#define TPIDR2_MAGIC 0x54504902 + +struct tpidr2_context { + struct _aarch64_ctx head; + __u64 tpidr2; +}; + #define ZA_MAGIC 0x54366345 struct za_context { diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 9ad911f1647c..ac4fb42a9613 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -56,6 +56,7 @@ struct rt_sigframe_user_layout { unsigned long fpsimd_offset; unsigned long esr_offset; unsigned long sve_offset; + unsigned long tpidr2_offset; unsigned long za_offset; unsigned long extra_offset; unsigned long end_offset; @@ -219,6 +220,7 @@ static int restore_fpsimd_context(struct fpsimd_context __user *ctx) struct user_ctxs { struct fpsimd_context __user *fpsimd; struct sve_context __user *sve; + struct tpidr2_context __user *tpidr2; struct za_context __user *za; }; @@ -358,6 +360,32 @@ extern int preserve_sve_context(void __user *ctx); #ifdef CONFIG_ARM64_SME +static int preserve_tpidr2_context(struct tpidr2_context __user *ctx) +{ + int err = 0; + + current->thread.tpidr2_el0 = read_sysreg_s(SYS_TPIDR2_EL0); + + __put_user_error(TPIDR2_MAGIC, &ctx->head.magic, err); + __put_user_error(sizeof(*ctx), &ctx->head.size, err); + __put_user_error(current->thread.tpidr2_el0, &ctx->tpidr2, err); + + return err; +} + +static int restore_tpidr2_context(struct user_ctxs *user) +{ + u64 tpidr2_el0; + int err = 0; + + /* Magic and size were validated deciding to call this function */ + __get_user_error(tpidr2_el0, &user->tpidr2->tpidr2, err); + if (!err) + current->thread.tpidr2_el0 = tpidr2_el0; + + return err; +} + static int preserve_za_context(struct za_context __user *ctx) { int err = 0; @@ -447,6 +475,8 @@ static int restore_za_context(struct user_ctxs *user) #else /* ! CONFIG_ARM64_SME */ /* Turn any non-optimised out attempts to use these into a link error: */ +extern int preserve_tpidr2_context(void __user *ctx); +extern int restore_tpidr2_context(struct user_ctxs *user); extern int preserve_za_context(void __user *ctx); extern int restore_za_context(struct user_ctxs *user); @@ -465,6 +495,7 @@ static int parse_user_sigframe(struct user_ctxs *user, user->fpsimd = NULL; user->sve = NULL; + user->tpidr2 = NULL; user->za = NULL; if (!IS_ALIGNED((unsigned long)base, 16)) @@ -531,6 +562,19 @@ static int parse_user_sigframe(struct user_ctxs *user, user->sve = (struct sve_context __user *)head; break; + case TPIDR2_MAGIC: + if (!system_supports_sme()) + goto invalid; + + if (user->tpidr2) + goto invalid; + + if (size != sizeof(*user->tpidr2)) + goto invalid; + + user->tpidr2 = (struct tpidr2_context __user *)head; + break; + case ZA_MAGIC: if (!system_supports_sme()) goto invalid; @@ -663,6 +707,9 @@ static int restore_sigframe(struct pt_regs *regs, err = restore_fpsimd_context(user.fpsimd); } + if (err == 0 && system_supports_sme() && user.tpidr2) + err = restore_tpidr2_context(&user); + if (err == 0 && system_supports_sme() && user.za) err = restore_za_context(&user); @@ -757,6 +804,11 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user, else vl = task_get_sme_vl(current); + err = sigframe_alloc(user, &user->tpidr2_offset, + sizeof(struct tpidr2_context)); + if (err) + return err; + if (thread_za_enabled(¤t->thread)) vq = sve_vq_from_vl(vl); @@ -814,6 +866,13 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user, err |= preserve_sve_context(sve_ctx); } + /* TPIDR2 if supported */ + if (system_supports_sme() && err == 0) { + struct tpidr2_context __user *tpidr2_ctx = + apply_user_offset(user, user->tpidr2_offset); + err |= preserve_tpidr2_context(tpidr2_ctx); + } + /* ZA state if present */ if (system_supports_sme() && err == 0 && user->za_offset) { struct za_context __user *za_ctx = -- 2.30.2 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel