Hi Joey, On Tue, Aug 06, 2024 at 03:31:03PM +0100, Joey Gouly wrote: > 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 || > + 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. I had a chat with Dave as well on this and, in principle, we don't want to add stuff to the signal frame unnecessarily, especially for old binaries that have no clue of pkeys. OTOH, it looks like too complicated for just 16 bytes. Also POR_EL0 all RWX is a valid combination, I don't think we should exclude it. If no pkey has been allocated, I guess we could skip this and it also matches the x86 description of the PKRU being guaranteed to be preserved only for the allocated keys. Do we reserve pkey 0 for arm64? I thought that's only an x86 thing to emulate execute-only mappings. Another corner case would be the signal handler doing a pkey_alloc() and willing to populate POR_EL0 on sigreturn. It will have to find room in the signal handler, though I don't think that's a problem. -- Catalin