|
@@ -116,14 +116,13 @@ struct sku_microcode {
|
|
u32 microcode;
|
|
u32 microcode;
|
|
};
|
|
};
|
|
static const struct sku_microcode spectre_bad_microcodes[] = {
|
|
static const struct sku_microcode spectre_bad_microcodes[] = {
|
|
- { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0B, 0x84 },
|
|
|
|
- { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0A, 0x84 },
|
|
|
|
- { INTEL_FAM6_KABYLAKE_DESKTOP, 0x09, 0x84 },
|
|
|
|
- { INTEL_FAM6_KABYLAKE_MOBILE, 0x0A, 0x84 },
|
|
|
|
- { INTEL_FAM6_KABYLAKE_MOBILE, 0x09, 0x84 },
|
|
|
|
|
|
+ { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0B, 0x80 },
|
|
|
|
+ { INTEL_FAM6_KABYLAKE_DESKTOP, 0x0A, 0x80 },
|
|
|
|
+ { INTEL_FAM6_KABYLAKE_DESKTOP, 0x09, 0x80 },
|
|
|
|
+ { INTEL_FAM6_KABYLAKE_MOBILE, 0x0A, 0x80 },
|
|
|
|
+ { INTEL_FAM6_KABYLAKE_MOBILE, 0x09, 0x80 },
|
|
{ INTEL_FAM6_SKYLAKE_X, 0x03, 0x0100013e },
|
|
{ INTEL_FAM6_SKYLAKE_X, 0x03, 0x0100013e },
|
|
{ INTEL_FAM6_SKYLAKE_X, 0x04, 0x0200003c },
|
|
{ INTEL_FAM6_SKYLAKE_X, 0x04, 0x0200003c },
|
|
- { INTEL_FAM6_SKYLAKE_MOBILE, 0x03, 0xc2 },
|
|
|
|
{ INTEL_FAM6_SKYLAKE_DESKTOP, 0x03, 0xc2 },
|
|
{ INTEL_FAM6_SKYLAKE_DESKTOP, 0x03, 0xc2 },
|
|
{ INTEL_FAM6_BROADWELL_CORE, 0x04, 0x28 },
|
|
{ INTEL_FAM6_BROADWELL_CORE, 0x04, 0x28 },
|
|
{ INTEL_FAM6_BROADWELL_GT3E, 0x01, 0x1b },
|
|
{ INTEL_FAM6_BROADWELL_GT3E, 0x01, 0x1b },
|
|
@@ -136,8 +135,6 @@ static const struct sku_microcode spectre_bad_microcodes[] = {
|
|
{ INTEL_FAM6_HASWELL_X, 0x02, 0x3b },
|
|
{ INTEL_FAM6_HASWELL_X, 0x02, 0x3b },
|
|
{ INTEL_FAM6_HASWELL_X, 0x04, 0x10 },
|
|
{ INTEL_FAM6_HASWELL_X, 0x04, 0x10 },
|
|
{ INTEL_FAM6_IVYBRIDGE_X, 0x04, 0x42a },
|
|
{ INTEL_FAM6_IVYBRIDGE_X, 0x04, 0x42a },
|
|
- /* Updated in the 20180108 release; blacklist until we know otherwise */
|
|
|
|
- { INTEL_FAM6_ATOM_GEMINI_LAKE, 0x01, 0x22 },
|
|
|
|
/* Observed in the wild */
|
|
/* Observed in the wild */
|
|
{ INTEL_FAM6_SANDYBRIDGE_X, 0x06, 0x61b },
|
|
{ INTEL_FAM6_SANDYBRIDGE_X, 0x06, 0x61b },
|
|
{ INTEL_FAM6_SANDYBRIDGE_X, 0x07, 0x712 },
|
|
{ INTEL_FAM6_SANDYBRIDGE_X, 0x07, 0x712 },
|
|
@@ -149,7 +146,7 @@ static bool bad_spectre_microcode(struct cpuinfo_x86 *c)
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(spectre_bad_microcodes); i++) {
|
|
for (i = 0; i < ARRAY_SIZE(spectre_bad_microcodes); i++) {
|
|
if (c->x86_model == spectre_bad_microcodes[i].model &&
|
|
if (c->x86_model == spectre_bad_microcodes[i].model &&
|
|
- c->x86_mask == spectre_bad_microcodes[i].stepping)
|
|
|
|
|
|
+ c->x86_stepping == spectre_bad_microcodes[i].stepping)
|
|
return (c->microcode <= spectre_bad_microcodes[i].microcode);
|
|
return (c->microcode <= spectre_bad_microcodes[i].microcode);
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
@@ -196,7 +193,7 @@ static void early_init_intel(struct cpuinfo_x86 *c)
|
|
* need the microcode to have already been loaded... so if it is
|
|
* need the microcode to have already been loaded... so if it is
|
|
* not, recommend a BIOS update and disable large pages.
|
|
* not, recommend a BIOS update and disable large pages.
|
|
*/
|
|
*/
|
|
- if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_mask <= 2 &&
|
|
|
|
|
|
+ if (c->x86 == 6 && c->x86_model == 0x1c && c->x86_stepping <= 2 &&
|
|
c->microcode < 0x20e) {
|
|
c->microcode < 0x20e) {
|
|
pr_warn("Atom PSE erratum detected, BIOS microcode update recommended\n");
|
|
pr_warn("Atom PSE erratum detected, BIOS microcode update recommended\n");
|
|
clear_cpu_cap(c, X86_FEATURE_PSE);
|
|
clear_cpu_cap(c, X86_FEATURE_PSE);
|
|
@@ -212,7 +209,7 @@ static void early_init_intel(struct cpuinfo_x86 *c)
|
|
|
|
|
|
/* CPUID workaround for 0F33/0F34 CPU */
|
|
/* CPUID workaround for 0F33/0F34 CPU */
|
|
if (c->x86 == 0xF && c->x86_model == 0x3
|
|
if (c->x86 == 0xF && c->x86_model == 0x3
|
|
- && (c->x86_mask == 0x3 || c->x86_mask == 0x4))
|
|
|
|
|
|
+ && (c->x86_stepping == 0x3 || c->x86_stepping == 0x4))
|
|
c->x86_phys_bits = 36;
|
|
c->x86_phys_bits = 36;
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -310,7 +307,7 @@ int ppro_with_ram_bug(void)
|
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
|
if (boot_cpu_data.x86_vendor == X86_VENDOR_INTEL &&
|
|
boot_cpu_data.x86 == 6 &&
|
|
boot_cpu_data.x86 == 6 &&
|
|
boot_cpu_data.x86_model == 1 &&
|
|
boot_cpu_data.x86_model == 1 &&
|
|
- boot_cpu_data.x86_mask < 8) {
|
|
|
|
|
|
+ boot_cpu_data.x86_stepping < 8) {
|
|
pr_info("Pentium Pro with Errata#50 detected. Taking evasive action.\n");
|
|
pr_info("Pentium Pro with Errata#50 detected. Taking evasive action.\n");
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
@@ -327,7 +324,7 @@ static void intel_smp_check(struct cpuinfo_x86 *c)
|
|
* Mask B, Pentium, but not Pentium MMX
|
|
* Mask B, Pentium, but not Pentium MMX
|
|
*/
|
|
*/
|
|
if (c->x86 == 5 &&
|
|
if (c->x86 == 5 &&
|
|
- c->x86_mask >= 1 && c->x86_mask <= 4 &&
|
|
|
|
|
|
+ c->x86_stepping >= 1 && c->x86_stepping <= 4 &&
|
|
c->x86_model <= 3) {
|
|
c->x86_model <= 3) {
|
|
/*
|
|
/*
|
|
* Remember we have B step Pentia with bugs
|
|
* Remember we have B step Pentia with bugs
|
|
@@ -370,7 +367,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c)
|
|
* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until
|
|
* SEP CPUID bug: Pentium Pro reports SEP but doesn't have it until
|
|
* model 3 mask 3
|
|
* model 3 mask 3
|
|
*/
|
|
*/
|
|
- if ((c->x86<<8 | c->x86_model<<4 | c->x86_mask) < 0x633)
|
|
|
|
|
|
+ if ((c->x86<<8 | c->x86_model<<4 | c->x86_stepping) < 0x633)
|
|
clear_cpu_cap(c, X86_FEATURE_SEP);
|
|
clear_cpu_cap(c, X86_FEATURE_SEP);
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -388,7 +385,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c)
|
|
* P4 Xeon erratum 037 workaround.
|
|
* P4 Xeon erratum 037 workaround.
|
|
* Hardware prefetcher may cause stale data to be loaded into the cache.
|
|
* Hardware prefetcher may cause stale data to be loaded into the cache.
|
|
*/
|
|
*/
|
|
- if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_mask == 1)) {
|
|
|
|
|
|
+ if ((c->x86 == 15) && (c->x86_model == 1) && (c->x86_stepping == 1)) {
|
|
if (msr_set_bit(MSR_IA32_MISC_ENABLE,
|
|
if (msr_set_bit(MSR_IA32_MISC_ENABLE,
|
|
MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE_BIT) > 0) {
|
|
MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE_BIT) > 0) {
|
|
pr_info("CPU: C0 stepping P4 Xeon detected.\n");
|
|
pr_info("CPU: C0 stepping P4 Xeon detected.\n");
|
|
@@ -403,7 +400,7 @@ static void intel_workarounds(struct cpuinfo_x86 *c)
|
|
* Specification Update").
|
|
* Specification Update").
|
|
*/
|
|
*/
|
|
if (boot_cpu_has(X86_FEATURE_APIC) && (c->x86<<8 | c->x86_model<<4) == 0x520 &&
|
|
if (boot_cpu_has(X86_FEATURE_APIC) && (c->x86<<8 | c->x86_model<<4) == 0x520 &&
|
|
- (c->x86_mask < 0x6 || c->x86_mask == 0xb))
|
|
|
|
|
|
+ (c->x86_stepping < 0x6 || c->x86_stepping == 0xb))
|
|
set_cpu_bug(c, X86_BUG_11AP);
|
|
set_cpu_bug(c, X86_BUG_11AP);
|
|
|
|
|
|
|
|
|
|
@@ -650,7 +647,7 @@ static void init_intel(struct cpuinfo_x86 *c)
|
|
case 6:
|
|
case 6:
|
|
if (l2 == 128)
|
|
if (l2 == 128)
|
|
p = "Celeron (Mendocino)";
|
|
p = "Celeron (Mendocino)";
|
|
- else if (c->x86_mask == 0 || c->x86_mask == 5)
|
|
|
|
|
|
+ else if (c->x86_stepping == 0 || c->x86_stepping == 5)
|
|
p = "Celeron-A";
|
|
p = "Celeron-A";
|
|
break;
|
|
break;
|
|
|
|
|