|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [RFC PATCH 01/11] x86: Add more granularity to the vendors in Kconfig
This enables very aggressive DCE passes on single-vendor builds in later
patches, as it will allow most vendor checks to become statically chosen
branches. A lot of statics go away and a lot more inlining is allowed.
In order to allow x86_vendor_is() to fold into constants, expand Kconfig
to have the full set of vendors. Adds Hygon, Centaur, Shanghai and the
default path.
Have Hygon depend on AMD, and Centaur+Shanghai depend on Intel.
Not a functional change.
Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx>
---
xen/arch/x86/Kconfig.cpu | 45 ++++++++++++++++++++++++++++++++
xen/arch/x86/cpu/common.c | 17 +++++++-----
xen/arch/x86/include/asm/cpuid.h | 7 +++++
3 files changed, 62 insertions(+), 7 deletions(-)
diff --git a/xen/arch/x86/Kconfig.cpu b/xen/arch/x86/Kconfig.cpu
index 5fb18db1aa..aaf70fb37b 100644
--- a/xen/arch/x86/Kconfig.cpu
+++ b/xen/arch/x86/Kconfig.cpu
@@ -19,4 +19,49 @@ config INTEL
May be turned off in builds targetting other vendors. Otherwise,
must be enabled for Xen to work suitably on Intel platforms.
+config HYGON
+ bool "Support Hygon CPUs"
+ depends on AMD
+ default y
+ help
+ Detection, tunings and quirks for Hygon platforms.
+
+ May be turned off in builds targetting other vendors. Otherwise,
+ must be enabled for Xen to work suitably on Hygon platforms.
+
+
+config CENTAUR
+ bool "Support Centaur CPUs"
+ depends on INTEL
+ default y
+ help
+ Detection, tunings and quirks for Centaur platforms.
+
+ May be turned off in builds targetting other vendors. Otherwise,
+ must be enabled for Xen to work suitably on Centaur platforms.
+
+config SHANGHAI
+ bool "Support Shanghai CPUs"
+ depends on INTEL
+ default y
+ help
+ Detection, tunings and quirks for Shanghai platforms.
+
+ May be turned off in builds targetting other vendors. Otherwise,
+ must be enabled for Xen to work suitably on Shanghai platforms.
+
+config UNKNOWN_CPU
+ bool "Support unknown CPUs"
+ default y
+ help
+ This option prevents a panic on boot when the host CPU vendor isn't
+ supported by going into a legacy compatibility mode and not applying
+ any relevant tunings or quirks.
+
+ Not selecting this options while selecting multiple vendors doesn't
have
+ any major effect on code size, but while selecting a single vendor
+ it produces a smaller build especially optimised for size.
+
+ If unsure, say Y.
+
endmenu
diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index 37820a3a08..393c30227f 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -118,7 +118,7 @@ static void cf_check default_init(struct cpuinfo_x86 * c)
__clear_bit(X86_FEATURE_SEP, c->x86_capability);
}
-static const struct cpu_dev __initconst_cf_clobber __used default_cpu = {
+static const struct cpu_dev __initconst_cf_clobber default_cpu = {
.c_init = default_init,
};
static struct cpu_dev __ro_after_init actual_cpu;
@@ -340,7 +340,8 @@ void __init early_cpu_init(bool verbose)
*(u32 *)&c->x86_vendor_id[8] = ecx;
*(u32 *)&c->x86_vendor_id[4] = edx;
- c->x86_vendor = x86_cpuid_lookup_vendor(ebx, ecx, edx);
+ c->x86_vendor = x86_cpuid_lookup_vendor(ebx, ecx, edx) &
+ X86_ENABLED_VENDORS;
switch (c->x86_vendor) {
case X86_VENDOR_INTEL: intel_unlock_cpuid_leaves(c);
actual_cpu = intel_cpu_dev; break;
@@ -349,12 +350,14 @@ void __init early_cpu_init(bool verbose)
case X86_VENDOR_SHANGHAI: actual_cpu = shanghai_cpu_dev; break;
case X86_VENDOR_HYGON: actual_cpu = hygon_cpu_dev; break;
default:
+ if (verbose || !IS_ENABLED(CONFIG_UNKNOWN_CPU))
+ printk(XENLOG_ERR
+ "Unrecognised or unsupported CPU vendor
'%.12s'\n",
+ c->x86_vendor_id);
+ if (!IS_ENABLED(CONFIG_UNKNOWN_CPU))
+ panic("Cannot run in unknown/compiled-out CPU
vendor.\n");
+
actual_cpu = default_cpu;
- if (!verbose)
- break;
- printk(XENLOG_ERR
- "Unrecognised or unsupported CPU vendor '%.12s'\n",
- c->x86_vendor_id);
}
cpuid(0x00000001, &eax, &ebx, &ecx, &edx);
diff --git a/xen/arch/x86/include/asm/cpuid.h b/xen/arch/x86/include/asm/cpuid.h
index f1b9e37a42..bf1c635cdd 100644
--- a/xen/arch/x86/include/asm/cpuid.h
+++ b/xen/arch/x86/include/asm/cpuid.h
@@ -49,6 +49,13 @@ struct cpuid_leaf;
void guest_cpuid(const struct vcpu *v, uint32_t leaf,
uint32_t subleaf, struct cpuid_leaf *res);
+#define X86_ENABLED_VENDORS \
+ ((IS_ENABLED(CONFIG_INTEL) ? X86_VENDOR_INTEL : 0) | \
+ (IS_ENABLED(CONFIG_AMD) ? X86_VENDOR_AMD : 0) | \
+ (IS_ENABLED(CONFIG_CENTAUR) ? X86_VENDOR_CENTAUR : 0) | \
+ (IS_ENABLED(CONFIG_SHANGHAI) ? X86_VENDOR_SHANGHAI : 0) | \
+ (IS_ENABLED(CONFIG_HYGON) ? X86_VENDOR_HYGON : 0))
+
#endif /* !__X86_CPUID_H__ */
/*
--
2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |