kernel: use x2apic on hypervisor, or if already enabled.

* this can be disabled per safe mode setting.
This commit is contained in:
Jérôme Duval
2018-02-04 19:08:53 +01:00
parent ac690cf148
commit 401fb209ea
4 changed files with 10 additions and 28 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
#define B_SAFEMODE_DISABLE_IOAPIC "disable_ioapic"
#define B_SAFEMODE_DISABLE_ACPI "disable_acpi"
#define B_SAFEMODE_DISABLE_APIC "disable_apic"
#define B_SAFEMODE_ENABLE_X2APIC "enable_x2apic"
#define B_SAFEMODE_DISABLE_X2APIC "disable_x2apic"
#define B_SAFEMODE_DISABLE_SMEP_SMAP "disable_smep_smap"
#define B_SAFEMODE_DISABLE_APM "disable_apm"
#define B_SAFEMODE_DISABLE_SMP "disable_smp"
@@ -583,17 +583,10 @@ smp_add_safemode_menus(Menu *menu)
cpuid_info info;
if (get_current_cpuid(&info, 1, 0) == B_OK
&& (info.regs.ecx & IA32_FEATURE_EXT_X2APIC) != 0) {
#if 0
menu->AddItem(item = new(nothrow) MenuItem("Disable X2APIC"));
item->SetType(MENU_ITEM_MARKABLE);
item->SetData(B_SAFEMODE_DISABLE_X2APIC);
item->SetHelpText("Disables using X2APIC.");
#else
menu->AddItem(item = new(nothrow) MenuItem("Enable X2APIC"));
item->SetType(MENU_ITEM_MARKABLE);
item->SetData(B_SAFEMODE_ENABLE_X2APIC);
item->SetHelpText("Enables using X2APIC.");
#endif
}
if (get_current_cpuid(&info, 7, 0) == B_OK
-7
View File
@@ -397,17 +397,10 @@ smp_add_safemode_menus(Menu *menu)
cpuid_info info;
if (get_current_cpuid(&info, 1, 0) == B_OK
&& (info.regs.ecx & IA32_FEATURE_EXT_X2APIC) != 0) {
#if 0
menu->AddItem(item = new(nothrow) MenuItem("Disable X2APIC"));
item->SetType(MENU_ITEM_MARKABLE);
item->SetData(B_SAFEMODE_DISABLE_X2APIC);
item->SetHelpText("Disables using X2APIC.");
#else
menu->AddItem(item = new(nothrow) MenuItem("Enable X2APIC"));
item->SetType(MENU_ITEM_MARKABLE);
item->SetData(B_SAFEMODE_ENABLE_X2APIC);
item->SetHelpText("Enables using X2APIC.");
#endif
}
if (get_current_cpuid(&info, 7, 0) == B_OK
+9 -13
View File
@@ -265,23 +265,19 @@ apic_init(kernel_args *args)
if (args->arch_args.apic == NULL)
return B_NO_INIT;
if (x86_check_feature(IA32_FEATURE_EXT_X2APIC, FEATURE_EXT)) {
uint64 apic_base = x86_read_msr(IA32_MSR_APIC_BASE);
if (x86_check_feature(IA32_FEATURE_EXT_X2APIC, FEATURE_EXT)
&& (x86_check_feature(IA32_FEATURE_EXT_HYPERVISOR, FEATURE_EXT)
|| ((apic_base & IA32_MSR_APIC_BASE_X2APIC) != 0))) {
dprintf("found x2apic\n");
#if 0
if (!get_safemode_boolean(B_SAFEMODE_DISABLE_X2APIC, false)) {
if (get_safemode_boolean(B_SAFEMODE_DISABLE_X2APIC, false)) {
dprintf("x2apic disabled per safemode setting\n");
} else {
sX2APIC = true;
return B_OK;
}
dprintf("x2apic disabled per safemode setting\n");
#else
if (get_safemode_boolean(B_SAFEMODE_ENABLE_X2APIC, false)) {
sX2APIC = true;
dprintf("x2apic enabled per safemode setting\n");
return B_OK;
}
#endif
}
sLocalAPIC = args->arch_args.apic;