|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] xen: Fix build with older versions of GCC following e34bc403c3
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@xxxxxxxxxx>
---
CC: Jan Beulich <JBeulich@xxxxxxxx>
CC: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
RFC, as I don't have easy access to a compiler which causes this to fail in
the first place.
---
xen/arch/x86/cpu/common.c | 7 +++++--
xen/arch/x86/cpu/cpu.h | 8 +-------
2 files changed, 6 insertions(+), 9 deletions(-)
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index d17a2ee..7d6d024 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -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;
diff --git a/xen/arch/x86/cpu/cpu.h b/xen/arch/x86/cpu/cpu.h
index 5a7905c..3eeebe3 100644
--- a/xen/arch/x86/cpu/cpu.h
+++ b/xen/arch/x86/cpu/cpu.h
@@ -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);
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |