|
@@ -333,6 +333,19 @@ static void setup_pcid(struct cpuinfo_x86 *c)
|
|
|
{
|
|
|
if (cpu_has(c, X86_FEATURE_PCID)) {
|
|
|
if (cpu_has(c, X86_FEATURE_PGE)) {
|
|
|
+ /*
|
|
|
+ * We'd like to use cr4_set_bits_and_update_boot(),
|
|
|
+ * but we can't. CR4.PCIDE is special and can only
|
|
|
+ * be set in long mode, and the early CPU init code
|
|
|
+ * doesn't know this and would try to restore CR4.PCIDE
|
|
|
+ * prior to entering long mode.
|
|
|
+ *
|
|
|
+ * Instead, we rely on the fact that hotplug, resume,
|
|
|
+ * etc all fully restore CR4 before they write anything
|
|
|
+ * that could have nonzero PCID bits to CR3. CR4.PCIDE
|
|
|
+ * has no effect on the page tables themselves, so we
|
|
|
+ * don't need it to be restored early.
|
|
|
+ */
|
|
|
cr4_set_bits(X86_CR4_PCIDE);
|
|
|
} else {
|
|
|
/*
|