From nobody Wed Jun 17 01:42:49 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5674937B413; Mon, 27 Apr 2026 12:04:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291444; cv=none; b=jRlQmPkefJNVUHUjBaAduQH7cTm2B09z3bl9Cp4nb4NMyvPiBm1Xp/1PFCt0dmIIrSJbl2/EFBvH5L6QN/STx70iREH6e7d/H73FhH0Du8Aac7MzjnNgKAJQqHpB5otHdaQVRb3TWSsFyixbyq/cXPA2dj6ligekqfttX1Ww+hU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291444; c=relaxed/simple; bh=slrafw9MOFyBo/v8zwX3peiajbdJyOH74VvtDwDB9UQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CFks1C1jLzN7a1belVCjOdcI+qivI81GYywjkLwzvgL1cMeuVZNDH9OZeUg9u6idDveOnkEMeSV98S40CRrZFoAYalA9XFFEP4EKPRYRNYtAbPl5uy8GVX7C5OXJ3EJeBQfWLx1l2OgN0fnsKnIzKL8srEbvXTNLQ8nqMSlELko= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=vxg2AMkE; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="vxg2AMkE" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 360C91FC7; Mon, 27 Apr 2026 05:03:56 -0700 (PDT) Received: from localhost.localdomain (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 177223F62B; Mon, 27 Apr 2026 05:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777291441; bh=slrafw9MOFyBo/v8zwX3peiajbdJyOH74VvtDwDB9UQ=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=vxg2AMkEnOQuZ6mDO6cV3q3P+xPWKKgasAMEAyIb23+H/+HglfDlScLV73Cp5qVaD Nyg1f0E/85GwcF2+uUWgldgKYrq9DOcI1gg40nhD3hcgHWReH/d20w7e8SiUQyk/k3 Fuyna3CGcPTJzFlnulf41IrAk0CI+0/cZriDXirA= From: Kevin Brodsky Date: Mon, 27 Apr 2026 13:03:33 +0100 Subject: [PATCH v2 1/5] arm64: signal: Preserve POR_EL0 if poe_context is missing 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: <20260427-poe_signal-v2-1-2bd9d6f16ab4@arm.com> References: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> In-Reply-To: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Kevin Brodsky , Andrew Morton , Catalin Marinas , "David Hildenbrand (Arm)" , Joey Gouly , Mark Brown , Shuah Khan , Will Deacon , linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777291437; l=5608; i=kevin.brodsky@arm.com; s=20260427; h=from:subject:message-id; bh=slrafw9MOFyBo/v8zwX3peiajbdJyOH74VvtDwDB9UQ=; b=MVsLaSQUtzBk2Ysh4JQTsUjt2XFmOZOJwMNMNpWEaLRYmDd/XLhfcN+XZK55TQq7hob0Tic8i xh0wf54gogVBQSsnRVBsRaTMZDoZe+ks2YKFfERfHz6ssnWNIe2zmFS X-Developer-Key: i=kevin.brodsky@arm.com; a=ed25519; pk=N2QG+eJKrvkNovwhhwJhnJ4+ScVfsGCHldmqLfcMTFs= Commit 2e8a1acea859 ("arm64: signal: Improve POR_EL0 handling to avoid uaccess failures") delayed the write to POR_EL0 in rt_sigreturn to avoid spurious uaccess failures. This change however relies on the poe_context frame record being present: on a system supporting POE, calling sigreturn without a poe_context record now results in writing arbitrary data from the kernel stack into POR_EL0. Fix this by adding a __valid_fields member to struct user_access_state, and zeroing the struct on allocation. restore_poe_context() then indicates that the por_el0 field is valid by setting the corresponding bit in __valid_fields, and restore_user_access_state() only touches POR_EL0 if there is a valid value to set it to. This is in line with how POR_EL0 was originally handled; all frame records are currently optional, except fpsimd_context. To ensure that __valid_fields is kept in sync, fields (currently just por_el0) are now accessed via accessors and prefixed with __ to discourage direct access. Fixes: 2e8a1acea859 ("arm64: signal: Improve POR_EL0 handling to avoid uacc= ess failures") Reported-by: Will Deacon Signed-off-by: Kevin Brodsky --- arch/arm64/kernel/signal.c | 54 ++++++++++++++++++++++++++++++++++++------= ---- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c index 08ffc5a5aea4..38e6fa204c17 100644 --- a/arch/arm64/kernel/signal.c +++ b/arch/arm64/kernel/signal.c @@ -67,6 +67,9 @@ struct rt_sigframe_user_layout { unsigned long end_offset; }; =20 +#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16) +#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16) + /* * Holds any EL0-controlled state that influences unprivileged memory acce= sses. * This includes both accesses done in userspace and uaccess done in the k= ernel. @@ -74,13 +77,35 @@ struct rt_sigframe_user_layout { * This state needs to be carefully managed to ensure that it doesn't cause * uaccess to fail when setting up the signal frame, and the signal handler * itself also expects a well-defined state when entered. + * + * The struct should be zero-initialised. Its members should only be acces= sed + * via the accessors below. __valid_fields tracks which of the fields are = valid + * (have been set to some value). */ struct user_access_state { - u64 por_el0; + unsigned int __valid_fields; + u64 __por_el0; }; =20 -#define TERMINATOR_SIZE round_up(sizeof(struct _aarch64_ctx), 16) -#define EXTRA_CONTEXT_SIZE round_up(sizeof(struct extra_context), 16) +#define UA_STATE_HAS_POR_EL0 BIT(0) + +static void set_ua_state_por_el0(struct user_access_state *ua_state, + u64 por_el0) +{ + ua_state->__por_el0 =3D por_el0; + ua_state->__valid_fields |=3D UA_STATE_HAS_POR_EL0; +} + +static int get_ua_state_por_el0(const struct user_access_state *ua_state, + u64 *por_el0) +{ + if (ua_state->__valid_fields & UA_STATE_HAS_POR_EL0) { + *por_el0 =3D ua_state->__por_el0; + return 0; + } + + return -ENOENT; +} =20 /* * Save the user access state into ua_state and reset it to disable any @@ -94,7 +119,7 @@ static void save_reset_user_access_state(struct user_acc= ess_state *ua_state) for (int pkey =3D 0; pkey < arch_max_pkey(); pkey++) por_enable_all |=3D POR_ELx_PERM_PREP(pkey, POE_RWX); =20 - ua_state->por_el0 =3D read_sysreg_s(SYS_POR_EL0); + set_ua_state_por_el0(ua_state, read_sysreg_s(SYS_POR_EL0)); write_sysreg_s(por_enable_all, SYS_POR_EL0); /* * No ISB required as we can tolerate spurious Overlay faults - @@ -122,8 +147,10 @@ static void set_handler_user_access_state(void) */ static void restore_user_access_state(const struct user_access_state *ua_s= tate) { - if (system_supports_poe()) - write_sysreg_s(ua_state->por_el0, SYS_POR_EL0); + u64 por_el0; + + if (get_ua_state_por_el0(ua_state, &por_el0) =3D=3D 0) + write_sysreg_s(por_el0, SYS_POR_EL0); } =20 static void init_user_layout(struct rt_sigframe_user_layout *user) @@ -333,11 +360,16 @@ static int restore_fpmr_context(struct user_ctxs *use= r) static int preserve_poe_context(struct poe_context __user *ctx, const struct user_access_state *ua_state) { - int err =3D 0; + int err; + u64 por_el0; + + err =3D get_ua_state_por_el0(ua_state, &por_el0); + if (WARN_ON_ONCE(err)) + return err; =20 __put_user_error(POE_MAGIC, &ctx->head.magic, err); __put_user_error(sizeof(*ctx), &ctx->head.size, err); - __put_user_error(ua_state->por_el0, &ctx->por_el0, err); + __put_user_error(por_el0, &ctx->por_el0, err); =20 return err; } @@ -353,7 +385,7 @@ static int restore_poe_context(struct user_ctxs *user, =20 __get_user_error(por_el0, &(user->poe->por_el0), err); if (!err) - ua_state->por_el0 =3D por_el0; + set_ua_state_por_el0(ua_state, por_el0); =20 return err; } @@ -1095,7 +1127,7 @@ SYSCALL_DEFINE0(rt_sigreturn) { struct pt_regs *regs =3D current_pt_regs(); struct rt_sigframe __user *frame; - struct user_access_state ua_state; + struct user_access_state ua_state =3D {}; =20 /* Always make any pending restarted system calls return -EINTR */ current->restart_block.fn =3D do_no_restart_syscall; @@ -1507,7 +1539,7 @@ static int setup_rt_frame(int usig, struct ksignal *k= sig, sigset_t *set, { struct rt_sigframe_user_layout user; struct rt_sigframe __user *frame; - struct user_access_state ua_state; + struct user_access_state ua_state =3D {}; int err =3D 0; =20 fpsimd_save_and_flush_current_state(); --=20 2.51.2 From nobody Wed Jun 17 01:42:49 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 391973B4EAF; Mon, 27 Apr 2026 12:04:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291445; cv=none; b=s5XRXlz0nkGf9H+OGFaNet/MGZLCk3/FNtzmrjcASiqhYpTugwZddhuvKFLM7noCgBmp5rjUfJYUs7mnaIPwDH6npzhBMs3frc3URaZlsJ+Dgxm6cMrUFTlHT+ImFvmXEs/iXaPyQshqwLpMTfKz0gMzirkEGx49MYbu+V8DAh4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291445; c=relaxed/simple; bh=awcZVPdgr4NoF6FXkdZLV9n173eUmmWJVTl+xzU9qi0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jz8EtnLCLJEV/rf09BR5fRPcYvu0O3h3s8Okua+iNx/QJ8JJ0pOtLL6sC9UChxOTlgCbfcdOfPtfl30eQRnC1DPZWlKbHG3Ms2Ks2BsWjrddMOWboPrlvHKGLyZQizNeIU4F6J1M8h+qVFZF5yHXfowr1ZyyFtz2o0i8HXRpLs0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=etUonoN6; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="etUonoN6" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 27EF4237B; Mon, 27 Apr 2026 05:03:58 -0700 (PDT) Received: from localhost.localdomain (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 06D033F62B; Mon, 27 Apr 2026 05:04:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777291443; bh=awcZVPdgr4NoF6FXkdZLV9n173eUmmWJVTl+xzU9qi0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=etUonoN6yDhxKa6hqLVL5RxhyWOxzED9Q58uZo0iPeFyW4oCmYJkq8Lttdn11mcQJ Yu0mQ+jiepIcjiXT0sced8SveI+geZ8cg46DEctgDeFySf5k863kuKk0/D2yyElW+Q qBMdUlbRGgYjwOqzdfPCbApXucgS20R46HQoI8j0= From: Kevin Brodsky Date: Mon, 27 Apr 2026 13:03:34 +0100 Subject: [PATCH v2 2/5] selftests/mm: Fix resv_sz when parsing arm64 signal frame 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: <20260427-poe_signal-v2-2-2bd9d6f16ab4@arm.com> References: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> In-Reply-To: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Kevin Brodsky , Andrew Morton , Catalin Marinas , "David Hildenbrand (Arm)" , Joey Gouly , Mark Brown , Shuah Khan , Will Deacon , linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777291437; l=1455; i=kevin.brodsky@arm.com; s=20260427; h=from:subject:message-id; bh=awcZVPdgr4NoF6FXkdZLV9n173eUmmWJVTl+xzU9qi0=; b=HUE7VaV5mymXwUwqCX1U0mb2g/qez2BgKu9EqDu+FVf3vPerOr9icMeIKp6NWvRlEynUXEsXu 6AbWmvJwVciC+2FBPdj7AuDDoP3Y49f/5k9SEqqhbMvqVxsge4RRZ1b X-Developer-Key: i=kevin.brodsky@arm.com; a=ed25519; pk=N2QG+eJKrvkNovwhhwJhnJ4+ScVfsGCHldmqLfcMTFs= get_header() wants the size of the reserved area in struct sigcontext, but instead we pass it the size of the entire struct. This could in theory result in an out-of-bounds read (if the signal frame is malformed). Fix this using one of the existing macros from tools/testing/selftests/arm64/signal/testcases/testcases.h. This issue was reported by Sashiko on a patch that copied this portion of the code. Link: https://sashiko.dev/#/patchset/20260421144252.1440365-1-kevin.brodsky= %40arm.com Fixes: f5b5ea51f78f ("selftests: mm: make protection_keys test work on arm6= 4") Signed-off-by: Kevin Brodsky Reviewed-by: Mark Brown --- tools/testing/selftests/mm/pkey-arm64.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/mm/pkey-arm64.h b/tools/testing/selfte= sts/mm/pkey-arm64.h index 8e9685e03c44..c5a78a2f211d 100644 --- a/tools/testing/selftests/mm/pkey-arm64.h +++ b/tools/testing/selftests/mm/pkey-arm64.h @@ -130,9 +130,10 @@ static inline u64 get_pkey_bits(u64 reg, int pkey) static inline void aarch64_write_signal_pkey(ucontext_t *uctxt, u64 pkey) { struct _aarch64_ctx *ctx =3D GET_UC_RESV_HEAD(uctxt); + size_t resv_size =3D GET_UCP_RESV_SIZE(uctxt); struct poe_context *poe_ctx =3D (struct poe_context *) get_header(ctx, POE_MAGIC, - sizeof(uctxt->uc_mcontext), NULL); + resv_size, NULL); if (poe_ctx) poe_ctx->por_el0 =3D pkey; } --=20 2.51.2 From nobody Wed Jun 17 01:42:49 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 202BF3B895A; Mon, 27 Apr 2026 12:04:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291447; cv=none; b=XgKrcfhJqxbfyyFOVTILBl4Xww7VJ9/BALn6iiNqWt+z1ZKTRIbptk5IOS7g7nl+L7sfPtDSm4SOHzHVZtjmEKtojmirRCmlJFcK/qiCXluaUBEsKYORJPw05KW7MqcNi+fcAS0gqbkVw+uH8ItqWMNjMDNKFiejRpH0WSYfj5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291447; c=relaxed/simple; bh=9abFZKGlP5VpbpK/xo3o3sS4A3nxNboOdLQrnuFuT/8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=J31xuadGO5E81xUZZJAnqZvKxXOrtC7aXJx/7Dc2Xe4H0iZww/a36WvNZG7osnMHbwCZag8E60WfvhfZXQAvJDIGLNriXhQ6+O074ROpJHH7iw80kmgPPudXW3AXqHf7aB9bCGhq4egC64aRY+FY353EyADJZnmdWr8/TU7Fpzs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=E5HTbU93; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="E5HTbU93" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 143C72403; Mon, 27 Apr 2026 05:04:00 -0700 (PDT) Received: from localhost.localdomain (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id EB5743F62B; Mon, 27 Apr 2026 05:04:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777291445; bh=9abFZKGlP5VpbpK/xo3o3sS4A3nxNboOdLQrnuFuT/8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=E5HTbU93SQIM8aVlcAPTi1uVCP1N/6UdLlfw1iB5ICYPNgHuTUaYxBrlXZgdkCuLz doZig4NlvoPQiazZPffunLwI4WTyOjdLVOfj9yPtNMeOvm4Vk+J/9q1RbO1OEzZETK uAgOe2oVcTpbcNK3SbT3QQTP8ajcOnuOP6toOKG4= From: Kevin Brodsky Date: Mon, 27 Apr 2026 13:03:35 +0100 Subject: [PATCH v2 3/5] kselftest/arm64: Add POE as a feature in the signal tests 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: <20260427-poe_signal-v2-3-2bd9d6f16ab4@arm.com> References: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> In-Reply-To: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Kevin Brodsky , Andrew Morton , Catalin Marinas , "David Hildenbrand (Arm)" , Joey Gouly , Mark Brown , Shuah Khan , Will Deacon , linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777291437; l=1828; i=kevin.brodsky@arm.com; s=20260427; h=from:subject:message-id; bh=9abFZKGlP5VpbpK/xo3o3sS4A3nxNboOdLQrnuFuT/8=; b=GTnr1c7p2Hin4jCm+yjPTqqelCqtlEX6rcqi1gm5BLqDAdM07xRTBou5V5Li0RVM+66g0W9+y P/t1n7po+HfAW3auqpcikvxL2xVW1CvymzvFNUOTdPkAlcmJ39/fx4f X-Developer-Key: i=kevin.brodsky@arm.com; a=ed25519; pk=N2QG+eJKrvkNovwhhwJhnJ4+ScVfsGCHldmqLfcMTFs= Add the POE feature to the signal tests framework, to allow tests to require it. Reviewed-by: Mark Brown Signed-off-by: Kevin Brodsky --- tools/testing/selftests/arm64/signal/test_signals.h | 2 ++ tools/testing/selftests/arm64/signal/test_signals_utils.c | 3 +++ 2 files changed, 5 insertions(+) diff --git a/tools/testing/selftests/arm64/signal/test_signals.h b/tools/te= sting/selftests/arm64/signal/test_signals.h index ee75a2c25ce7..c7c343494cb8 100644 --- a/tools/testing/selftests/arm64/signal/test_signals.h +++ b/tools/testing/selftests/arm64/signal/test_signals.h @@ -36,6 +36,7 @@ enum { FSME_FA64_BIT, FSME2_BIT, FGCS_BIT, + FPOE_BIT, FMAX_END }; =20 @@ -45,6 +46,7 @@ enum { #define FEAT_SME_FA64 (1UL << FSME_FA64_BIT) #define FEAT_SME2 (1UL << FSME2_BIT) #define FEAT_GCS (1UL << FGCS_BIT) +#define FEAT_POE (1UL << FPOE_BIT) =20 /* * A descriptor used to describe and configure a test case. diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.c b/to= ols/testing/selftests/arm64/signal/test_signals_utils.c index 5d3621921cfe..4b12dbd7669d 100644 --- a/tools/testing/selftests/arm64/signal/test_signals_utils.c +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.c @@ -31,6 +31,7 @@ static char const *const feats_names[FMAX_END] =3D { " FA64 ", " SME2 ", " GCS ", + " POE ", }; =20 #define MAX_FEATS_SZ 128 @@ -341,6 +342,8 @@ int test_init(struct tdescr *td) td->feats_supported |=3D FEAT_SME2; if (getauxval(AT_HWCAP) & HWCAP_GCS) td->feats_supported |=3D FEAT_GCS; + if (getauxval(AT_HWCAP2) & HWCAP2_POE) + td->feats_supported |=3D FEAT_POE; if (feats_ok(td)) { if (td->feats_required & td->feats_supported) fprintf(stderr, --=20 2.51.2 From nobody Wed Jun 17 01:42:49 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0D3883B8D78; Mon, 27 Apr 2026 12:04:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291449; cv=none; b=KeohPGCJ4GAZh7iF4vBJo2EzsshlltpQoVng9gXa9sZjsdikObWluVciUb20dro5gllO1L+1MFxHvOyapqCOcG5gYSvxLo2g4nkTzPrIVME8dZcnYbUx7j1Ds/U8SALhq4SDZtyA1JipHeowikhNJ3rdy9VdkTuJyavSGJuIIdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291449; c=relaxed/simple; bh=ldcRjHyX3ikGZr7TkP8sF4TKynkn1s47t2JOAAGYL7E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XiEsPdtWPxcbsUKqCxySlyk2IrY+B2UiKNrCTRvWh+wY3CRCdzZu55wYHHHxqAcfI3/yjGndz8JEZxQbSwfaZ027vR4FPTxXAuJYzU70ih4HU7czdyCABoefLV/ZR+snd4z0nbICY/+turiBdJPcn3TnSLyLjAgiGCT5vW2rQiM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=Miik+htN; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="Miik+htN" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 023032437; Mon, 27 Apr 2026 05:04:02 -0700 (PDT) Received: from localhost.localdomain (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id DA85A3F62B; Mon, 27 Apr 2026 05:04:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777291447; bh=ldcRjHyX3ikGZr7TkP8sF4TKynkn1s47t2JOAAGYL7E=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=Miik+htNqUHD8vM0xx8JqEjpijJJ/3fmWSdcOzhiUxUJX8LFyjsOuhSbRJ6QTtLCF x98ojX4IXXUjskp5T8b8iUrxWEOkFCf6JjJnIoySQSzjTKSt/V1TDI4v64H/FLFMrg 9YAfKQxrgNv/njWtR81B9dfN559OxTMw8e1GvVXQ= From: Kevin Brodsky Date: Mon, 27 Apr 2026 13:03:36 +0100 Subject: [PATCH v2 4/5] kselftest/arm64: Move/add POE helpers to test_signals_utils.h 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: <20260427-poe_signal-v2-4-2bd9d6f16ab4@arm.com> References: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> In-Reply-To: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Kevin Brodsky , Andrew Morton , Catalin Marinas , "David Hildenbrand (Arm)" , Joey Gouly , Mark Brown , Shuah Khan , Will Deacon , linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777291437; l=2017; i=kevin.brodsky@arm.com; s=20260427; h=from:subject:message-id; bh=ldcRjHyX3ikGZr7TkP8sF4TKynkn1s47t2JOAAGYL7E=; b=r24fR4zGfLVsqC3/BUO4grJOZYk9vXPaWiQGFFkqbpPG0E3bWUZYasLlLJnROsUstdfZcv6rz l5q3dEkmPbMB4V4cqfkWkRZN/jzikVM6ShcRdFYHENfVT5ULyQjmCrh X-Developer-Key: i=kevin.brodsky@arm.com; a=ed25519; pk=N2QG+eJKrvkNovwhhwJhnJ4+ScVfsGCHldmqLfcMTFs= In preparation to adding further POE signal tests, move get_por_el0() to test_signals_utils.h and add set_por_el0(). Reviewed-by: Mark Brown Signed-off-by: Kevin Brodsky --- .../testing/selftests/arm64/signal/test_signals_utils.h | 16 ++++++++++++= ++++ .../selftests/arm64/signal/testcases/poe_siginfo.c | 15 ------------= --- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tools/testing/selftests/arm64/signal/test_signals_utils.h b/to= ols/testing/selftests/arm64/signal/test_signals_utils.h index 36fc12b3cd60..2c7b8c64a35a 100644 --- a/tools/testing/selftests/arm64/signal/test_signals_utils.h +++ b/tools/testing/selftests/arm64/signal/test_signals_utils.h @@ -57,6 +57,22 @@ static inline __attribute__((always_inline)) uint64_t ge= t_gcspr_el0(void) return val; } =20 +#define SYS_POR_EL0 "S3_3_C10_C2_4" + +static inline uint64_t get_por_el0(void) +{ + uint64_t val; + + asm volatile("mrs %0, " SYS_POR_EL0 "\n" : "=3Dr"(val)); + + return val; +} + +static inline void set_por_el0(uint64_t val) +{ + asm volatile("msr " SYS_POR_EL0 ", %0\n" :: "r"(val)); +} + static inline bool feats_ok(struct tdescr *td) { if (td->feats_incompatible & td->feats_supported) diff --git a/tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c b= /tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c index 36bd9940ee05..e15fedf4da6e 100644 --- a/tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c +++ b/tools/testing/selftests/arm64/signal/testcases/poe_siginfo.c @@ -21,21 +21,6 @@ static union { char buf[1024 * 128]; } context; =20 -#define SYS_POR_EL0 "S3_3_C10_C2_4" - -static uint64_t get_por_el0(void) -{ - uint64_t val; - - asm volatile( - "mrs %0, " SYS_POR_EL0 "\n" - : "=3Dr"(val) - : - : ); - - return val; -} - int poe_present(struct tdescr *td, siginfo_t *si, ucontext_t *uc) { struct _aarch64_ctx *head =3D GET_BUF_RESV_HEAD(context); --=20 2.51.2 From nobody Wed Jun 17 01:42:49 2026 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EE2F53B9601; Mon, 27 Apr 2026 12:04:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291451; cv=none; b=d65FpXQoDWQUtPrNrp9SDZh2EOynXFUmbw9NjrNAkNhVXDNokvgmgFRApc6etzGIYi3qR2YlpQm3x6Btj8AxKyoGwRCxgEB/FecSCPbOrd8DyO6XnVt4xyR/fU1JKxQDseOzCBtfcFzWacbZSyuAbDtoRLYENi+Fxji7VdfATNE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777291451; c=relaxed/simple; bh=W1D5lSXRtEDeQjde+9XAOouOpPIYvgXYBK0Xv65p3K0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jbCJePvn0i239XG3riG53birYo4WH6WhCfuMbzBRKe+e5Kxb6gNF6qVLV5wZoTRxd+65kQDXxVGwfPVMIydAkvO/ZjtVH9QfnVZXJfXygUADWrvBNd628+hYO55JUOvKBDSVxAdPO+OVhPWeLcvywgmE06YJCKG8vRzS91nWlqU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=FrcRXtyo; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="FrcRXtyo" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id EA2391684; Mon, 27 Apr 2026 05:04:03 -0700 (PDT) Received: from localhost.localdomain (e123572-lin.cambridge.arm.com [10.1.194.54]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CA1BE3F62B; Mon, 27 Apr 2026 05:04:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1777291449; bh=W1D5lSXRtEDeQjde+9XAOouOpPIYvgXYBK0Xv65p3K0=; h=From:Date:Subject:References:In-Reply-To:To:Cc:From; b=FrcRXtyoVN+V5QnRWUBcPP11+5QJboDFs/HJ+cJcNWlVL73mrj0coeJAWyJ6c00lz Ma1oL+zHBHNZpHbpiurhIeqZM4hAmR80fUOAiPEn+krHPySnbUvDCwR0rEMf0VARDX NM2JVBbf7eizQct9FKyZ/R6dTUecIOJ7Qf9bSXmg= From: Kevin Brodsky Date: Mon, 27 Apr 2026 13:03:37 +0100 Subject: [PATCH v2 5/5] kselftest/arm64: Add tests for POR_EL0 save/reset/restore 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: <20260427-poe_signal-v2-5-2bd9d6f16ab4@arm.com> References: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> In-Reply-To: <20260427-poe_signal-v2-0-2bd9d6f16ab4@arm.com> To: linux-arm-kernel@lists.infradead.org Cc: Kevin Brodsky , Andrew Morton , Catalin Marinas , "David Hildenbrand (Arm)" , Joey Gouly , Mark Brown , Shuah Khan , Will Deacon , linux-kselftest@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777291437; l=5057; i=kevin.brodsky@arm.com; s=20260427; h=from:subject:message-id; bh=W1D5lSXRtEDeQjde+9XAOouOpPIYvgXYBK0Xv65p3K0=; b=5XkTdq3N2XGqgMLfy65UGbovi8wThCf1OhK2p3M89xXvnTmO/hRQNDs1NU+gdq2uzLZO9C9BO laUnaCvsYZCATe6H8kHpDgAZSU5TxOL+f0VbJZHTFkICzz6VO6ioq6C X-Developer-Key: i=kevin.brodsky@arm.com; a=ed25519; pk=N2QG+eJKrvkNovwhhwJhnJ4+ScVfsGCHldmqLfcMTFs= POR_EL0 is expected to be: - Saved in the poe_context record - Reset to POR_EL0_INIT when invoking the signal handler - Restored from poe_context when returning from the signal handler Add a new test, poe_restore, to check that the save/reset/restore mechanism is working as intended. See commit 2e8a1acea859 ("arm64: signal: Improve POR_EL0 handling to avoid uaccess failures") for more details. This commit did not handle the case where poe_context is missing correctly. This was recently fixed; add a new test, poe_missing_poe_context, to check this case. Note: td->pass is only set to true at the very end, as an unexpected signal may occur in case of failure (especially in poe_missing_poe_context if POR_EL0 is restored to an invalid value). Failures are tracked with a global, failed_check. Signed-off-by: Kevin Brodsky --- .../signal/testcases/poe_missing_poe_context.c | 73 ++++++++++++++++++= ++++ .../selftests/arm64/signal/testcases/poe_restore.c | 64 +++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/tools/testing/selftests/arm64/signal/testcases/poe_missing_poe= _context.c b/tools/testing/selftests/arm64/signal/testcases/poe_missing_poe= _context.c new file mode 100644 index 000000000000..3f22d8cf6106 --- /dev/null +++ b/tools/testing/selftests/arm64/signal/testcases/poe_missing_poe_contex= t.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026 Arm Ltd + * + * Verify that the POR_EL0 register is left untouched on sigreturn if the + * POE frame record is missing. + */ + +#include + +#include "test_signals_utils.h" +#include "testcases.h" + +#define POR_EL0_INIT 0x07ul +#define POR_EL0_CUSTOM 0x77ul + +static bool failed_check; + +static bool modify_por_el0(struct tdescr *td) +{ + set_por_el0(POR_EL0_CUSTOM); + + return true; +} + +static int signal_remove_poe_context(struct tdescr *td, siginfo_t *si, + ucontext_t *uc) +{ + struct _aarch64_ctx *ctx =3D GET_UC_RESV_HEAD(uc); + size_t resv_size =3D GET_UCP_RESV_SIZE(uc); + struct _aarch64_ctx *poe_ctx_head; + + poe_ctx_head =3D get_header(ctx, POE_MAGIC, resv_size, NULL); + if (!poe_ctx_head) { + fprintf(stderr, "Missing poe_context record\n"); + failed_check =3D true; + return 0; + } + + /* + * Actually removing the record would require moving down the next + * records. An easier option is to turn it into an ESR record, which is + * ignored by sigreturn(). + */ + poe_ctx_head->magic =3D ESR_MAGIC; + + return 0; +} + +static void check_por_el0_preserved(struct tdescr *td) +{ + uint64_t por_el0 =3D get_por_el0(); + + if (por_el0 =3D=3D POR_EL0_INIT) { + fprintf(stderr, "POR_EL0 preserved\n"); + } else { + fprintf(stderr, "POR_EL0 unexpectedly set to %lx\n", por_el0); + failed_check =3D true; + } + + td->pass =3D !failed_check; +} + +struct tdescr tde =3D { + .name =3D "POR_EL0 missing poe_context", + .descr =3D "Remove poe_context record and check POR_EL0 is preserved", + .feats_required =3D FEAT_POE, + .timeout =3D 3, + .sig_trig =3D SIGUSR1, + .init =3D modify_por_el0, + .run =3D signal_remove_poe_context, + .check_result =3D check_por_el0_preserved, +}; diff --git a/tools/testing/selftests/arm64/signal/testcases/poe_restore.c b= /tools/testing/selftests/arm64/signal/testcases/poe_restore.c new file mode 100644 index 000000000000..9f9a61a4214d --- /dev/null +++ b/tools/testing/selftests/arm64/signal/testcases/poe_restore.c @@ -0,0 +1,64 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2026 Arm Ltd + * + * Verify that the POR_EL0 register is saved and restored as expected on s= ignal + * entry/return. + */ + +#include + +#include "test_signals_utils.h" +#include "testcases.h" + +#define POR_EL0_INIT 0x07ul +#define POR_EL0_CUSTOM 0x77ul + +static bool failed_check; + +static bool modify_por_el0(struct tdescr *td) +{ + set_por_el0(POR_EL0_CUSTOM); + + return true; +} + +static int signal_check_por_el0_reset(struct tdescr *td, siginfo_t *si, + ucontext_t *uc) +{ + uint64_t signal_por_el0 =3D get_por_el0(); + + if (signal_por_el0 !=3D POR_EL0_INIT) { + fprintf(stderr, "POR_EL0 is %lx in signal handler (expected %lx)\n", + signal_por_el0, POR_EL0_INIT); + failed_check =3D true; + } + + return 0; +} + +static void check_por_el0_restored(struct tdescr *td) +{ + uint64_t por_el0 =3D get_por_el0(); + + if (por_el0 =3D=3D POR_EL0_CUSTOM) { + fprintf(stderr, "POR_EL0 restored\n"); + } else { + fprintf(stderr, "POR_EL0 was %lx but is now %lx\n", + POR_EL0_CUSTOM, por_el0); + failed_check =3D true; + } + + td->pass =3D !failed_check; +} + +struct tdescr tde =3D { + .name =3D "POR_EL0 restore", + .descr =3D "Validate that POR_EL0 is saved/restored on signal entry/retur= n", + .feats_required =3D FEAT_POE, + .timeout =3D 3, + .sig_trig =3D SIGUSR1, + .init =3D modify_por_el0, + .run =3D signal_check_por_el0_reset, + .check_result =3D check_por_el0_restored, +}; --=20 2.51.2