From: Dave Martin <Dave.Martin@arm.com>
To: Joey Gouly <joey.gouly@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, akpm@linux-foundation.org,
aneesh.kumar@kernel.org, aneesh.kumar@linux.ibm.com,
bp@alien8.de, broonie@kernel.org, catalin.marinas@arm.com,
christophe.leroy@csgroup.eu, dave.hansen@linux.intel.com,
hpa@zytor.com, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org,
linuxppc-dev@lists.ozlabs.org, maz@kernel.org, mingo@redhat.com,
mpe@ellerman.id.au, naveen.n.rao@linux.ibm.com,
npiggin@gmail.com, oliver.upton@linux.dev, shuah@kernel.org,
szabolcs.nagy@arm.com, tglx@linutronix.de, will@kernel.org,
x86@kernel.org, kvmarm@lists.linux.dev
Subject: Re: [PATCH v4 18/29] arm64: add POE signal support
Date: Tue, 6 Aug 2024 16:00:17 +0100 [thread overview]
Message-ID: <ZrI6gRQWW8HU8p0/@e133380.arm.com> (raw)
In-Reply-To: <20240806143103.GB2017741@e124191.cambridge.arm.com>
On Tue, Aug 06, 2024 at 03:31:03PM +0100, Joey Gouly wrote:
> On Tue, Aug 06, 2024 at 11:35:32AM +0100, Joey Gouly wrote:
> > On Thu, Aug 01, 2024 at 05:22:45PM +0100, Dave Martin wrote:
> > > On Thu, Aug 01, 2024 at 04:54:41PM +0100, Joey Gouly wrote:
> > > > On Thu, Jul 25, 2024 at 05:00:18PM +0100, Dave Martin wrote:
> > > > > Hi,
> > > > >
> > > > > On Fri, May 03, 2024 at 02:01:36PM +0100, Joey Gouly wrote:
> > > > > > Add PKEY support to signals, by saving and restoring POR_EL0 from the stackframe.
> > > > > >
> > > > > > Signed-off-by: Joey Gouly <joey.gouly@arm.com>
> > > > > > Cc: Catalin Marinas <catalin.marinas@arm.com>
> > > > > > Cc: Will Deacon <will@kernel.org>
> > > > > > Reviewed-by: Mark Brown <broonie@kernel.org>
> > > > > > Acked-by: Szabolcs Nagy <szabolcs.nagy@arm.com>
> > > > > > ---
> > > > > > arch/arm64/include/uapi/asm/sigcontext.h | 7 ++++
> > > > > > arch/arm64/kernel/signal.c | 52 ++++++++++++++++++++++++
> > > > > > 2 files changed, 59 insertions(+)
> > > > > >
> > > > > > diff --git a/arch/arm64/include/uapi/asm/sigcontext.h b/arch/arm64/include/uapi/asm/sigcontext.h
> > > > > > index 8a45b7a411e0..e4cba8a6c9a2 100644
> > > > > > --- a/arch/arm64/include/uapi/asm/sigcontext.h
> > > > > > +++ b/arch/arm64/include/uapi/asm/sigcontext.h
> > > > >
> > > > > [...]
> > > > >
> > > > > > @@ -980,6 +1013,13 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
> > > > > > return err;
> > > > > > }
> > > > > >
> > > > > > + if (system_supports_poe()) {
> > > > > > + err = sigframe_alloc(user, &user->poe_offset,
> > > > > > + sizeof(struct poe_context));
> > > > > > + if (err)
> > > > > > + return err;
> > > > > > + }
> > > > > > +
> > > > > > return sigframe_alloc_end(user);
> > > > > > }
> > > > > >
> > > > > > @@ -1020,6 +1060,15 @@ static int setup_sigframe(struct rt_sigframe_user_layout *user,
> > > > > > __put_user_error(current->thread.fault_code, &esr_ctx->esr, err);
> > > > > > }
> > > > > >
> > > > > > + if (system_supports_poe() && err == 0 && user->poe_offset) {
> > > > > > + struct poe_context __user *poe_ctx =
> > > > > > + apply_user_offset(user, user->poe_offset);
> > > > > > +
> > > > > > + __put_user_error(POE_MAGIC, &poe_ctx->head.magic, err);
> > > > > > + __put_user_error(sizeof(*poe_ctx), &poe_ctx->head.size, err);
> > > > > > + __put_user_error(read_sysreg_s(SYS_POR_EL0), &poe_ctx->por_el0, err);
> > > > > > + }
> > > > > > +
> > > > >
> > > > > Does the AArch64 procedure call standard say anything about whether
> > > > > POR_EL0 is caller-saved?
> > > >
> > > > I asked about this, and it doesn't say anything and they don't plan on it,
> > > > since it's very application specific.
> > >
> > > Right. I think that confirms that we don't absolutely need to preserve
> > > POR_EL0, because if compiler-generated code was allowed to fiddle with
> > > this and not clean up after itself, the PCS would have to document this.
> > >
> > > > >
> > > > > <bikeshed>
> > > > >
> > > > > In theory we could skip saving this register if it is already
> > > > > POR_EL0_INIT (which it often will be), and if the signal handler is not
> > > > > supposed to modify and leave the modified value in the register when
> > > > > returning.
> > > > >
> > > > > The complexity of the additional check my be a bit pointless though,
> > > > > and the the handler might theoretically want to change the interrupted
> > > > > code's POR_EL0 explicitly, which would be complicated if POE_MAGIC is
> > > > > sometimes there and sometimes not.
> > > > >
> > > > > </bikeshed>
> > > > >
> > > > I think trying to skip/optimise something here would be more effort than any
> > > > possible benefits!
> > >
> > > Actually, having thought about this some more I think that only dumping
> > > this register if != POR_EL0_INIT may be right right thing to do.
> > >
> > > This would mean that old binary would stacks never see poe_context in
> > > the signal frame, and so will never experience unexpected stack
> > > overruns (at least, not due solely to the presence of this feature).
> >
> > They can already see things they don't expect, like FPMR that was added
> > recently.
> >
> > >
> > > POE-aware signal handlers have to do something fiddly and nonportable
> > > to obtain the original value of POR_EL0 regardless, so requiring them
> > > do handle both cases (present in sigframe and absent) doesn't seem too
> > > onerous to me.
> >
> > If the signal handler wanted to modify the value, from the default, wouldn't it
> > need to mess around with the sig context stuff, to allocate some space for
> > POR_EL0, such that the kernel would restore it properly? (If that's even
> > possible).
> >
> > >
> > >
> > > Do you think this approach would break any known use cases?
> >
> > Not sure.
> >
>
> We talked about this offline, helped me understand it more, and I think
> something like this makes sense:
>
> diff --git arch/arm64/kernel/signal.c arch/arm64/kernel/signal.c
> index 561986947530..ca7d4e0be275 100644
> --- arch/arm64/kernel/signal.c
> +++ arch/arm64/kernel/signal.c
> @@ -1024,7 +1025,10 @@ static int setup_sigframe_layout(struct rt_sigframe_user_layout *user,
> return err;
> }
>
> - if (system_supports_poe()) {
> + if (system_supports_poe() &&
> + (add_all ||
> + mm_pkey_allocation_map(current->mm) != 0x1 ||
We probably ought to holding the mm lock for read around this (as in
mm/mprotect.c:pkey_alloc()), or have a wrapper to encapsulate that.
Signal delivery is not fast path, so I think we should stick to the
simple and obviously correct approach rather than trying to be
lockless (at least until somebody comes up with a compelling reason to
change it).
If doing that, we should probably put the condition on the allocation
map last so that we don't take the lock unnecessarily.
> + read_sysreg_s(SYS_POR_EL0) != POR_EL0_INIT)) {
> err = sigframe_alloc(user, &user->poe_offset,
> sizeof(struct poe_context));
> if (err)
>
>
> That is, we only save the POR_EL0 value if any pkeys have been allocated (other
> than pkey 0) *or* if POR_EL0 is a non-default value.
>
> The latter case is a corner case, where a userspace would have changed POR_EL0
> before allocating any extra pkeys.
> That could be:
> - pkey 0, if it restricts pkey 0 without allocating other pkeys, it's
> unlikely the program can do anything useful anyway
> - Another pkey, which userspace probably shouldn't do anyway.
> The man pages say:
> The kernel guarantees that the contents of the hardware rights
> register (PKRU) will be preserved only for allocated protection keys. Any time
> a key is unallocated (either before the first call returning that key from
> pkey_alloc() or after it is freed via pkey_free()), the kernel may make
> arbitrary changes to the parts of the rights register affecting access to that
> key.
> So userspace shouldn't be changing POR_EL0 before allocating pkeys anyway..
>
> Thanks,
> Joey
This seems better, thanks.
I'll leave it for others to comment on whether this is an issue for any
pkeys use case, but it does mean that non-POE-aware arm64 code
shouldn't see any impact on the signal handling side.
Your new approach means that poe_context is always present in the
sigframe for code that is using POE, so I think that reasonable
scenarios of wanting to change the POR_EL0 value for sigreturn ought
to work.
Processes that contain a mixture of POE and non-POE code are a bit more
of a grey area, but I think that libraries should not be arbitrarily
commandeering pkeys since they have no way to be sure that won't break
the calling program... I'm assuming that we won't have to worry about
that scenario in practice.
Cheers
---Dave
next prev parent reply other threads:[~2024-08-06 15:00 UTC|newest]
Thread overview: 146+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-03 13:01 [PATCH v4 00/29] arm64: Permission Overlay Extension Joey Gouly
2024-05-03 13:01 ` [PATCH v4 01/29] powerpc/mm: add ARCH_PKEY_BITS to Kconfig Joey Gouly
2024-05-06 8:57 ` Michael Ellerman
2024-05-03 13:01 ` [PATCH v4 02/29] x86/mm: " Joey Gouly
2024-05-03 16:40 ` Dave Hansen
2024-05-03 13:01 ` [PATCH v4 03/29] mm: use ARCH_PKEY_BITS to define VM_PKEY_BITN Joey Gouly
2024-05-03 16:41 ` Dave Hansen
2024-07-15 7:53 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 04/29] arm64: disable trapping of POR_EL0 to EL2 Joey Gouly
2024-07-15 7:47 ` Anshuman Khandual
2024-07-25 15:44 ` Dave Martin
2024-08-06 10:04 ` Joey Gouly
2024-05-03 13:01 ` [PATCH v4 05/29] arm64: cpufeature: add Permission Overlay Extension cpucap Joey Gouly
2024-06-21 16:58 ` Catalin Marinas
2024-06-21 17:01 ` Catalin Marinas
2024-06-21 17:02 ` Catalin Marinas
2024-07-15 7:47 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 06/29] arm64: context switch POR_EL0 register Joey Gouly
2024-06-21 17:03 ` Catalin Marinas
2024-06-21 17:07 ` Catalin Marinas
2024-07-15 8:27 ` Anshuman Khandual
2024-07-16 13:21 ` Mark Brown
2024-07-18 14:16 ` Joey Gouly
2024-07-22 13:40 ` Kevin Brodsky
2024-07-25 15:46 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 07/29] KVM: arm64: Save/restore POE registers Joey Gouly
2024-05-29 15:43 ` Marc Zyngier
2024-08-16 14:55 ` Marc Zyngier
2024-08-16 15:13 ` Joey Gouly
2024-08-16 15:32 ` Marc Zyngier
2024-05-03 13:01 ` [PATCH v4 08/29] KVM: arm64: make kvm_at() take an OP_AT_* Joey Gouly
2024-05-29 15:46 ` Marc Zyngier
2024-07-15 8:36 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 09/29] KVM: arm64: use `at s1e1a` for POE Joey Gouly
2024-05-29 15:50 ` Marc Zyngier
2024-07-15 8:45 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 10/29] arm64: enable the Permission Overlay Extension for EL0 Joey Gouly
2024-06-21 17:04 ` Catalin Marinas
2024-07-15 9:13 ` Anshuman Khandual
2024-07-15 20:16 ` Mark Brown
2024-07-25 15:49 ` Dave Martin
2024-08-01 16:04 ` Joey Gouly
2024-08-01 16:31 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 11/29] arm64: re-order MTE VM_ flags Joey Gouly
2024-06-21 17:04 ` Catalin Marinas
2024-07-15 9:21 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 12/29] arm64: add POIndex defines Joey Gouly
2024-06-21 17:05 ` Catalin Marinas
2024-07-15 9:26 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 13/29] arm64: convert protection key into vm_flags and pgprot values Joey Gouly
2024-05-28 6:54 ` Amit Daniel Kachhap
2024-06-19 16:45 ` Catalin Marinas
2024-07-04 12:47 ` Joey Gouly
2024-07-08 17:22 ` Catalin Marinas
2024-07-16 9:05 ` Anshuman Khandual
2024-07-16 9:34 ` Joey Gouly
2024-07-25 15:49 ` Dave Martin
2024-08-01 10:55 ` Joey Gouly
2024-08-01 11:01 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 14/29] arm64: mask out POIndex when modifying a PTE Joey Gouly
2024-07-16 9:10 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 15/29] arm64: handle PKEY/POE faults Joey Gouly
2024-06-21 16:57 ` Catalin Marinas
2024-07-09 13:03 ` Kevin Brodsky
2024-07-16 10:13 ` Anshuman Khandual
2024-07-25 15:57 ` Dave Martin
2024-08-01 16:01 ` Joey Gouly
2024-08-06 13:33 ` Dave Martin
2024-08-06 13:43 ` Joey Gouly
2024-08-06 14:38 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 16/29] arm64: add pte_access_permitted_no_overlay() Joey Gouly
2024-06-21 17:15 ` Catalin Marinas
2024-07-16 10:21 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 17/29] arm64: implement PKEYS support Joey Gouly
2024-05-28 6:55 ` Amit Daniel Kachhap
2024-05-28 11:26 ` Joey Gouly
2024-05-31 14:57 ` Szabolcs Nagy
2024-05-31 15:21 ` Joey Gouly
2024-05-31 16:27 ` Szabolcs Nagy
2024-06-17 13:40 ` Florian Weimer
2024-06-17 14:51 ` Szabolcs Nagy
2024-07-08 17:53 ` Catalin Marinas
2024-07-09 8:32 ` Szabolcs Nagy
2024-07-09 8:52 ` Florian Weimer
2024-07-11 9:50 ` Joey Gouly
2024-07-18 14:45 ` Szabolcs Nagy
2024-07-05 16:59 ` Catalin Marinas
2024-07-22 13:39 ` Kevin Brodsky
2024-07-09 13:07 ` Kevin Brodsky
2024-07-16 11:40 ` Anshuman Khandual
2024-07-23 4:22 ` Anshuman Khandual
2024-07-25 16:12 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 18/29] arm64: add POE signal support Joey Gouly
2024-05-28 6:56 ` Amit Daniel Kachhap
2024-05-31 16:39 ` Mark Brown
2024-06-03 9:21 ` Amit Daniel Kachhap
2024-07-25 15:58 ` Dave Martin
2024-07-25 18:11 ` Mark Brown
2024-07-26 16:14 ` Dave Martin
2024-07-26 17:39 ` Mark Brown
2024-07-29 14:27 ` Dave Martin
2024-07-29 14:41 ` Mark Brown
2024-07-05 17:04 ` Catalin Marinas
2024-07-09 13:08 ` Kevin Brodsky
2024-07-22 9:16 ` Anshuman Khandual
2024-07-25 16:00 ` Dave Martin
2024-08-01 15:54 ` Joey Gouly
2024-08-01 16:22 ` Dave Martin
2024-08-06 10:35 ` Joey Gouly
2024-08-06 14:31 ` Joey Gouly
2024-08-06 15:00 ` Dave Martin [this message]
2024-08-14 15:03 ` Catalin Marinas
2024-08-15 13:18 ` Joey Gouly
2024-08-15 15:09 ` Dave Martin
2024-08-15 15:24 ` Mark Brown
2024-08-19 17:09 ` Catalin Marinas
2024-08-20 9:54 ` Joey Gouly
2024-08-20 13:54 ` Dave Martin
2024-08-20 14:06 ` Joey Gouly
2024-08-20 14:45 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 19/29] arm64: enable PKEY support for CPUs with S1POE Joey Gouly
2024-07-16 10:47 ` Anshuman Khandual
2024-07-25 15:48 ` Dave Martin
2024-07-25 16:00 ` Dave Martin
2024-05-03 13:01 ` [PATCH v4 20/29] arm64: enable POE and PIE to coexist Joey Gouly
2024-06-21 17:16 ` Catalin Marinas
2024-07-16 10:41 ` Anshuman Khandual
2024-07-16 13:46 ` Joey Gouly
2024-05-03 13:01 ` [PATCH v4 21/29] arm64/ptrace: add support for FEAT_POE Joey Gouly
2024-07-16 10:35 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 22/29] arm64: add Permission Overlay Extension Kconfig Joey Gouly
2024-07-05 17:05 ` Catalin Marinas
2024-07-09 13:08 ` Kevin Brodsky
2024-07-16 11:02 ` Anshuman Khandual
2024-05-03 13:01 ` [PATCH v4 23/29] kselftest/arm64: move get_header() Joey Gouly
2024-05-03 13:01 ` [PATCH v4 24/29] selftests: mm: move fpregs printing Joey Gouly
2024-05-03 13:01 ` [PATCH v4 25/29] selftests: mm: make protection_keys test work on arm64 Joey Gouly
2024-05-03 13:01 ` [PATCH v4 26/29] kselftest/arm64: add HWCAP test for FEAT_S1POE Joey Gouly
2024-05-03 13:01 ` [PATCH v4 27/29] kselftest/arm64: parse POE_MAGIC in a signal frame Joey Gouly
2024-05-03 13:01 ` [PATCH v4 28/29] kselftest/arm64: Add test case for POR_EL0 signal frame records Joey Gouly
2024-05-29 15:51 ` Mark Brown
2024-07-05 19:34 ` Shuah Khan
2024-07-09 13:10 ` Kevin Brodsky
2024-05-03 13:01 ` [PATCH v4 29/29] KVM: selftests: get-reg-list: add Permission Overlay registers Joey Gouly
2024-05-05 14:41 ` [PATCH v4 00/29] arm64: Permission Overlay Extension Mark Brown
2024-05-28 11:30 ` Joey Gouly
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=ZrI6gRQWW8HU8p0/@e133380.arm.com \
--to=dave.martin@arm.com \
--cc=akpm@linux-foundation.org \
--cc=aneesh.kumar@kernel.org \
--cc=aneesh.kumar@linux.ibm.com \
--cc=bp@alien8.de \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=christophe.leroy@csgroup.eu \
--cc=dave.hansen@linux.intel.com \
--cc=hpa@zytor.com \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=maz@kernel.org \
--cc=mingo@redhat.com \
--cc=mpe@ellerman.id.au \
--cc=naveen.n.rao@linux.ibm.com \
--cc=npiggin@gmail.com \
--cc=oliver.upton@linux.dev \
--cc=shuah@kernel.org \
--cc=szabolcs.nagy@arm.com \
--cc=tglx@linutronix.de \
--cc=will@kernel.org \
--cc=x86@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