[PATCH 3/3] x86/cpuid: Make cpuinfo_x86.x86_model_id global

From: Borislav Petkov
Date: Wed Nov 14 2018 - 16:29:02 EST


From: Borislav Petkov <bp@xxxxxxx>

... and __ro_after_init. Since the brand string is being read earlier
now, in early_identify_cpu(), get_model_name() needs to read out the
extended CPUID level for the brand string. This is temporary only, until
the full CPUID read out has been added.

Signed-off-by: Borislav Petkov <bp@xxxxxxx>
Cc: linux-pm@xxxxxxxxxxxxxxx
Cc: linux-edac@xxxxxxxxxxxxxxx
Cc: linux-hwmon@xxxxxxxxxxxxxxx
Cc: platform-driver-x86@xxxxxxxxxxxxxxx
---
arch/x86/include/asm/processor.h | 2 +-
arch/x86/kernel/cpu/amd.c | 4 ++--
arch/x86/kernel/cpu/centaur.c | 2 +-
arch/x86/kernel/cpu/common.c | 28 ++++++++++++++--------------
arch/x86/kernel/cpu/cyrix.c | 5 ++---
arch/x86/kernel/cpu/intel.c | 2 +-
arch/x86/kernel/cpu/proc.c | 2 +-
arch/x86/kernel/setup.c | 2 ++
drivers/cpufreq/powernow-k8.c | 2 +-
drivers/cpufreq/speedstep-centrino.c | 6 +++---
drivers/cpufreq/speedstep-lib.c | 2 +-
drivers/edac/e752x_edac.c | 3 +--
drivers/hwmon/coretemp.c | 2 +-
drivers/hwmon/k10temp.c | 2 +-
drivers/platform/x86/intel_ips.c | 6 +++---
15 files changed, 35 insertions(+), 35 deletions(-)

diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
index 2f6f7939dfe0..ace1f364fb0c 100644
--- a/arch/x86/include/asm/processor.h
+++ b/arch/x86/include/asm/processor.h
@@ -70,6 +70,7 @@ extern u16 __read_mostly tlb_lld_4m[NR_INFO];
extern u16 __read_mostly tlb_lld_1g[NR_INFO];

extern char x86_vendor_id[16];
+extern char x86_model_id[64];

/*
* CPU type and hardware bug flags. Kept separately for each CPU.
@@ -95,7 +96,6 @@ struct cpuinfo_x86 {
/* Maximum supported CPUID level, -1=no CPUID: */
int cpuid_level;
__u32 x86_capability[NCAPINTS + NBUGINTS];
- char x86_model_id[64];
/* in KB - valid for CPUS which support this call: */
unsigned int x86_cache_size;
int x86_cache_alignment; /* In bytes */
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index eeea634bee0a..47aedc1240a2 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -737,8 +737,8 @@ static void init_amd_k8(struct cpuinfo_x86 *c)
}
}

- if (!c->x86_model_id[0])
- strcpy(c->x86_model_id, "Hammer");
+ if (!x86_model_id[0])
+ strcpy(x86_model_id, "Hammer");

#ifdef CONFIG_SMP
/*
diff --git a/arch/x86/kernel/cpu/centaur.c b/arch/x86/kernel/cpu/centaur.c
index 14433ff5b828..bab43a1588bc 100644
--- a/arch/x86/kernel/cpu/centaur.c
+++ b/arch/x86/kernel/cpu/centaur.c
@@ -239,7 +239,7 @@ static void init_centaur(struct cpuinfo_x86 *c)
/* Add L1 data and code cache sizes. */
c->x86_cache_size = (cc>>24)+(dd>>24);
}
- sprintf(c->x86_model_id, "WinChip %s", name);
+ sprintf(x86_model_id, "WinChip %s", name);
break;
#endif
case 6:
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index f77ca116fba7..0a96b6d56f13 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -95,9 +95,9 @@ static void default_init(struct cpuinfo_x86 *c)
if (c->cpuid_level == -1) {
/* No cpuid. It must be an ancient CPU */
if (c->x86 == 4)
- strcpy(c->x86_model_id, "486");
+ strcpy(x86_model_id, "486");
else if (c->x86 == 3)
- strcpy(c->x86_model_id, "386");
+ strcpy(x86_model_id, "386");
}
#endif
}
@@ -561,17 +561,18 @@ static void get_model_name(struct cpuinfo_x86 *c)
unsigned int *v;
char *p, *q, *s;

+ c->extended_cpuid_level = cpuid_eax(0x80000000);
if (c->extended_cpuid_level < 0x80000004)
return;

- v = (unsigned int *)c->x86_model_id;
+ v = (unsigned int *)x86_model_id;
cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
- c->x86_model_id[48] = 0;
+ x86_model_id[48] = 0;

/* Trim whitespace */
- p = q = s = &c->x86_model_id[0];
+ p = q = s = x86_model_id;

