From bd610d2fcd58ef70f994d808bcf98597c6c519eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 30 Jan 2006 14:43:38 +0000 Subject: [PATCH] * Added kernel settings for APM - defaults to disabled (since it doesn't work on at least one of my systems, it only works on 3 of them...). * Added APM safemode setting. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16152 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- data/settings/kernel/drivers/kernel | 4 ++++ src/system/boot/platform/bios_ia32/menu.cpp | 7 ++++++- src/system/kernel/arch/x86/apm.cpp | 22 ++++++++++++++++++--- src/system/kernel/arch/x86/arch_platform.c | 3 ++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/data/settings/kernel/drivers/kernel b/data/settings/kernel/drivers/kernel index d6464132ac..011245b83b 100644 --- a/data/settings/kernel/drivers/kernel +++ b/data/settings/kernel/drivers/kernel @@ -28,3 +28,7 @@ #load_symbols false # load kernel and kernel add-on symbols +#apm false + # APM (advanced power management) support + # (system shutdown, battery info, ...) + diff --git a/src/system/boot/platform/bios_ia32/menu.cpp b/src/system/boot/platform/bios_ia32/menu.cpp index 450ff5c2ed..a13727bbd8 100644 --- a/src/system/boot/platform/bios_ia32/menu.cpp +++ b/src/system/boot/platform/bios_ia32/menu.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2004-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2004-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -27,6 +27,11 @@ platform_add_menus(Menu *menu) menu->AddItem(item = new MenuItem("Don't call the BIOS")); item->SetType(MENU_ITEM_MARKABLE); + + menu->AddItem(item = new MenuItem("Disable APM")); + item->SetType(MENU_ITEM_MARKABLE); + item->SetData("disable_apm"); + item->SetHelpText("This overrides the APM setting in the kernel settings file"); break; default: break; diff --git a/src/system/kernel/arch/x86/apm.cpp b/src/system/kernel/arch/x86/apm.cpp index fdaafdd93c..6bbe03eb50 100644 --- a/src/system/kernel/arch/x86/apm.cpp +++ b/src/system/kernel/arch/x86/apm.cpp @@ -8,6 +8,7 @@ #include #include +#include #include @@ -217,7 +218,7 @@ apm_init(kernel_args *args) if ((info.version & 0xf) < 2) { // no APM or connect failed - return B_OK; + return B_ERROR; } TRACE((" code32: 0x%x, 0x%lx, length 0x%x\n", @@ -227,8 +228,23 @@ apm_init(kernel_args *args) TRACE((" data: 0x%x, length 0x%x\n", info.data_segment_base, info.data_segment_length)); - // TODO: remove me when tested on more hardware - if (1) + // get APM setting - safemode settings override kernel settings + + bool apm = false; + + void *handle = load_driver_settings("kernel"); + if (handle != NULL) { + apm = get_driver_boolean_parameter(handle, "apm", false, false); + unload_driver_settings(handle); + } + + handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); + if (handle != NULL) { + apm = !get_driver_boolean_parameter(handle, "disable_apm", !apm, !apm); + unload_driver_settings(handle); + } + + if (!apm) return B_OK; // Apparently, some broken BIOS try to access segment 0x40 for the BIOS diff --git a/src/system/kernel/arch/x86/arch_platform.c b/src/system/kernel/arch/x86/arch_platform.c index fa09d8e666..9dc40abf7d 100644 --- a/src/system/kernel/arch/x86/arch_platform.c +++ b/src/system/kernel/arch/x86/arch_platform.c @@ -29,6 +29,7 @@ arch_platform_init_post_vm(struct kernel_args *args) status_t arch_platform_init_post_thread(struct kernel_args *args) { - return apm_init(args); + apm_init(args); + return B_OK; }