[PATCH v4 17/29] arm64: implement PKEYS support
Szabolcs Nagy
szabolcs.nagy at arm.com
Thu Jul 18 07:45:04 PDT 2024
The 07/11/2024 10:50, Joey Gouly wrote:
> On Mon, Jul 08, 2024 at 06:53:18PM +0100, Catalin Marinas wrote:
> > On Mon, Jun 17, 2024 at 03:51:35PM +0100, Szabolcs Nagy wrote:
> > > to me it makes sense to have abstract
> > >
> > > PKEY_DISABLE_READ
> > > PKEY_DISABLE_WRITE
> > > PKEY_DISABLE_EXECUTE
> > > PKEY_DISABLE_ACCESS
> > >
> > > where access is handled like
> > >
> > > if (flags&PKEY_DISABLE_ACCESS)
> > > flags |= PKEY_DISABLE_READ|PKEY_DISABLE_WRITE;
> > > disable_read = flags&PKEY_DISABLE_READ;
> > > disable_write = flags&PKEY_DISABLE_WRITE;
> > > disable_exec = flags&PKEY_DISABLE_EXECUTE;
...
> > On powerpc, PKEY_DISABLE_ACCESS also disables execution. AFAICT, the
...
> Seems to me that PKEY_DISABLE_ACCESS leaves exec permissions as-is.
assuming this is right the patch below looks
reasonable to me. thanks.
> Here is the patch I am planning to include in the next version of the series.
> This should support all PKEY_DISABLE_* combinations. Any comments?
>
> commit ba51371a544f6b0a4a0f03df62ad894d53f5039b
> Author: Joey Gouly <joey.gouly at arm.com>
> Date: Thu Jul 4 11:29:20 2024 +0100
>
> arm64: add PKEY_DISABLE_READ and PKEY_DISABLE_EXEC
it's PKEY_DISABLE_EXECUTE (fwiw i like the shorter
exec better but ppc seems to use execute)
>
> TODO
>
> Signed-off-by: Joey Gouly <joey.gouly at arm.com>
>
> diff --git arch/arm64/include/uapi/asm/mman.h arch/arm64/include/uapi/asm/mman.h
> index 1e6482a838e1..e7e0c8216243 100644
> --- arch/arm64/include/uapi/asm/mman.h
> +++ arch/arm64/include/uapi/asm/mman.h
> @@ -7,4 +7,13 @@
> #define PROT_BTI 0x10 /* BTI guarded page */
> #define PROT_MTE 0x20 /* Normal Tagged mapping */
>
> +/* Override any generic PKEY permission defines */
> +#define PKEY_DISABLE_EXECUTE 0x4
> +#define PKEY_DISABLE_READ 0x8
> +#undef PKEY_ACCESS_MASK
> +#define PKEY_ACCESS_MASK (PKEY_DISABLE_ACCESS |\
> + PKEY_DISABLE_WRITE |\
> + PKEY_DISABLE_READ |\
> + PKEY_DISABLE_EXECUTE)
> +
> #endif /* ! _UAPI__ASM_MMAN_H */
> diff --git arch/arm64/mm/mmu.c arch/arm64/mm/mmu.c
> index 68afe5fc3071..ce4cc6bdee4e 100644
> --- arch/arm64/mm/mmu.c
> +++ arch/arm64/mm/mmu.c
> @@ -1570,10 +1570,15 @@ int arch_set_user_pkey_access(struct task_struct *tsk, int pkey, unsigned long i
> return -EINVAL;
>
> /* Set the bits we need in POR: */
> + new_por = POE_RXW;
> + if (init_val & PKEY_DISABLE_WRITE)
> + new_por &= ~POE_W;
> if (init_val & PKEY_DISABLE_ACCESS)
> - new_por = POE_X;
> - else if (init_val & PKEY_DISABLE_WRITE)
> - new_por = POE_RX;
> + new_por &= ~POE_RW;
> + if (init_val & PKEY_DISABLE_READ)
> + new_por &= ~POE_R;
> + if (init_val & PKEY_DISABLE_EXECUTE)
> + new_por &= ~POE_X;
>
> /* Shift the bits in to the correct place in POR for pkey: */
> pkey_shift = pkey * POR_BITS_PER_PKEY;
>
>
>
> Thanks,
> Joey
More information about the linux-arm-kernel
mailing list