diff --git a/zircon/kernel/arch/x86/feature.cpp b/zircon/kernel/arch/x86/feature.cpp index 71eec8a00807dccdc08127b54261eb951c29e5f1..d3485a69c4060974d0b3d86f54a26e2cbd4b2a6c 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 7dde73530f5a018f7aaeffb497f2df3fb9913372..0ebd1fa5e25e9cd1e15861ca23cc029bfd23326e 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, };