while (*p == ' ')
p++;
@@ -1089,6 +1090,7 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
/* cyrix could have cpuid enabled via c_identify()*/
if (have_cpuid_p()) {
cpu_get_vendor_name();
+ get_model_name(c);
cpu_detect(c);
get_cpu_vendor(c);
get_cpu_cap(c);
@@ -1232,8 +1234,6 @@ static void generic_identify(struct cpuinfo_x86 *c)
c->phys_proc_id = c->initial_apicid;
}

- get_model_name(c); /* Default name */
-
detect_null_seg_behavior(c);

/*
@@ -1308,7 +1308,6 @@ static void identify_cpu(struct cpuinfo_x86 *c)
c->x86_cache_size = 0;
c->x86_vendor = X86_VENDOR_UNKNOWN;
c->x86_model = c->x86_stepping = 0; /* So far unknown... */
- c->x86_model_id[0] = '\0'; /* Unset */
c->x86_max_cores = 1;
c->x86_coreid_bits = 0;
c->cu_id = 0xff;
@@ -1367,14 +1366,15 @@ static void identify_cpu(struct cpuinfo_x86 *c)
filter_cpuid_features(c, true);

/* If the model name is still unset, do table lookup. */
- if (!c->x86_model_id[0]) {
+ if (!x86_model_id[0]) {
const char *p;
+
p = table_lookup_model(c);
if (p)
- strcpy(c->x86_model_id, p);
+ strcpy(x86_model_id, p);
else
/* Last resort... */
- sprintf(c->x86_model_id, "%02x/%02x",
+ sprintf(x86_model_id, "%02x/%02x",
c->x86, c->x86_model);
}

@@ -1489,11 +1489,11 @@ void print_cpu_info(struct cpuinfo_x86 *c)
vendor = x86_vendor_id;
}

- if (vendor && !strstr(c->x86_model_id, vendor))
+ if (vendor && !strstr(x86_model_id, vendor))
pr_cont("%s ", vendor);

- if (c->x86_model_id[0])
- pr_cont("%s", c->x86_model_id);
+ if (x86_model_id[0])
+ pr_cont("%s", x86_model_id);
else
pr_cont("%d86", c->x86);

diff --git a/arch/x86/kernel/cpu/cyrix.c b/arch/x86/kernel/cpu/cyrix.c
index 1f1f724dd4c3..e5394251175c 100644
--- a/arch/x86/kernel/cpu/cyrix.c
+++ b/arch/x86/kernel/cpu/cyrix.c
@@ -191,7 +191,6 @@ static void early_init_cyrix(struct cpuinfo_x86 *c)
static void init_cyrix(struct cpuinfo_x86 *c)
{
unsigned char dir0, dir0_msn, dir0_lsn, dir1 = 0;
- char *buf = c->x86_model_id;
const char *p = NULL;

/*
@@ -351,9 +350,9 @@ static void init_cyrix(struct cpuinfo_x86 *c)
dir0_msn = 7;
break;
}
- strcpy(buf, Cx86_model[dir0_msn & 7]);
+ strcpy(x86_model_id, Cx86_model[dir0_msn & 7]);
if (p)
- strcat(buf, p);
+ strcat(x86_model_id, p);
return;
}

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index fc3c07fe7df5..f18115779e07 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -745,7 +745,7 @@ static void init_intel(struct cpuinfo_x86 *c)
}

if (p)
- strcpy(c->x86_model_id, p);
+ strcpy(x86_model_id, p);
}

if (c->x86 == 15)
diff --git a/arch/x86/kernel/cpu/proc.c b/arch/x86/kernel/cpu/proc.c
index 999371ddfedb..d048b22cb304 100644
--- a/arch/x86/kernel/cpu/proc.c
+++ b/arch/x86/kernel/cpu/proc.c
@@ -70,7 +70,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
x86_vendor_id[0] ? x86_vendor_id : "unknown",
c->x86,
c->x86_model,
- c->x86_model_id[0] ? c->x86_model_id : "unknown");
+ x86_model_id[0] ? x86_model_id : "unknown");

if (c->x86_stepping || c->cpuid_level >= 0)
seq_printf(m, "stepping\t: %d\n", c->x86_stepping);
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index 9f21f595f0de..21c372c66498 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -162,6 +162,8 @@ static struct resource bss_resource = {
};

char x86_vendor_id[16] __ro_after_init;
+char x86_model_id[64] __ro_after_init;
+EXPORT_SYMBOL_GPL(x86_model_id);

#ifdef CONFIG_X86_32
/* cpu data as detected by the assembly code in head_32.S */
diff --git a/drivers/cpufreq/powernow-k8.c b/drivers/cpufreq/powernow-k8.c
index fb77b39a4ce3..476bbca2fd43 100644
--- a/drivers/cpufreq/powernow-k8.c
+++ b/drivers/cpufreq/powernow-k8.c
@@ -1204,7 +1204,7 @@ static int powernowk8_init(void)
return ret;

pr_info("Found %d %s (%d cpu cores) (" VERSION ")\n",
- num_online_nodes(), boot_cpu_data.x86_model_id, supported_cpus);
+ num_online_nodes(), x86_model_id, supported_cpus);

return ret;
}
diff --git a/drivers/cpufreq/speedstep-centrino.c b/drivers/cpufreq/speedstep-centrino.c
index a1fb735685db..c0385ffb2732 100644
--- a/drivers/cpufreq/speedstep-centrino.c
+++ b/drivers/cpufreq/speedstep-centrino.c
@@ -238,21 +238,21 @@ static int centrino_cpu_init_table(struct cpufreq_policy *policy)
for(model = models; model->cpu_id != NULL; model++)
if (centrino_verify_cpu_id(cpu, model->cpu_id) &&
(model->model_name == NULL ||
- strcmp(cpu->x86_model_id, model->model_name) == 0))
+ strcmp(x86_model_id, model->model_name) == 0))
break;

