From 401fb209ea379d373fbcee0cc69f8b63a53e2e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Sun, 4 Feb 2018 19:01:53 +0100 Subject: [PATCH] kernel: use x2apic on hypervisor, or if already enabled. * this can be disabled per safe mode setting. --- headers/private/system/safemode_defs.h | 2 +- src/system/boot/platform/bios_ia32/smp.cpp | 7 ------- src/system/boot/platform/efi/smp.cpp | 7 ------- src/system/kernel/arch/x86/apic.cpp | 22 +++++++++------------- 4 files changed, 10 insertions(+), 28 deletions(-) diff --git a/headers/private/system/safemode_defs.h b/headers/private/system/safemode_defs.h index 77afb1cf65..41292ddc77 100644 --- a/headers/private/system/safemode_defs.h +++ b/headers/private/system/safemode_defs.h @@ -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" diff --git a/src/system/boot/platform/bios_ia32/smp.cpp b/src/system/boot/platform/bios_ia32/smp.cpp index f60cbbec27..277cb6f9f0 100644 --- a/src/system/boot/platform/bios_ia32/smp.cpp +++ b/src/system/boot/platform/bios_ia32/smp.cpp @@ -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 diff --git a/src/system/boot/platform/efi/smp.cpp b/src/system/boot/platform/efi/smp.cpp index 7b2e5462d9..a507d53a9c 100644 --- a/src/system/boot/platform/efi/smp.cpp +++ b/src/system/boot/platform/efi/smp.cpp @@ -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 diff --git a/src/system/kernel/arch/x86/apic.cpp b/src/system/kernel/arch/x86/apic.cpp index 176102977d..976ddfe1bc 100644 --- a/src/system/kernel/arch/x86/apic.cpp +++ b/src/system/kernel/arch/x86/apic.cpp @@ -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;