x86: fix build with older versions of GCC following e34bc403c3
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 6 Jan 2017 14:08:09 +0000 (15:08 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 6 Jan 2017 14:08:09 +0000 (15:08 +0100)
GCCs of at least 4.4 and earlier do not tollerate the initialisiation of the
$VENDOR_cpu_dev structures, because of c_ident becoming an anonymous union.

Instead of using an anonymous union, reintepret c_ident[] in its CPUID form
just in get_cpu_vendor().

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Tested-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/cpu/common.c
xen/arch/x86/cpu/cpu.h

index d17a2ee05be2f9e4a2e3318db4020fa23d0e2260..7d6d0249e5271c2a6ab002b68e92bfa97b0f9eb1 100644 (file)
@@ -163,8 +163,11 @@ int get_cpu_vendor(uint32_t b, uint32_t c, uint32_t d, enum get_cpu_vendor mode)
 
        for (i = 0; i < X86_VENDOR_NUM; i++) {
                if (cpu_devs[i]) {
-                       if (cpu_devs[i]->b == b && cpu_devs[i]->c == c &&
-                           cpu_devs[i]->d == d) {
+                       struct {
+                               uint32_t b, d, c;
+                       } *ptr = (void *)cpu_devs[i]->c_ident;
+
+                       if (ptr->b == b && ptr->c == c && ptr->d == d) {
                                if (mode == gcv_host)
                                        this_cpu = cpu_devs[i];
                                return i;
index 5a7905c31a9e8f43b4bcf7f8e44917207e70f9b2..3eeebe374083a0de7a9fdaa3e9c580c896a548de 100644 (file)
@@ -1,13 +1,7 @@
 /* attempt to consolidate cpu attributes */
 struct cpu_dev {
        char    c_vendor[8];
-
-       union {
-               char    c_ident[13];
-               struct {
-                       uint32_t b, d, c;
-               };
-       };
+       char    c_ident[13];
 
        void            (*c_early_init)(struct cpuinfo_x86 *c);
        void            (*c_init)(struct cpuinfo_x86 * c);