if (model->cpu_id == NULL) {
/* No match at all */
pr_debug("no support for CPU model \"%s\": "
"send /proc/cpuinfo to " MAINTAINER "\n",
- cpu->x86_model_id);
+ x86_model_id);
return -ENOENT;
}

if (model->op_points == NULL) {
/* Matched a non-match */
pr_debug("no table support for CPU model \"%s\"\n",
- cpu->x86_model_id);
+ x86_model_id);
pr_debug("try using the acpi-cpufreq driver\n");
return -ENOENT;
}
diff --git a/drivers/cpufreq/speedstep-lib.c b/drivers/cpufreq/speedstep-lib.c
index cabb6f48eb77..aa83496f8734 100644
--- a/drivers/cpufreq/speedstep-lib.c
+++ b/drivers/cpufreq/speedstep-lib.c
@@ -312,7 +312,7 @@ enum speedstep_processor speedstep_detect_processor(void)
* string
*/
if ((ebx == 0x0e) ||
- (strstr(c->x86_model_id,
+ (strstr(x86_model_id,
"Mobile Intel(R) Pentium(R) 4") != NULL))
return SPEEDSTEP_CPU_P4M;
break;
diff --git a/drivers/edac/e752x_edac.c b/drivers/edac/e752x_edac.c
index b5de9a13ea3f..76304cbcd55d 100644
--- a/drivers/edac/e752x_edac.c
+++ b/drivers/edac/e752x_edac.c
@@ -1211,14 +1211,13 @@ static int e752x_get_devs(struct pci_dev *pdev, int dev_idx,
*/
static void e752x_init_sysbus_parity_mask(struct e752x_pvt *pvt)
{
- char *cpu_id = cpu_data(0).x86_model_id;
struct pci_dev *dev = pvt->dev_d0f1;
int enable = 1;

/* Allow module parameter override, else see if CPU supports parity */
if (sysbus_parity != -1) {
enable = sysbus_parity;
- } else if (cpu_id[0] && !strstr(cpu_id, "Xeon")) {
+ } else if (x86_model_id[0] && !strstr(x86_model_id, "Xeon")) {
e752x_printk(KERN_INFO, "System Bus Parity not "
"supported by CPU, disabling\n");
enable = 0;
diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
index 10645c9bb7be..b3e444975930 100644
--- a/drivers/hwmon/coretemp.c
+++ b/drivers/hwmon/coretemp.c
@@ -262,7 +262,7 @@ static int adjust_tjmax(struct cpuinfo_x86 *c, u32 id, struct device *dev)
}

for (i = 0; i < ARRAY_SIZE(tjmax_table); i++) {
- if (strstr(c->x86_model_id, tjmax_table[i].id))
+ if (strstr(x86_model_id, tjmax_table[i].id))
return tjmax_table[i].tjmax;
}

diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
index 2cef0c37ff6f..1057c14b50c9 100644
--- a/drivers/hwmon/k10temp.c
+++ b/drivers/hwmon/k10temp.c
@@ -343,7 +343,7 @@ static int k10temp_probe(struct pci_dev *pdev,
const struct tctl_offset *entry = &tctl_offset_table[i];

if (boot_cpu_data.x86 == entry->model &&
- strstr(boot_cpu_data.x86_model_id, entry->id)) {
+ strstr(x86_model_id, entry->id)) {
data->temp_offset = entry->offset;
break;
}
diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c
index 225638a1b09e..4309f198cbad 100644
--- a/drivers/platform/x86/intel_ips.c
+++ b/drivers/platform/x86/intel_ips.c
@@ -1367,11 +1367,11 @@ static struct ips_mcp_limits *ips_detect_cpu(struct ips_driver *ips)
else
ips->turbo_toggle_allowed = false;

- if (strstr(boot_cpu_data.x86_model_id, "CPU M"))
+ if (strstr(x86_model_id, "CPU M"))
limits = &ips_sv_limits;
- else if (strstr(boot_cpu_data.x86_model_id, "CPU L"))
+ else if (strstr(x86_model_id, "CPU L"))
limits = &ips_lv_limits;
- else if (strstr(boot_cpu_data.x86_model_id, "CPU U"))
+ else if (strstr(x86_model_id, "CPU U"))
limits = &ips_ulv_limits;
else {
dev_info(ips->dev, "No CPUID match found.\n");
--
2.19.1