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,
 };