On Thu, Jun 7, 2018 at 7:42 AM Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> wrote: > > Add PTRACE interface for CET MSRs. > > Signed-off-by: Yu-cheng Yu <yu-cheng.yu@xxxxxxxxx> > --- > arch/x86/include/asm/fpu/regset.h | 7 ++++--- > arch/x86/kernel/fpu/regset.c | 41 +++++++++++++++++++++++++++++++++++++++ > arch/x86/kernel/ptrace.c | 16 +++++++++++++++ > include/uapi/linux/elf.h | 1 + > 4 files changed, 62 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/include/asm/fpu/regset.h b/arch/x86/include/asm/fpu/regset.h > index d5bdffb9d27f..edad0d889084 100644 > --- a/arch/x86/include/asm/fpu/regset.h > +++ b/arch/x86/include/asm/fpu/regset.h > @@ -7,11 +7,12 @@ > > #include <linux/regset.h> > > -extern user_regset_active_fn regset_fpregs_active, regset_xregset_fpregs_active; > +extern user_regset_active_fn regset_fpregs_active, regset_xregset_fpregs_active, > + cetregs_active; > extern user_regset_get_fn fpregs_get, xfpregs_get, fpregs_soft_get, > - xstateregs_get; > + xstateregs_get, cetregs_get; > extern user_regset_set_fn fpregs_set, xfpregs_set, fpregs_soft_set, > - xstateregs_set; > + xstateregs_set, cetregs_set; > > /* > * xstateregs_active == regset_fpregs_active. Please refer to the comment > diff --git a/arch/x86/kernel/fpu/regset.c b/arch/x86/kernel/fpu/regset.c > index bc02f5144b95..7008eb084d36 100644 > --- a/arch/x86/kernel/fpu/regset.c > +++ b/arch/x86/kernel/fpu/regset.c > @@ -160,6 +160,47 @@ int xstateregs_set(struct task_struct *target, const struct user_regset *regset, > return ret; > } > > +int cetregs_active(struct task_struct *target, const struct user_regset *regset) > +{ > +#ifdef CONFIG_X86_INTEL_CET > + if (target->thread.cet.shstk_enabled || target->thread.cet.ibt_enabled) > + return regset->n; > +#endif > + return 0; > +} > + > +int cetregs_get(struct task_struct *target, const struct user_regset *regset, > + unsigned int pos, unsigned int count, > + void *kbuf, void __user *ubuf) > +{ > + struct fpu *fpu = &target->thread.fpu; > + struct cet_user_state *cetregs; > + > + if (!boot_cpu_has(X86_FEATURE_SHSTK)) > + return -ENODEV; This whole series has a boot_cpu_has, static_cpu_has, and cpu_feature_enabled all over. Please settle on just one, preferably static_cpu_has. > + > + cetregs = get_xsave_addr(&fpu->state.xsave, XFEATURE_MASK_SHSTK_USER); > + > + fpu__prepare_read(fpu); > + return user_regset_copyout(&pos, &count, &kbuf, &ubuf, cetregs, 0, -1); > +} > + > +int cetregs_set(struct task_struct *target, const struct user_regset *regset, > + unsigned int pos, unsigned int count, > + const void *kbuf, const void __user *ubuf) > +{ > + struct fpu *fpu = &target->thread.fpu; > + struct cet_user_state *cetregs; > + > + if (!boot_cpu_has(X86_FEATURE_SHSTK)) > + return -ENODEV; > + > + cetregs = get_xsave_addr(&fpu->state.xsave, XFEATURE_MASK_SHSTK_USER); > + > + fpu__prepare_write(fpu); > + return user_regset_copyin(&pos, &count, &kbuf, &ubuf, cetregs, 0, -1); Is this called for core dumping on current? If so, please make sure it's correct. (I think it is for get but maybe not for set.) -- To unsubscribe from this list: send the line "unsubscribe linux-doc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html