From 67d53e5625d98f2af370e7132a874e55ddc747b1 Mon Sep 17 00:00:00 2001 From: Venkatesh Srinivas <venkateshs@google.com> Date: Wed, 13 Feb 2019 02:51:34 +0000 Subject: [PATCH] [zircon][arch/x86] CPU Features: Minor cleanup * Add an enumeration entry for when we're not running under a hypervisor; today UNKNOWN is used for 'all non-KVM and all physical'. This allows code elsewhere in the kernel to see whether we're running under a hypervisor or not, so we can apply certain workarounds if needed. * Modify select_microarch_config to take the x86 uarch enum by parameter rather than global and have it return the selected config operations table. I'd like to move towards an interface for code throughout the kernel to query decoded CPUID feature bits/synthetic feature bits/family-model- stepping data. The interface would allow writing tests for particular F/M/S targets. Marking the globals as such is a start towards that. Change-Id: Ic94d7661c8051fbda3ec9eef6e31750e0c53a08d --- zircon/kernel/arch/x86/feature.cpp | 56 +++++++------------ .../arch/x86/include/arch/x86/feature.h | 1 + 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/zircon/kernel/arch/x86/feature.cpp b/zircon/kernel/arch/x86/feature.cpp index 71eec8a0080..d3485a69c40 100644 --- a/zircon/kernel/arch/x86/feature.cpp +++ b/zircon/kernel/arch/x86/feature.cpp @@ -38,7 +38,7 @@ enum x86_hypervisor_list x86_hypervisor; static int initialized = 0; static enum x86_microarch_list get_microarch(struct x86_model_info* info); -static void select_microarch_config(void); +static const x86_microarch_config_t* select_microarch_config(enum x86_microarch_list info); static enum x86_hypervisor_list get_hypervisor(); @@ -124,7 +124,7 @@ void x86_feature_init(void) { x86_microarch = get_microarch(&model_info); } - select_microarch_config(); + x86_microarch_config = select_microarch_config(x86_microarch); g_x86_feature_fsgsbase = x86_feature_test(X86_FEATURE_FSGSBASE); @@ -184,7 +184,7 @@ static enum x86_microarch_list get_microarch(struct x86_model_info* info) { static enum x86_hypervisor_list get_hypervisor() { if (!x86_feature_test(X86_FEATURE_HYPERVISOR)) { - return X86_HYPERVISOR_UNKNOWN; + return X86_HYPERVISOR_NONE; } uint32_t a, b, c, d; cpuid(X86_CPUID_HYP_VENDOR, &a, &b, &c, &d); @@ -578,58 +578,44 @@ static const x86_microarch_config_t unknown_vendor_config{ .disable_c1e = false, }; -void select_microarch_config(void) { - switch (x86_microarch) { +const x86_microarch_config_t* select_microarch_config(enum x86_microarch_list info) { + switch (info) { case X86_MICROARCH_INTEL_NEHALEM: - x86_microarch_config = &nehalem_config; - break; + return &nehalem_config; case X86_MICROARCH_INTEL_WESTMERE: - x86_microarch_config = &westmere_config; - break; + return &westmere_config; case X86_MICROARCH_INTEL_SANDY_BRIDGE: - x86_microarch_config = &snb_config; - break; + return &snb_config; case X86_MICROARCH_INTEL_IVY_BRIDGE: - x86_microarch_config = &ivb_config; - break; + return &ivb_config; case X86_MICROARCH_INTEL_BROADWELL: - x86_microarch_config = &bdw_config; - break; + return &bdw_config; case X86_MICROARCH_INTEL_HASWELL: - x86_microarch_config = &hsw_config; - break; + return &hsw_config; case X86_MICROARCH_INTEL_SKYLAKE: - x86_microarch_config = &skl_config; - break; + return &skl_config; case X86_MICROARCH_INTEL_KABYLAKE: - x86_microarch_config = &kbl_config; - break; + return &kbl_config; case X86_MICROARCH_INTEL_SILVERMONT: - x86_microarch_config = &smt_config; - break; + return &smt_config; case X86_MICROARCH_AMD_BULLDOZER: - x86_microarch_config = &bulldozer_config; - break; + return &bulldozer_config; case X86_MICROARCH_AMD_JAGUAR: - x86_microarch_config = &jaguar_config; - break; + return &jaguar_config; case X86_MICROARCH_AMD_ZEN: - x86_microarch_config = &zen_config; - break; + return &zen_config; case X86_MICROARCH_UNKNOWN: { printf("WARNING: Could not identify microarch.\n"); printf("Please file a bug with your boot log and description of hardware.\n"); switch (x86_vendor) { case X86_VENDOR_INTEL: - x86_microarch_config = &intel_default_config; - break; + return &intel_default_config; case X86_VENDOR_AMD: - x86_microarch_config = &amd_default_config; - break; + return &amd_default_config; case X86_VENDOR_UNKNOWN: - x86_microarch_config = &unknown_vendor_config; - break; + return &unknown_vendor_config; } } } + return &unknown_vendor_config; } diff --git a/zircon/kernel/arch/x86/include/arch/x86/feature.h b/zircon/kernel/arch/x86/include/arch/x86/feature.h index 7dde73530f5..0ebd1fa5e25 100644 --- a/zircon/kernel/arch/x86/include/arch/x86/feature.h +++ b/zircon/kernel/arch/x86/include/arch/x86/feature.h @@ -283,6 +283,7 @@ extern bool g_x86_feature_fsgsbase; enum x86_hypervisor_list { X86_HYPERVISOR_UNKNOWN, + X86_HYPERVISOR_NONE, X86_HYPERVISOR_KVM, }; -- GitLab