Message ID | 20201009194258.3207172-4-ira.weiny@intel.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | PKS: Add Protection Keys Supervisor (PKS) support RFC v3 | expand |
On 10/9/20 12:42 PM, ira.weiny@intel.com wrote: > +/* > + * PKS is independent of PKU and either or both may be supported on a CPU. > + * Configure PKS if the cpu supports the feature. > + */ Let's at least be consistent about CPU vs. cpu in a single comment. :) > +static void setup_pks(void) > +{ > + if (!IS_ENABLED(CONFIG_ARCH_HAS_SUPERVISOR_PKEYS)) > + return; > + if (!cpu_feature_enabled(X86_FEATURE_PKS)) > + return; If you put X86_FEATURE_PKS in disabled-features.h, you can get rid of the explicit CONFIG_ check. > + cr4_set_bits(X86_CR4_PKS); > +} > + > /* > * This does the hard work of actually picking apart the CPU stuff... > */ > @@ -1544,6 +1558,7 @@ static void identify_cpu(struct cpuinfo_x86 *c) > > x86_init_rdrand(c); > setup_pku(c); > + setup_pks(); > > /* > * Clear/Set all flags overridden by options, need do it > diff --git a/mm/Kconfig b/mm/Kconfig > index 6c974888f86f..1b9bc004d9bc 100644 > --- a/mm/Kconfig > +++ b/mm/Kconfig > @@ -822,6 +822,8 @@ config ARCH_USES_HIGH_VMA_FLAGS > bool > config ARCH_HAS_PKEYS > bool > +config ARCH_HAS_SUPERVISOR_PKEYS > + bool > > config PERCPU_STATS > bool "Collect percpu memory statistics" >
On Tue, Oct 13, 2020 at 11:23:08AM -0700, Dave Hansen wrote: > On 10/9/20 12:42 PM, ira.weiny@intel.com wrote: > > +/* > > + * PKS is independent of PKU and either or both may be supported on a CPU. > > + * Configure PKS if the cpu supports the feature. > > + */ > > Let's at least be consistent about CPU vs. cpu in a single comment. :) Sorry, done. > > > +static void setup_pks(void) > > +{ > > + if (!IS_ENABLED(CONFIG_ARCH_HAS_SUPERVISOR_PKEYS)) > > + return; > > + if (!cpu_feature_enabled(X86_FEATURE_PKS)) > > + return; > > If you put X86_FEATURE_PKS in disabled-features.h, you can get rid of > the explicit CONFIG_ check. Done. > > > + cr4_set_bits(X86_CR4_PKS); > > +} > > + > > /* > > * This does the hard work of actually picking apart the CPU stuff... > > */ > > @@ -1544,6 +1558,7 @@ static void identify_cpu(struct cpuinfo_x86 *c) > > > > x86_init_rdrand(c); > > setup_pku(c); > > + setup_pks(); > > > > /* > > * Clear/Set all flags overridden by options, need do it > > diff --git a/mm/Kconfig b/mm/Kconfig > > index 6c974888f86f..1b9bc004d9bc 100644 > > --- a/mm/Kconfig > > +++ b/mm/Kconfig > > @@ -822,6 +822,8 @@ config ARCH_USES_HIGH_VMA_FLAGS > > bool > > config ARCH_HAS_PKEYS > > bool > > +config ARCH_HAS_SUPERVISOR_PKEYS > > + bool > > > > config PERCPU_STATS > > bool "Collect percpu memory statistics" > > >
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 7101ac64bb20..1bfb912342a3 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -1873,6 +1873,7 @@ config X86_INTEL_MEMORY_PROTECTION_KEYS depends on X86_64 && (CPU_SUP_INTEL || CPU_SUP_AMD) select ARCH_USES_HIGH_VMA_FLAGS select ARCH_HAS_PKEYS + select ARCH_HAS_SUPERVISOR_PKEYS help Memory Protection Keys provides a mechanism for enforcing page-based protections, but without requiring modification of the diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h index 2901d5df4366..7646b03fc3f4 100644 --- a/arch/x86/include/asm/cpufeatures.h +++ b/arch/x86/include/asm/cpufeatures.h @@ -353,6 +353,7 @@ #define X86_FEATURE_CLDEMOTE (16*32+25) /* CLDEMOTE instruction */ #define X86_FEATURE_MOVDIRI (16*32+27) /* MOVDIRI instruction */ #define X86_FEATURE_MOVDIR64B (16*32+28) /* MOVDIR64B instruction */ +#define X86_FEATURE_PKS (16*32+31) /* Protection Keys for Supervisor pages */ /* AMD-defined CPU features, CPUID level 0x80000007 (EBX), word 17 */ #define X86_FEATURE_OVERFLOW_RECOV (17*32+ 0) /* MCA overflow recovery support */ diff --git a/arch/x86/include/uapi/asm/processor-flags.h b/arch/x86/include/uapi/asm/processor-flags.h index bcba3c643e63..191c574b2390 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_PKS_BIT 24 /* enable Protection Keys for Supervisor */ +#define X86_CR4_PKS _BITUL(X86_CR4_PKS_BIT) /* * x86-64 Task Priority Register, CR8 diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index c5d6f17d9b9d..a129d5e4afab 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c @@ -1447,6 +1447,20 @@ static void validate_apic_and_package_id(struct cpuinfo_x86 *c) #endif } +/* + * PKS is independent of PKU and either or both may be supported on a CPU. + * Configure PKS if the cpu supports the feature. + */ +static void setup_pks(void) +{ + if (!IS_ENABLED(CONFIG_ARCH_HAS_SUPERVISOR_PKEYS)) + return; + if (!cpu_feature_enabled(X86_FEATURE_PKS)) + return; + + cr4_set_bits(X86_CR4_PKS); +} + /* * This does the hard work of actually picking apart the CPU stuff... */ @@ -1544,6 +1558,7 @@ static void identify_cpu(struct cpuinfo_x86 *c) x86_init_rdrand(c); setup_pku(c); + setup_pks(); /* * Clear/Set all flags overridden by options, need do it diff --git a/mm/Kconfig b/mm/Kconfig index 6c974888f86f..1b9bc004d9bc 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -822,6 +822,8 @@ config ARCH_USES_HIGH_VMA_FLAGS bool config ARCH_HAS_PKEYS bool +config ARCH_HAS_SUPERVISOR_PKEYS + bool config PERCPU_STATS bool "Collect percpu memory statistics"