From 89294b508428bd4575a67bd179bceabce7619c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 26 Aug 2009 08:47:54 +0000 Subject: [PATCH] * Added option for enabling serial debug output. * Moved device_manager/settings.cpp to debug/safemode_settings.cpp. * Removed the somewhat hacky concatenation of kernel settings and safemode settings in the boot loader. Instead, get_safemode_option() will now fall back to the kernel settings, if it couldn't spot a setting in the safemode settings. This allows for more control, and also makes enabling serial debug output actually work (ie. overriding the kernel settings via safemode options). * Adjusted debug_init_post_vm(), and smp_init_other_cpus() to use get_safemode_boolean(). * Therefore, I added safemode_settings.cpp to the boot loader as well. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32685 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/boot/loader/Jamfile | 4 ++ .../boot/loader/load_driver_settings.cpp | 51 +---------------- src/system/boot/loader/menu.cpp | 20 +++++-- src/system/boot/platform/bios_ia32/smp.cpp | 24 ++++---- src/system/kernel/debug/Jamfile | 1 + src/system/kernel/debug/debug.cpp | 29 +++------- .../safemode_settings.cpp} | 57 +++++++++++++------ src/system/kernel/device_manager/Jamfile | 2 - 8 files changed, 82 insertions(+), 106 deletions(-) rename src/system/kernel/{device_manager/settings.cpp => debug/safemode_settings.cpp} (53%) diff --git a/src/system/boot/loader/Jamfile b/src/system/boot/loader/Jamfile index e4e6f49a18..b1e67e44cf 100644 --- a/src/system/boot/loader/Jamfile +++ b/src/system/boot/loader/Jamfile @@ -69,6 +69,7 @@ KernelStaticLibrary boot_loader : kernel_cpp.cpp KMessage.cpp list.c + safemode_settings.cpp : -fno-pic ; @@ -94,6 +95,9 @@ SEARCH on [ FGristFiles kernel_cpp.cpp list.c ] SEARCH on [ FGristFiles KMessage.cpp ] = [ FDirName $(HAIKU_TOP) src system kernel messaging ] ; +SEARCH on [ FGristFiles safemode_settings.cpp ] + = [ FDirName $(HAIKU_TOP) src system kernel debug ] ; + SEARCH on [ FGristFiles driver_settings.c ] = [ FDirName $(HAIKU_TOP) src system libroot os ] ; diff --git a/src/system/boot/loader/load_driver_settings.cpp b/src/system/boot/loader/load_driver_settings.cpp index 3f8c0b0055..ebb792263d 100644 --- a/src/system/boot/loader/load_driver_settings.cpp +++ b/src/system/boot/loader/load_driver_settings.cpp @@ -7,6 +7,9 @@ #include "load_driver_settings.h" +#include +#include + #include #include @@ -15,22 +18,6 @@ #include #include -#include -#include - - -static driver_settings_file* -find_driver_settings_file(const char* name) -{ - for (driver_settings_file* file = gKernelArgs.driver_settings; file != NULL; - file = file->next) { - if (!strcmp(file->name, name)) - return file; - } - - return NULL; -} - static status_t load_driver_settings_file(Directory* directory, const char* name) @@ -100,38 +87,6 @@ load_driver_settings(stage2_args* /*args*/, Directory* volume) settings->Close(cookie); } - // Check if a kernel settings file exists - // if it does, prepend it to the safe mode settings. This allows the - // settings from the kernel file to take effect while still allowing - // overrides by safe mode since the settings are searched - // in reverse order. This allows us to permanently set things like - // disable_smp - driver_settings_file* kernelFile = find_driver_settings_file("kernel"); - if (kernelFile != NULL) { - driver_settings_file* safemodeFile - = find_driver_settings_file(B_SAFEMODE_DRIVER_SETTINGS); - if (safemodeFile != NULL) { - char* buffer = (char*)kernel_args_malloc( - safemodeFile->size + kernelFile->size + 2); - if (buffer != NULL) { - memcpy(buffer, kernelFile->buffer, kernelFile->size); - - // insert a newline just in case the kernel settings file - // doesn't end with one - buffer[kernelFile->size] = '\n'; - - memcpy(buffer + kernelFile->size + 1, safemodeFile->buffer, - safemodeFile->size); - - kernel_args_free(safemodeFile->buffer); - safemodeFile->buffer = buffer; - safemodeFile->size = safemodeFile->size + kernelFile->size + 1; - buffer[safemodeFile->size] = '\0'; - } - } else - add_safe_mode_settings(kernelFile->buffer); - } - return B_OK; } diff --git a/src/system/boot/loader/menu.cpp b/src/system/boot/loader/menu.cpp index dfc7dfee68..aac56de476 100644 --- a/src/system/boot/loader/menu.cpp +++ b/src/system/boot/loader/menu.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -21,6 +21,7 @@ #include + #define TRACE_MENU #ifdef TRACE_MENU # define TRACE(x) dprintf x @@ -28,6 +29,7 @@ # define TRACE(x) ; #endif + MenuItem::MenuItem(const char *label, Menu *subMenu) : fLabel(strdup(label)), @@ -154,7 +156,7 @@ MenuItem::SetHelpText(const char *text) } -void +void MenuItem::SetMenu(Menu *menu) { fMenu = menu; @@ -206,7 +208,7 @@ Menu::ItemAt(int32 index) } -int32 +int32 Menu::IndexOf(MenuItem *searchedItem) { MenuItemIterator iterator = ItemIterator(); @@ -452,10 +454,18 @@ add_safe_mode_menu() item->SetType(MENU_ITEM_MARKABLE); item->SetHelpText("Disables IDE DMA, increasing IDE compatibilty " "at the expense of performance."); - + platform_add_menus(safeMenu); - safeMenu->AddItem(item = new(nothrow) MenuItem("Enable on screen debug output")); + safeMenu->AddItem(item + = new(nothrow) MenuItem("Enable serial debug output")); + item->SetData("serial_debug_output"); + item->SetType(MENU_ITEM_MARKABLE); + item->SetHelpText("Turns on forwarding the syslog output to the serial " + "interface."); + + safeMenu->AddItem(item + = new(nothrow) MenuItem("Enable on screen debug output")); item->SetData("debug_screen"); item->SetType(MENU_ITEM_MARKABLE); item->SetHelpText("Displays debug output on screen while the system " diff --git a/src/system/boot/platform/bios_ia32/smp.cpp b/src/system/boot/platform/bios_ia32/smp.cpp index 6326a31450..6e7b41cb52 100644 --- a/src/system/boot/platform/bios_ia32/smp.cpp +++ b/src/system/boot/platform/bios_ia32/smp.cpp @@ -9,9 +9,8 @@ #include "smp.h" -#include "mmu.h" -#include "acpi.h" -#include "hpet.h" + +#include #include @@ -23,7 +22,10 @@ #include #include -#include +#include "mmu.h" +#include "acpi.h" +#include "hpet.h" + #define NO_SMP 0 @@ -386,15 +388,10 @@ calculate_apic_timer_conversion_factor(void) void smp_init_other_cpus(void) { - void *handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); - if (handle != NULL) { - if (get_driver_boolean_parameter(handle, B_SAFEMODE_DISABLE_SMP, false, - false)) { - // SMP has been disabled! - TRACE(("smp disabled per safemode setting\n")); - gKernelArgs.num_cpus = 1; - } - unload_driver_settings(handle); + if (get_safemode_boolean(B_SAFEMODE_DISABLE_SMP, false)) { + // SMP has been disabled! + TRACE(("smp disabled per safemode setting\n")); + gKernelArgs.num_cpus = 1; } if (gKernelArgs.arch_args.apic_phys == 0) @@ -573,7 +570,6 @@ dprintf("wait for delivery\n"); void smp_add_safemode_menus(Menu *menu) { - if (gKernelArgs.num_cpus < 2) return; diff --git a/src/system/kernel/debug/Jamfile b/src/system/kernel/debug/Jamfile index f1448362ae..9e10e46611 100644 --- a/src/system/kernel/debug/Jamfile +++ b/src/system/kernel/debug/Jamfile @@ -17,6 +17,7 @@ KernelMergeObject kernel_debug.o : debug_variables.cpp frame_buffer_console.cpp gdb.cpp + safemode_settings.cpp system_profiler.cpp tracing.cpp user_debugger.cpp diff --git a/src/system/kernel/debug/debug.cpp b/src/system/kernel/debug/debug.cpp index ef1d430823..3a15476097 100644 --- a/src/system/kernel/debug/debug.cpp +++ b/src/system/kernel/debug/debug.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -1299,27 +1300,15 @@ debug_init_post_vm(kernel_args* args) tracing_init(); // get debug settings - void* handle = load_driver_settings("kernel"); - if (handle != NULL) { - sSerialDebugEnabled = get_driver_boolean_parameter(handle, - "serial_debug_output", sSerialDebugEnabled, sSerialDebugEnabled); - sSyslogOutputEnabled = get_driver_boolean_parameter(handle, - "syslog_debug_output", sSyslogOutputEnabled, sSyslogOutputEnabled); - sBlueScreenOutput = get_driver_boolean_parameter(handle, - "bluescreen", true, true); - sEmergencyKeysEnabled = get_driver_boolean_parameter(handle, - "emergency_keys", sEmergencyKeysEnabled, sEmergencyKeysEnabled); - unload_driver_settings(handle); - } - - handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); - if (handle != NULL) { - sDebugScreenEnabled = get_driver_boolean_parameter(handle, - "debug_screen", false, false); - - unload_driver_settings(handle); - } + sSerialDebugEnabled = get_safemode_boolean("serial_debug_output", + sSerialDebugEnabled); + sSyslogOutputEnabled = get_safemode_boolean("syslog_debug_output", + sSyslogOutputEnabled); + sBlueScreenOutput = get_safemode_boolean("bluescreen", true); + sEmergencyKeysEnabled = get_safemode_boolean("emergency_keys", + sEmergencyKeysEnabled); + sDebugScreenEnabled = get_safemode_boolean("debug_screen", false); if ((sBlueScreenOutput || sDebugScreenEnabled) && blue_screen_init() != B_OK) diff --git a/src/system/kernel/device_manager/settings.cpp b/src/system/kernel/debug/safemode_settings.cpp similarity index 53% rename from src/system/kernel/device_manager/settings.cpp rename to src/system/kernel/debug/safemode_settings.cpp index c5cc854dc5..2cb9950783 100644 --- a/src/system/kernel/device_manager/settings.cpp +++ b/src/system/kernel/debug/safemode_settings.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ @@ -14,27 +14,44 @@ extern "C" status_t -get_safemode_option(const char *parameter, char *buffer, size_t *_bufferSize) +get_safemode_option(const char* parameter, char* buffer, size_t* _bufferSize) { - void *handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); - if (handle == NULL) - return B_ENTRY_NOT_FOUND; - status_t status = B_ENTRY_NOT_FOUND; - const char *value = get_driver_parameter(handle, parameter, NULL, NULL); - if (value != NULL) { - *_bufferSize = strlcpy(buffer, value, *_bufferSize); - status = B_OK; + void* handle = load_driver_settings(B_SAFEMODE_DRIVER_SETTINGS); + if (handle != NULL) { + status = B_NAME_NOT_FOUND; + + const char* value = get_driver_parameter(handle, parameter, NULL, NULL); + if (value != NULL) { + *_bufferSize = strlcpy(buffer, value, *_bufferSize); + status = B_OK; + } + + unload_driver_settings(handle); + } + + if (status != B_OK) { + // Try kernel settings file as a fall back + handle = load_driver_settings("kernel"); + if (handle != NULL) { + const char* value = get_driver_parameter(handle, parameter, NULL, + NULL); + if (value != NULL) { + *_bufferSize = strlcpy(buffer, value, *_bufferSize); + status = B_OK; + } + + unload_driver_settings(handle); + } } - unload_driver_settings(handle); return status; } extern "C" bool -get_safemode_boolean(const char *parameter, bool defaultValue) +get_safemode_boolean(const char* parameter, bool defaultValue) { char value[16]; size_t length = sizeof(value); @@ -48,12 +65,15 @@ get_safemode_boolean(const char *parameter, bool defaultValue) } -// #pragma mark - +// #pragma mark - syscalls + + +#ifndef _BOOT_MODE extern "C" status_t -_user_get_safemode_option(const char *userParameter, char *userBuffer, - size_t *_userBufferSize) +_user_get_safemode_option(const char* userParameter, char* userBuffer, + size_t* _userBufferSize) { char parameter[B_FILE_NAME_LENGTH]; char buffer[B_PATH_NAME_LENGTH]; @@ -61,7 +81,7 @@ _user_get_safemode_option(const char *userParameter, char *userBuffer, if (!IS_USER_ADDRESS(userParameter) || !IS_USER_ADDRESS(userBuffer) || !IS_USER_ADDRESS(_userBufferSize) - || user_memcpy(&bufferSize, _userBufferSize, sizeof(size_t)) < B_OK + || user_memcpy(&bufferSize, _userBufferSize, sizeof(size_t)) != B_OK || user_strlcpy(parameter, userParameter, B_FILE_NAME_LENGTH) < B_OK) return B_BAD_ADDRESS; @@ -74,8 +94,11 @@ _user_get_safemode_option(const char *userParameter, char *userBuffer, if (status == B_OK && (user_strlcpy(userBuffer, buffer, originalBufferSize) < B_OK || user_memcpy(_userBufferSize, &bufferSize, sizeof(size_t)) - < B_OK)) + != B_OK)) return B_BAD_ADDRESS; return status; } + + +#endif // !_BOOT_MODE diff --git a/src/system/kernel/device_manager/Jamfile b/src/system/kernel/device_manager/Jamfile index 017345870f..8be26e0d19 100644 --- a/src/system/kernel/device_manager/Jamfile +++ b/src/system/kernel/device_manager/Jamfile @@ -11,8 +11,6 @@ KernelMergeObject kernel_device_manager.o : io_resources.cpp IOScheduler.cpp legacy_drivers.cpp -# probe.cpp - settings.cpp dma_resources.cpp io_requests.cpp