Thread (79 messages) 79 messages, 10 authors, 2018-11-14

Re: [PATCH v5 04/27] x86/fpu/xstate: Add XSAVES system states for shadow stack

From: Andy Lutomirski <luto@amacapital.net>
Date: 2018-11-08 21:23:09
Also in: linux-arch, linux-doc, linux-mm, lkml

On Thu, Nov 8, 2018 at 1:06 PM Yu-cheng Yu [off-list ref] wrote:
On Thu, 2018-11-08 at 12:46 -0800, Andy Lutomirski wrote:
quoted
On Thu, Oct 11, 2018 at 8:20 AM Yu-cheng Yu [off-list ref] wrote:
quoted
Intel Control-flow Enforcement Technology (CET) introduces the
following MSRs into the XSAVES system states.

    IA32_U_CET (user-mode CET settings),
    IA32_PL3_SSP (user-mode shadow stack),
    IA32_PL0_SSP (kernel-mode shadow stack),
    IA32_PL1_SSP (ring-1 shadow stack),
    IA32_PL2_SSP (ring-2 shadow stack).

Signed-off-by: Yu-cheng Yu <redacted>
---
 arch/x86/include/asm/fpu/types.h            | 22 +++++++++++++++++++++
 arch/x86/include/asm/fpu/xstate.h           |  4 +++-
 arch/x86/include/uapi/asm/processor-flags.h |  2 ++
 arch/x86/kernel/fpu/xstate.c                | 10 ++++++++++
 4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/arch/x86/include/asm/fpu/types.h
b/arch/x86/include/asm/fpu/types.h
index 202c53918ecf..e55d51d172f1 100644
--- a/arch/x86/include/asm/fpu/types.h
+++ b/arch/x86/include/asm/fpu/types.h
@@ -114,6 +114,9 @@ enum xfeature {
        XFEATURE_Hi16_ZMM,
        XFEATURE_PT_UNIMPLEMENTED_SO_FAR,
        XFEATURE_PKRU,
+       XFEATURE_RESERVED,
+       XFEATURE_SHSTK_USER,
+       XFEATURE_SHSTK_KERNEL,

        XFEATURE_MAX,
 };
@@ -128,6 +131,8 @@ enum xfeature {
 #define XFEATURE_MASK_Hi16_ZMM         (1 << XFEATURE_Hi16_ZMM)
 #define XFEATURE_MASK_PT               (1 <<
XFEATURE_PT_UNIMPLEMENTED_SO_FAR)
 #define XFEATURE_MASK_PKRU             (1 << XFEATURE_PKRU)
+#define XFEATURE_MASK_SHSTK_USER       (1 << XFEATURE_SHSTK_USER)
+#define XFEATURE_MASK_SHSTK_KERNEL     (1 << XFEATURE_SHSTK_KERNEL)

 #define XFEATURE_MASK_FPSSE            (XFEATURE_MASK_FP |
XFEATURE_MASK_SSE)
 #define XFEATURE_MASK_AVX512           (XFEATURE_MASK_OPMASK \
@@ -229,6 +234,23 @@ struct pkru_state {
        u32                             pad;
 } __packed;

+/*
+ * State component 11 is Control flow Enforcement user states
+ */
+struct cet_user_state {
+       u64 u_cet;      /* user control flow settings */
+       u64 user_ssp;   /* user shadow stack pointer */
+} __packed;
+
+/*
+ * State component 12 is Control flow Enforcement kernel states
+ */
+struct cet_kernel_state {
+       u64 kernel_ssp; /* kernel shadow stack */
+       u64 pl1_ssp;    /* ring-1 shadow stack */
+       u64 pl2_ssp;    /* ring-2 shadow stack */
+} __packed;
+
Why are these __packed?  It seems like it'll generate bad code for no
obvious purpose.
That prevents any possibility that the compiler will insert padding, although in
64-bit kernel this should not happen to either struct.  Also all xstate
components here are packed.
They both seem like bugs, perhaps.  As I understand it, __packed
removes padding, but it also forces the compiler to expect the fields
to be unaligned even if they are actually aligned.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help