From: Dave Hansen <dave@sr71.net>
To: linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, x86@kernel.org, Dave Hansen <dave@sr71.net>,
dave.hansen@linux.intel.com
Subject: [PATCH 24/32] x86, pkeys: actually enable Memory Protection Keys in CPU
Date: Mon, 14 Dec 2015 11:06:22 -0800 [thread overview]
Message-ID: <20151214190622.8DAD0692@viggo.jf.intel.com> (raw)
In-Reply-To: <20151214190542.39C4886D@viggo.jf.intel.com>
From: Dave Hansen <dave.hansen@linux.intel.com>
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().
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
---
b/Documentation/kernel-parameters.txt | 3 ++
b/arch/x86/kernel/cpu/common.c | 41 ++++++++++++++++++++++++++++++++++
2 files changed, 44 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-12-14 10:42:49.619108474 -0800
+++ b/arch/x86/kernel/cpu/common.c 2015-12-14 10:42:49.624108698 -0800
@@ -289,6 +289,46 @@ static __always_inline void setup_smap(s
}
/*
+ * Protection Keys are not available in 32-bit mode.
+ */
+static bool pku_disabled;
+static __always_inline void setup_pku(struct cpuinfo_x86 *c)
+{
+ if (!cpu_has(c, X86_FEATURE_PKU))
+ return;
+ if (pku_disabled)
+ 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)
+{
+ /*
+ * Do not clear the X86_FEATURE_PKU bit. All of the
+ * runtime checks are against OSPKE so clearing the
+ * bit does nothing.
+ *
+ * This way, we will see "pku" in cpuinfo, but not
+ * "ospke", which is exactly what we want. It shows
+ * that the CPU has PKU, but the OS has not enabled it.
+ * This happens to be exactly how a system would look
+ * if we disabled the config option.
+ */
+ pr_info("x86: 'nopku' specified, disabling Memory Protection Keys\n");
+ pku_disabled = true;
+ 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.
@@ -948,6 +988,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-12-14 10:42:49.621108564 -0800
+++ b/Documentation/kernel-parameters.txt 2015-12-14 10:42:49.626108788 -0800
@@ -958,6 +958,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
_
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2015-12-14 19:06 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-12-14 19:05 [PATCH 00/32] x86: Memory Protection Keys (v7) Dave Hansen
2015-12-14 19:05 ` [PATCH 01/32] mm, gup: introduce concept of "foreign" get_user_pages() Dave Hansen
2016-01-05 10:51 ` Vlastimil Babka
2016-01-06 17:43 ` Dave Hansen
2015-12-14 19:05 ` [PATCH 02/32] x86, fpu: add placeholder for Processor Trace XSAVE state Dave Hansen
2015-12-14 19:05 ` [PATCH 03/32] x86, pkeys: Add Kconfig option Dave Hansen
2015-12-14 19:05 ` [PATCH 04/32] x86, pkeys: cpuid bit definition Dave Hansen
2015-12-14 19:05 ` [PATCH 05/32] x86, pkeys: define new CR4 bit Dave Hansen
2015-12-14 19:05 ` [PATCH 06/32] x86, pkeys: add PKRU xsave fields and data structure(s) Dave Hansen
2015-12-14 19:05 ` [PATCH 07/32] x86, pkeys: PTE bits for storing protection key Dave Hansen
2015-12-14 19:05 ` [PATCH 08/32] x86, pkeys: new page fault error code bit: PF_PK Dave Hansen
2015-12-14 19:06 ` [PATCH 09/32] x86, pkeys: store protection in high VMA flags Dave Hansen
2015-12-14 19:06 ` [PATCH 10/32] x86, pkeys: arch-specific protection bits Dave Hansen
2015-12-14 19:06 ` [PATCH 11/32] x86, pkeys: pass VMA down in to fault signal generation code Dave Hansen
2015-12-14 19:06 ` [PATCH 12/32] signals, pkeys: notify userspace about protection key faults Dave Hansen
2015-12-14 19:06 ` [PATCH 13/32] x86, pkeys: fill in pkey field in siginfo Dave Hansen
2015-12-14 19:06 ` [PATCH 14/32] x86, pkeys: add functions to fetch PKRU Dave Hansen
2015-12-14 19:56 ` Thomas Gleixner
2015-12-14 19:06 ` [PATCH 15/32] mm: factor out VMA fault permission checking Dave Hansen
2015-12-14 19:06 ` [PATCH 16/32] x86, mm: simplify get_user_pages() PTE bit handling Dave Hansen
2015-12-14 19:56 ` Thomas Gleixner
2015-12-14 19:06 ` [PATCH 17/32] x86, pkeys: check VMAs and PTEs for protection keys Dave Hansen
2015-12-14 19:06 ` [PATCH 18/32] mm: add gup flag to indicate "foreign" mm access Dave Hansen
2015-12-14 19:06 ` [PATCH 19/32] x86, pkeys: optimize fault handling in access_error() Dave Hansen
2015-12-14 19:06 ` [PATCH 20/32] x86, pkeys: differentiate instruction fetches Dave Hansen
2015-12-14 19:06 ` [PATCH 21/32] x86, pkeys: dump PKRU with other kernel registers Dave Hansen
2015-12-14 19:06 ` [PATCH 22/32] x86, pkeys: dump PTE pkey in /proc/pid/smaps Dave Hansen
2016-01-05 13:32 ` Vlastimil Babka
2016-01-06 17:46 ` Dave Hansen
2015-12-14 19:06 ` [PATCH 23/32] x86, pkeys: add Kconfig prompt to existing config option Dave Hansen
2015-12-14 19:06 ` Dave Hansen [this message]
2015-12-14 20:00 ` [PATCH 24/32] x86, pkeys: actually enable Memory Protection Keys in CPU Thomas Gleixner
2015-12-14 19:06 ` [PATCH 25/32] mm, multi-arch: pass a protection key in to calc_vm_flag_bits() Dave Hansen
2015-12-14 19:06 ` [PATCH 26/32] x86, pkeys: add arch_validate_pkey() Dave Hansen
2015-12-14 19:06 ` [PATCH 27/32] x86: separate out LDT init from context init Dave Hansen
2015-12-14 19:06 ` [PATCH 28/32] x86, fpu: allow setting of XSAVE state Dave Hansen
2015-12-14 19:06 ` [PATCH 29/32] x86, pkeys: allow kernel to modify user pkey rights register Dave Hansen
2015-12-14 19:06 ` [PATCH 30/32] x86, pkeys: create an x86 arch_calc_vm_prot_bits() for VMA flags Dave Hansen
2015-12-14 19:06 ` [PATCH 31/32] x86, pkeys: execute-only support Dave Hansen
2015-12-14 20:05 ` Kees Cook
2015-12-14 23:37 ` Dave Hansen
2015-12-14 23:39 ` Andy Lutomirski
2015-12-14 23:41 ` Kees Cook
2015-12-14 23:44 ` Dave Hansen
2015-12-14 23:47 ` Andy Lutomirski
2015-12-15 0:26 ` Dave Hansen
2015-12-14 23:39 ` Kees Cook
2015-12-14 19:06 ` [PATCH 32/32] x86, pkeys: Documentation Dave Hansen
2015-12-24 11:37 ` [PATCH 00/32] x86: Memory Protection Keys (v7) Michael Kerrisk (man-pages)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20151214190622.8DAD0692@viggo.jf.intel.com \
--to=dave@sr71.net \
--cc=dave.hansen@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).