lkml.org 
[lkml]   [2016]   [Feb]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:mm/pkeys] x86/fpu, x86/mm/pkeys: Add PKRU xsave fields and data structures
    Commit-ID:  c8df40098451ba18a43f22b563c9129182353158
    Gitweb: http://git.kernel.org/tip/c8df40098451ba18a43f22b563c9129182353158
    Author: Dave Hansen <dave.hansen@linux.intel.com>
    AuthorDate: Fri, 12 Feb 2016 13:02:04 -0800
    Committer: Ingo Molnar <mingo@kernel.org>
    CommitDate: Tue, 16 Feb 2016 10:11:14 +0100

    x86/fpu, x86/mm/pkeys: Add PKRU xsave fields and data structures

    The protection keys register (PKRU) is saved and restored using
    xsave. Define the data structure that we will use to access it
    inside the xsave buffer.

    Note that we also have to widen the printk of the xsave feature
    masks since this is feature 0x200 and we only did two characters
    before.

    Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
    Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Dave Hansen <dave@sr71.net>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: linux-mm@kvack.org
    Link: http://lkml.kernel.org/r/20160212210204.56DF8F7B@viggo.jf.intel.com
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    ---
    arch/x86/include/asm/fpu/types.h | 11 +++++++++++
    arch/x86/include/asm/fpu/xstate.h | 3 ++-
    arch/x86/kernel/fpu/xstate.c | 7 ++++++-
    3 files changed, 19 insertions(+), 2 deletions(-)

    diff --git a/arch/x86/include/asm/fpu/types.h b/arch/x86/include/asm/fpu/types.h
    index aad3181..36b90bb 100644
    --- a/arch/x86/include/asm/fpu/types.h
    +++ b/arch/x86/include/asm/fpu/types.h
    @@ -109,6 +109,7 @@ enum xfeature {
    XFEATURE_ZMM_Hi256,
    XFEATURE_Hi16_ZMM,
    XFEATURE_PT_UNIMPLEMENTED_SO_FAR,
    + XFEATURE_PKRU,

    XFEATURE_MAX,
    };
    @@ -121,6 +122,7 @@ enum xfeature {
    #define XFEATURE_MASK_OPMASK (1 << XFEATURE_OPMASK)
    #define XFEATURE_MASK_ZMM_Hi256 (1 << XFEATURE_ZMM_Hi256)
    #define XFEATURE_MASK_Hi16_ZMM (1 << XFEATURE_Hi16_ZMM)
    +#define XFEATURE_MASK_PKRU (1 << XFEATURE_PKRU)

    #define XFEATURE_MASK_FPSSE (XFEATURE_MASK_FP | XFEATURE_MASK_SSE)
    #define XFEATURE_MASK_AVX512 (XFEATURE_MASK_OPMASK \
    @@ -213,6 +215,15 @@ struct avx_512_hi16_state {
    struct reg_512_bit hi16_zmm[16];
    } __packed;

    +/*
    + * State component 9: 32-bit PKRU register. The state is
    + * 8 bytes long but only 4 bytes is used currently.
    + */
    +struct pkru_state {
    + u32 pkru;
    + u32 pad;
    +} __packed;
    +
    struct xstate_header {
    u64 xfeatures;
    u64 xcomp_bv;
    diff --git a/arch/x86/include/asm/fpu/xstate.h b/arch/x86/include/asm/fpu/xstate.h
    index af30fde..9994d42 100644
    --- a/arch/x86/include/asm/fpu/xstate.h
    +++ b/arch/x86/include/asm/fpu/xstate.h
    @@ -28,7 +28,8 @@
    XFEATURE_MASK_YMM | \
    XFEATURE_MASK_OPMASK | \
    XFEATURE_MASK_ZMM_Hi256 | \
    - XFEATURE_MASK_Hi16_ZMM)
    + XFEATURE_MASK_Hi16_ZMM | \
    + XFEATURE_MASK_PKRU)

    /* All currently supported features */
    #define XCNTXT_MASK (XFEATURE_MASK_LAZY | XFEATURE_MASK_EAGER)
    diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c
    index c2e2349..a63ca80 100644
    --- a/arch/x86/kernel/fpu/xstate.c
    +++ b/arch/x86/kernel/fpu/xstate.c
    @@ -29,6 +29,8 @@ static const char *xfeature_names[] =
    "AVX-512 Hi256" ,
    "AVX-512 ZMM_Hi256" ,
    "Processor Trace (unused)" ,
    + "Protection Keys User registers",
    + "unknown xstate feature" ,
    };

    /*
    @@ -58,6 +60,7 @@ void fpu__xstate_clear_all_cpu_caps(void)
    setup_clear_cpu_cap(X86_FEATURE_AVX512CD);
    setup_clear_cpu_cap(X86_FEATURE_MPX);
    setup_clear_cpu_cap(X86_FEATURE_XGETBV1);
    + setup_clear_cpu_cap(X86_FEATURE_PKU);
    }

    /*
    @@ -236,7 +239,7 @@ static void __init print_xstate_feature(u64 xstate_mask)
    const char *feature_name;

    if (cpu_has_xfeatures(xstate_mask, &feature_name))
    - pr_info("x86/fpu: Supporting XSAVE feature 0x%02Lx: '%s'\n", xstate_mask, feature_name);
    + pr_info("x86/fpu: Supporting XSAVE feature 0x%03Lx: '%s'\n", xstate_mask, feature_name);
    }

    /*
    @@ -252,6 +255,7 @@ static void __init print_xstate_features(void)
    print_xstate_feature(XFEATURE_MASK_OPMASK);
    print_xstate_feature(XFEATURE_MASK_ZMM_Hi256);
    print_xstate_feature(XFEATURE_MASK_Hi16_ZMM);
    + print_xstate_feature(XFEATURE_MASK_PKRU);
    }

    /*
    @@ -468,6 +472,7 @@ static void check_xstate_against_struct(int nr)
    XCHECK_SZ(sz, nr, XFEATURE_OPMASK, struct avx_512_opmask_state);
    XCHECK_SZ(sz, nr, XFEATURE_ZMM_Hi256, struct avx_512_zmm_uppers_state);
    XCHECK_SZ(sz, nr, XFEATURE_Hi16_ZMM, struct avx_512_hi16_state);
    + XCHECK_SZ(sz, nr, XFEATURE_PKRU, struct pkru_state);

    /*
    * Make *SURE* to add any feature numbers in below if
    \
     
     \ /
      Last update: 2016-02-18 22:01    [W:2.605 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site