lkml.org 
[lkml]   [2018]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH 7/7] x86/cet: Add PTRACE interface for CET
    On Thu, Jun 7, 2018 at 7:42 AM Yu-cheng Yu <yu-cheng.yu@intel.com> wrote:
    >
    > Add PTRACE interface for CET MSRs.
    >
    > Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
    > ---
    > 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.)

    \
     
     \ /
      Last update: 2018-06-07 20:33    [W:2.951 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site