|
@@ -512,7 +512,7 @@ static void early_init_amd(struct cpuinfo_x86 *c)
|
|
|
|
|
|
static const int amd_erratum_383[];
|
|
|
static const int amd_erratum_400[];
|
|
|
-static bool cpu_has_amd_erratum(const int *erratum);
|
|
|
+static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum);
|
|
|
|
|
|
static void init_amd(struct cpuinfo_x86 *c)
|
|
|
{
|
|
@@ -729,11 +729,11 @@ static void init_amd(struct cpuinfo_x86 *c)
|
|
|
value &= ~(1ULL << 24);
|
|
|
wrmsrl_safe(MSR_AMD64_BU_CFG2, value);
|
|
|
|
|
|
- if (cpu_has_amd_erratum(amd_erratum_383))
|
|
|
+ if (cpu_has_amd_erratum(c, amd_erratum_383))
|
|
|
set_cpu_bug(c, X86_BUG_AMD_TLB_MMATCH);
|
|
|
}
|
|
|
|
|
|
- if (cpu_has_amd_erratum(amd_erratum_400))
|
|
|
+ if (cpu_has_amd_erratum(c, amd_erratum_400))
|
|
|
set_cpu_bug(c, X86_BUG_AMD_APIC_C1E);
|
|
|
|
|
|
rdmsr_safe(MSR_AMD64_PATCH_LEVEL, &c->microcode, &dummy);
|
|
@@ -878,23 +878,13 @@ static const int amd_erratum_400[] =
|
|
|
static const int amd_erratum_383[] =
|
|
|
AMD_OSVW_ERRATUM(3, AMD_MODEL_RANGE(0x10, 0, 0, 0xff, 0xf));
|
|
|
|
|
|
-static bool cpu_has_amd_erratum(const int *erratum)
|
|
|
+
|
|
|
+static bool cpu_has_amd_erratum(struct cpuinfo_x86 *cpu, const int *erratum)
|
|
|
{
|
|
|
- struct cpuinfo_x86 *cpu = __this_cpu_ptr(&cpu_info);
|
|
|
int osvw_id = *erratum++;
|
|
|
u32 range;
|
|
|
u32 ms;
|
|
|
|
|
|
- /*
|
|
|
- * If called early enough that current_cpu_data hasn't been initialized
|
|
|
- * yet, fall back to boot_cpu_data.
|
|
|
- */
|
|
|
- if (cpu->x86 == 0)
|
|
|
- cpu = &boot_cpu_data;
|
|
|
-
|
|
|
- if (cpu->x86_vendor != X86_VENDOR_AMD)
|
|
|
- return false;
|
|
|
-
|
|
|
if (osvw_id >= 0 && osvw_id < 65536 &&
|
|
|
cpu_has(cpu, X86_FEATURE_OSVW)) {
|
|
|
u64 osvw_len;
|