On Mon Nov 28, 2022 at 12:44 PM AEST, Benjamin Gray wrote: > Adds the definitions and generic handler for prctl control of the > PowerPC Dynamic Execution Control Register (DEXCR).
Assuming we'd go with the later prctl patches, this prep patch is nice way to split out some of the mechanism. Reviewed-by: Nicholas Piggin <npig...@gmail.com> > > Signed-off-by: Benjamin Gray <bg...@linux.ibm.com> > --- > include/uapi/linux/prctl.h | 14 ++++++++++++++ > kernel/sys.c | 16 ++++++++++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/include/uapi/linux/prctl.h b/include/uapi/linux/prctl.h > index a5e06dcbba13..b4720e8de6f3 100644 > --- a/include/uapi/linux/prctl.h > +++ b/include/uapi/linux/prctl.h > @@ -281,6 +281,20 @@ struct prctl_mm_map { > # define PR_SME_VL_LEN_MASK 0xffff > # define PR_SME_VL_INHERIT (1 << 17) /* inherit across exec */ > > +/* PowerPC Dynamic Execution Control Register (DEXCR) controls */ > +#define PR_PPC_GET_DEXCR 65 > +#define PR_PPC_SET_DEXCR 66 > +/* DEXCR aspect to act on */ > +# define PR_PPC_DEXCR_SBHE 0 /* Speculative branch hint enable */ > +# define PR_PPC_DEXCR_IBRTPD 1 /* Indirect branch recurrent target > prediction disable */ > +# define PR_PPC_DEXCR_SRAPD 2 /* Subroutine return address > prediction disable */ > +# define PR_PPC_DEXCR_NPHIE 3 /* Non-privileged hash instruction > enable */ > +/* Action to apply / return */ > +# define PR_PPC_DEXCR_PRCTL (1 << 0) > +# define PR_PPC_DEXCR_SET_ASPECT (1 << 1) > +# define PR_PPC_DEXCR_FORCE_SET_ASPECT (1 << 2) > +# define PR_PPC_DEXCR_CLEAR_ASPECT (1 << 3) > + > #define PR_SET_VMA 0x53564d41 > # define PR_SET_VMA_ANON_NAME 0 > > diff --git a/kernel/sys.c b/kernel/sys.c > index 5fd54bf0e886..55b8f7369059 100644 > --- a/kernel/sys.c > +++ b/kernel/sys.c > @@ -139,6 +139,12 @@ > #ifndef GET_TAGGED_ADDR_CTRL > # define GET_TAGGED_ADDR_CTRL() (-EINVAL) > #endif > +#ifndef PPC_GET_DEXCR_ASPECT > +# define PPC_GET_DEXCR_ASPECT(a, b) (-EINVAL) > +#endif > +#ifndef PPC_SET_DEXCR_ASPECT > +# define PPC_SET_DEXCR_ASPECT(a, b, c) (-EINVAL) > +#endif > > /* > * this is where the system-wide overflow UID and GID are defined, for > @@ -2623,6 +2629,16 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, > arg2, unsigned long, arg3, > error = sched_core_share_pid(arg2, arg3, arg4, arg5); > break; > #endif > + case PR_PPC_GET_DEXCR: > + if (arg3 || arg4 || arg5) > + return -EINVAL; > + error = PPC_GET_DEXCR_ASPECT(me, arg2); > + break; > + case PR_PPC_SET_DEXCR: > + if (arg4 || arg5) > + return -EINVAL; > + error = PPC_SET_DEXCR_ASPECT(me, arg2, arg3); > + break; > case PR_SET_VMA: > error = prctl_set_vma(arg2, arg3, arg4, arg5); > break; > -- > 2.38.1