From f0bf38026aff5c5894996aa404758f4705d2ef7b Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Mon, 14 Sep 2009 09:02:15 +0000 Subject: [PATCH] Add safemode option to disable the use of APIC timers git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33132 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/system/safemode_defs.h | 1 + src/system/boot/platform/bios_ia32/menu.cpp | 6 ++++++ src/system/kernel/arch/x86/arch_timer.c | 13 +++++++++++++ 3 files changed, 20 insertions(+) diff --git a/headers/private/system/safemode_defs.h b/headers/private/system/safemode_defs.h index 1b16a35b35..a47255f2c8 100644 --- a/headers/private/system/safemode_defs.h +++ b/headers/private/system/safemode_defs.h @@ -13,6 +13,7 @@ #define B_SAFEMODE_DISABLE_IDE_DMA "disableidedma" #define B_SAFEMODE_DISABLE_IOAPIC "disable_ioapic" #define B_SAFEMODE_DISABLE_ACPI "disable_acpi" +#define B_SAFEMODE_DISABLE_APIC "disable_apic" #define B_SAFEMODE_DISABLE_APM "disable_apm" #define B_SAFEMODE_DISABLE_SMP "disable_smp" #define B_SAFEMODE_DISABLE_HYPER_THREADING "disable_hyperthreading" diff --git a/src/system/boot/platform/bios_ia32/menu.cpp b/src/system/boot/platform/bios_ia32/menu.cpp index d6a4f6f107..19d8aac223 100644 --- a/src/system/boot/platform/bios_ia32/menu.cpp +++ b/src/system/boot/platform/bios_ia32/menu.cpp @@ -53,6 +53,12 @@ platform_add_menus(Menu *menu) item->SetData(B_SAFEMODE_DISABLE_IOAPIC); item->SetHelpText("Disables using the IO APIC for interrupt handling, " "forcing instead the use of the PIC."); + + menu->AddItem(item = new(nothrow) MenuItem("Disable APIC Timers")); + item->SetType(MENU_ITEM_MARKABLE); + item->SetData(B_SAFEMODE_DISABLE_APIC); + item->SetHelpText("Disables using the APIC timers for timekeeping"); + break; default: break; diff --git a/src/system/kernel/arch/x86/arch_timer.c b/src/system/kernel/arch/x86/arch_timer.c index f1e8ce9ad6..f025a6482b 100644 --- a/src/system/kernel/arch/x86/arch_timer.c +++ b/src/system/kernel/arch/x86/arch_timer.c @@ -17,6 +17,7 @@ #include #include #include +#include #include @@ -67,11 +68,23 @@ arch_init_timer(kernel_args *args) int i = 0; int bestPriority = -1; timer_info *timer = NULL; + bool disableAPIC = false; + void *handle = NULL; cpu_status state = disable_interrupts(); + handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); + if (handle != NULL) { + disableAPIC = get_driver_boolean_parameter(handle, B_SAFEMODE_DISABLE_APIC, + disableAPIC, disableAPIC); + unload_driver_settings(handle); + } + for (i = 0; (timer = sTimers[i]) != NULL; i++) { int priority = timer->get_priority(); + if (timer == &gAPICTimer && disableAPIC) + continue; + if (priority < bestPriority) { TRACE(("arch_init_timer: Skipping %s because there is a higher priority timer (%s) initialized.\n", timer->name, sTimer->name)); continue;