Thread (16 messages) 16 messages, 5 authors, 2018-06-08

Re: [PATCH 7/7] x86/cet: Add PTRACE interface for CET

From: Andy Lutomirski <luto@amacapital.net>
Date: 2018-06-07 18:33:22
Also in: linux-arch, linux-mm, lkml

On Thu, Jun 7, 2018 at 7:42 AM Yu-cheng Yu [off-list ref] wrote:
quoted hunk ↗ jump to hunk
Add PTRACE interface for CET MSRs.

Signed-off-by: Yu-cheng Yu <redacted>
---
 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@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help