From 192bc027eaa41081e99ae42641866871cfc1a649 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Sat, 14 May 2011 23:09:18 +0000 Subject: [PATCH] Disabling the local APIC also means disabling SMP, as the APIC is the base for all inter-CPU messaging. The previously described timekeeping is just an extra function of local APICs. Before, if you'd select "disable local APIC" it would still blindly write to invalid memory (targetting the non-mapped local APIC) and then just hang waiting for the other CPUs (that were obviously not responding to the init sequence that wasn't programmed). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@41504 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/boot/platform/bios_ia32/smp.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/system/boot/platform/bios_ia32/smp.cpp b/src/system/boot/platform/bios_ia32/smp.cpp index ecb7e9e9da..28f1bbbbb2 100644 --- a/src/system/boot/platform/bios_ia32/smp.cpp +++ b/src/system/boot/platform/bios_ia32/smp.cpp @@ -399,8 +399,9 @@ smp_init_other_cpus(void) } if (get_safemode_boolean(B_SAFEMODE_DISABLE_APIC, false)) { - TRACE(("local apic disabled per safemode setting\n")); + TRACE(("local apic disabled per safemode setting, disabling smp\n")); gKernelArgs.arch_args.apic_phys = 0; + gKernelArgs.num_cpus = 1; } if (gKernelArgs.arch_args.apic_phys == 0) @@ -593,10 +594,10 @@ smp_add_safemode_menus(Menu *menu) } if (gKernelArgs.arch_args.apic_phys != 0) { - menu->AddItem(item = new(nothrow) MenuItem("Disable LOCAL APIC")); + menu->AddItem(item = new(nothrow) MenuItem("Disable local APIC")); item->SetType(MENU_ITEM_MARKABLE); item->SetData(B_SAFEMODE_DISABLE_APIC); - item->SetHelpText("Disables using the LOCAL APIC for timekeeping."); + item->SetHelpText("Disables using the local APIC, also disables SMP."); } if (gKernelArgs.num_cpus < 2)