lkml.org 
[lkml]   [2021]   [May]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v27 04/31] x86/cpufeatures: Introduce CPU setup and option parsing for CET
    Date
    Introduce CPU setup and boot option parsing for CET features.

    Signed-off-by: Yu-cheng Yu <yu-cheng.yu@intel.com>
    Cc: Kees Cook <keescook@chromium.org>
    ---
    v25:
    - Remove software-defined X86_FEATURE_CET.

    v24:
    - Update #ifdef placement to reflect Kconfig changes of splitting shadow stack and ibt.

    arch/x86/include/uapi/asm/processor-flags.h | 2 ++
    arch/x86/kernel/cpu/common.c | 14 ++++++++++++++
    2 files changed, 16 insertions(+)

    diff --git a/arch/x86/include/uapi/asm/processor-flags.h b/arch/x86/include/uapi/asm/processor-flags.h
    index bcba3c643e63..a8df907e8017 100644
    --- a/arch/x86/include/uapi/asm/processor-flags.h
    +++ b/arch/x86/include/uapi/asm/processor-flags.h
    @@ -130,6 +130,8 @@
    #define X86_CR4_SMAP _BITUL(X86_CR4_SMAP_BIT)
    #define X86_CR4_PKE_BIT 22 /* enable Protection Keys support */
    #define X86_CR4_PKE _BITUL(X86_CR4_PKE_BIT)
    +#define X86_CR4_CET_BIT 23 /* enable Control-flow Enforcement */
    +#define X86_CR4_CET _BITUL(X86_CR4_CET_BIT)

    /*
    * x86-64 Task Priority Register, CR8
    diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
    index a1b756c49a93..2612499b739e 100644
    --- a/arch/x86/kernel/cpu/common.c
    +++ b/arch/x86/kernel/cpu/common.c
    @@ -509,6 +509,14 @@ static __init int setup_disable_pku(char *arg)
    __setup("nopku", setup_disable_pku);
    #endif /* CONFIG_X86_64 */

    +static __always_inline void setup_cet(struct cpuinfo_x86 *c)
    +{
    + if (!cpu_feature_enabled(X86_FEATURE_SHSTK))
    + return;
    +
    + cr4_set_bits(X86_CR4_CET);
    +}
    +
    /*
    * Some CPU features depend on higher CPUID levels, which may not always
    * be available due to CPUID level capping or broken virtualization
    @@ -1253,6 +1261,11 @@ static void __init cpu_parse_early_param(void)
    if (cmdline_find_option_bool(boot_command_line, "noxsaves"))
    setup_clear_cpu_cap(X86_FEATURE_XSAVES);

    + if (cmdline_find_option_bool(boot_command_line, "no_user_shstk"))
    + setup_clear_cpu_cap(X86_FEATURE_SHSTK);
    + if (cmdline_find_option_bool(boot_command_line, "no_user_ibt"))
    + setup_clear_cpu_cap(X86_FEATURE_IBT);
    +
    arglen = cmdline_find_option(boot_command_line, "clearcpuid", arg, sizeof(arg));
    if (arglen <= 0)
    return;
    @@ -1592,6 +1605,7 @@ static void identify_cpu(struct cpuinfo_x86 *c)

    x86_init_rdrand(c);
    setup_pku(c);
    + setup_cet(c);

    /*
    * Clear/Set all flags overridden by options, need do it
    --
    2.21.0
    \
     
     \ /
      Last update: 2021-05-22 00:14    [W:4.678 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site