]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
x86: make get_cpu_vendor() accessible from Xen code
authorJuergen Gross <jgross@suse.com>
Thu, 17 Oct 2024 06:29:48 +0000 (08:29 +0200)
committerJuergen Gross <jgross@suse.com>
Fri, 13 Dec 2024 08:28:10 +0000 (09:28 +0100)
In order to be able to differentiate between AMD and Intel based
systems for very early hypercalls without having to rely on the Xen
hypercall page, make get_cpu_vendor() non-static.

Refactor early_cpu_init() for the same reason by splitting out the
loop initializing cpu_devs() into an externally callable function.

This is part of XSA-466 / CVE-2024-53241.

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
arch/x86/include/asm/processor.h
arch/x86/kernel/cpu/common.c

index c0975815980c84ada5613111987239b70d9438cd..20e6009381ed6f4a890dfdd87c0722f6740435a5 100644 (file)
@@ -230,6 +230,8 @@ static inline unsigned long long l1tf_pfn_limit(void)
        return BIT_ULL(boot_cpu_data.x86_cache_bits - 1 - PAGE_SHIFT);
 }
 
+void init_cpu_devs(void);
+void get_cpu_vendor(struct cpuinfo_x86 *c);
 extern void early_cpu_init(void);
 extern void identify_secondary_cpu(struct cpuinfo_x86 *);
 extern void print_cpu_info(struct cpuinfo_x86 *);
index a5c28975c608ee0a62809a75d55ea95e34e36842..3e9037690814b331b3433a4abdecc25368c2a662 100644 (file)
@@ -867,7 +867,7 @@ static void cpu_detect_tlb(struct cpuinfo_x86 *c)
                tlb_lld_4m[ENTRIES], tlb_lld_1g[ENTRIES]);
 }
 
-static void get_cpu_vendor(struct cpuinfo_x86 *c)
+void get_cpu_vendor(struct cpuinfo_x86 *c)
 {
        char *v = c->x86_vendor_id;
        int i;
@@ -1649,15 +1649,11 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
        detect_nopl();
 }
 
-void __init early_cpu_init(void)
+void __init init_cpu_devs(void)
 {
        const struct cpu_dev *const *cdev;
        int count = 0;
 
-#ifdef CONFIG_PROCESSOR_SELECT
-       pr_info("KERNEL supported cpus:\n");
-#endif
-
        for (cdev = __x86_cpu_dev_start; cdev < __x86_cpu_dev_end; cdev++) {
                const struct cpu_dev *cpudev = *cdev;
 
@@ -1665,20 +1661,30 @@ void __init early_cpu_init(void)
                        break;
                cpu_devs[count] = cpudev;
                count++;
+       }
+}
 
+void __init early_cpu_init(void)
+{
 #ifdef CONFIG_PROCESSOR_SELECT
-               {
-                       unsigned int j;
-
-                       for (j = 0; j < 2; j++) {
-                               if (!cpudev->c_ident[j])
-                                       continue;
-                               pr_info("  %s %s\n", cpudev->c_vendor,
-                                       cpudev->c_ident[j]);
-                       }
-               }
+       unsigned int i, j;
+
+       pr_info("KERNEL supported cpus:\n");
 #endif
+
+       init_cpu_devs();
+
+#ifdef CONFIG_PROCESSOR_SELECT
+       for (i = 0; i < X86_VENDOR_NUM && cpu_devs[i]; i++) {
+               for (j = 0; j < 2; j++) {
+                       if (!cpu_devs[i]->c_ident[j])
+                               continue;
+                       pr_info("  %s %s\n", cpu_devs[i]->c_vendor,
+                               cpu_devs[i]->c_ident[j]);
+               }
        }
+#endif
+
        early_identify_cpu(&boot_cpu_data);
 }