lkml.org 
[lkml]   [2015]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 25/26] x86, pkeys: actually enable Memory Protection Keys in CPU
    From
    Date

    This sets the bit in 'cr4' to actually enable the protection
    keys feature. We also include a boot-time disable for the
    feature "nopku".

    Seting X86_CR4_PKE will cause the X86_FEATURE_OSPKE cpuid
    bit to appear set. At this point in boot, identify_cpu()
    has already run the actual CPUID instructions and populated
    the "cpu features" structures. We need to go back and
    re-run identify_cpu() to make sure it gets updated values.

    We *could* simply re-populate the 11th word of the cpuid
    data, but this is probably quick enough.

    Also note that with the cpu_has() check and X86_FEATURE_PKU
    present in disabled-features.h, we do not need an #ifdef
    for setup_pku().

    ---

    b/Documentation/kernel-parameters.txt | 3 +++
    b/arch/x86/kernel/cpu/common.c | 26 ++++++++++++++++++++++++++
    2 files changed, 29 insertions(+)

    diff -puN arch/x86/kernel/cpu/common.c~pkeys-50-should-be-last-patch arch/x86/kernel/cpu/common.c
    --- a/arch/x86/kernel/cpu/common.c~pkeys-50-should-be-last-patch 2015-09-16 09:45:55.420471313 -0700
    +++ b/arch/x86/kernel/cpu/common.c 2015-09-16 09:45:55.426471585 -0700
    @@ -289,6 +289,31 @@ static __always_inline void setup_smap(s
    }

    /*
    + * Protection Keys are not available in 32-bit mode.
    + */
    +static __always_inline void setup_pku(struct cpuinfo_x86 *c)
    +{
    + if (!cpu_has(c, X86_FEATURE_PKU))
    + return;
    +
    + cr4_set_bits(X86_CR4_PKE);
    + /*
    + * Seting X86_CR4_PKE will cause the X86_FEATURE_OSPKE
    + * cpuid bit to be set. We need to ensure that we
    + * update that bit in this CPU's "cpu_info".
    + */
    + get_cpu_cap(c);
    +}
    +#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
    +static __init int setup_disable_pku(char *arg)
    +{
    + setup_clear_cpu_cap(X86_FEATURE_PKU);
    + return 1;
    +}
    +__setup("nopku", setup_disable_pku);
    +#endif /* CONFIG_X86_64 */
    +
    +/*
    * Some CPU features depend on higher CPUID levels, which may not always
    * be available due to CPUID level capping or broken virtualization
    * software. Add those features to this table to auto-disable them.
    @@ -947,6 +972,7 @@ static void identify_cpu(struct cpuinfo_
    init_hypervisor(c);
    x86_init_rdrand(c);
    x86_init_cache_qos(c);
    + setup_pku(c);

    /*
    * Clear/Set all flags overriden by options, need do it
    diff -puN Documentation/kernel-parameters.txt~pkeys-50-should-be-last-patch Documentation/kernel-parameters.txt
    --- a/Documentation/kernel-parameters.txt~pkeys-50-should-be-last-patch 2015-09-16 09:45:55.422471404 -0700
    +++ b/Documentation/kernel-parameters.txt 2015-09-16 09:45:55.427471630 -0700
    @@ -955,6 +955,9 @@ bytes respectively. Such letter suffixes
    See Documentation/x86/intel_mpx.txt for more
    information about the feature.

    + nopku [X86] Disable Memory Protection Keys CPU feature found
    + in some Intel CPUs.
    +
    eagerfpu= [X86]
    on enable eager fpu restore
    off disable eager fpu restore
    _

    \
     
     \ /
      Last update: 2015-09-16 20:21    [W:3.869 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site