From 5e78920c127914641b54a79ce41cb7120b6615fc Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Sun, 12 Jun 2011 23:31:57 +0000 Subject: [PATCH] * Added platform_debug_get_log_buffer() which returns the debug log buffer and its size. * Added "Display current boot loader log" item to the "Debug Options" boot loader menu. It displays what the boot loader has logged so far. Might be interesting for early boot issues when serial debugging is not possible. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42134 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/boot/platform.h | 1 + src/system/boot/loader/menu.cpp | 111 +++++++++++++----- src/system/boot/platform/amiga_m68k/debug.cpp | 9 +- src/system/boot/platform/atari_m68k/debug.cpp | 5 + src/system/boot/platform/bios_ia32/debug.cpp | 10 ++ .../boot/platform/openfirmware/debug.cpp | 6 + .../boot/platform/routerboard_mipsel/debug.c | 6 + src/system/boot/platform/u-boot/debug.cpp | 7 ++ 8 files changed, 126 insertions(+), 29 deletions(-) diff --git a/headers/private/kernel/boot/platform.h b/headers/private/kernel/boot/platform.h index f4549990bb..9f3c8eb637 100644 --- a/headers/private/kernel/boot/platform.h +++ b/headers/private/kernel/boot/platform.h @@ -70,6 +70,7 @@ extern void platform_update_menu_item(Menu *menu, MenuItem *item); extern void platform_run_menu(Menu *menu); extern size_t platform_get_user_input_text(Menu *menu, MenuItem *item, char *buffer, size_t bufferSize); +extern char* platform_debug_get_log_buffer(size_t* _size); #endif diff --git a/src/system/boot/loader/menu.cpp b/src/system/boot/loader/menu.cpp index f2323ba049..3c2ae22df8 100644 --- a/src/system/boot/loader/menu.cpp +++ b/src/system/boot/loader/menu.cpp @@ -487,7 +487,52 @@ user_menu_boot_volume(Menu* menu, MenuItem* item) static bool -debug_menu_display_syslog(Menu* menu, MenuItem* item) +debug_menu_display_current_log(Menu* menu, MenuItem* item) +{ + // get the buffer + size_t bufferSize; + const char* buffer = platform_debug_get_log_buffer(&bufferSize); + if (buffer == NULL || bufferSize == 0) + return true; + + struct TextSource : PagerTextSource { + TextSource(const char* buffer, size_t size) + : + fBuffer(buffer), + fSize(strnlen(buffer, size)) + { + } + + virtual size_t BytesAvailable() const + { + return fSize; + } + + virtual size_t Read(size_t offset, void* buffer, size_t size) const + { + if (offset >= fSize) + return 0; + + if (size > fSize - offset) + size = fSize - offset; + + memcpy(buffer, fBuffer + offset, size); + return size; + } + + private: + const char* fBuffer; + size_t fSize; + }; + + pager(TextSource(buffer, bufferSize)); + + return true; +} + + +static bool +debug_menu_display_previous_syslog(Menu* menu, MenuItem* item) { ring_buffer* buffer = (ring_buffer*)gKernelArgs.debug_output; if (buffer == NULL) @@ -520,28 +565,8 @@ debug_menu_display_syslog(Menu* menu, MenuItem* item) } -static bool -debug_menu_add_advanced_option(Menu* menu, MenuItem* item) -{ - char buffer[256]; - - size_t size = platform_get_user_input_text(menu, item, buffer, - sizeof(buffer) - 1); - - if (size > 0) { - buffer[size] = '\n'; - size_t pos = strlen(sSafeModeOptionsBuffer); - if (pos + size + 1 < sizeof(sSafeModeOptionsBuffer)) - strlcat(sSafeModeOptionsBuffer, buffer, - sizeof(sSafeModeOptionsBuffer)); - } - - return true; -} - - static status_t -save_syslog_to_volume(Directory* directory) +save_previous_syslog_to_volume(Directory* directory) { // find an unused name char name[16]; @@ -592,6 +617,26 @@ save_syslog_to_volume(Directory* directory) } +static bool +debug_menu_add_advanced_option(Menu* menu, MenuItem* item) +{ + char buffer[256]; + + size_t size = platform_get_user_input_text(menu, item, buffer, + sizeof(buffer) - 1); + + if (size > 0) { + buffer[size] = '\n'; + size_t pos = strlen(sSafeModeOptionsBuffer); + if (pos + size + 1 < sizeof(sSafeModeOptionsBuffer)) + strlcat(sSafeModeOptionsBuffer, buffer, + sizeof(sSafeModeOptionsBuffer)); + } + + return true; +} + + static bool debug_menu_toggle_debug_syslog(Menu* menu, MenuItem* item) { @@ -601,13 +646,13 @@ debug_menu_toggle_debug_syslog(Menu* menu, MenuItem* item) static bool -debug_menu_save_syslog(Menu* menu, MenuItem* item) +debug_menu_save_previous_syslog(Menu* menu, MenuItem* item) { Directory* volume = (Directory*)item->Data(); console_clear_screen(); - save_syslog_to_volume(volume); + save_previous_syslog_to_volume(volume); printf("\nPress any key to continue\n"); console_wait_for_key(); @@ -773,7 +818,7 @@ add_save_debug_syslog_menu() item = new(nothrow) MenuItem(name); item->SetData(volume); - item->SetTarget(&debug_menu_save_syslog); + item->SetTarget(&debug_menu_save_previous_syslog); item->SetType(MENU_ITEM_NO_CHOICE); item->SetHelpText(kHelpText); menu->AddItem(item); @@ -843,13 +888,25 @@ add_debug_menu() item->SetHelpText("Enables a special in-memory syslog buffer for this " "session that the boot loader will be able to access after rebooting."); + bool currentLogItemVisible = platform_debug_get_log_buffer(NULL) != NULL; + if (currentLogItemVisible) { + menu->AddSeparatorItem(); + menu->AddItem(item + = new(nothrow) MenuItem("Display current boot loader log")); + item->SetTarget(&debug_menu_display_current_log); + item->SetType(MENU_ITEM_NO_CHOICE); + item->SetHelpText( + "Displays the debug info the boot loader has logged."); + } + ring_buffer* syslogBuffer = (ring_buffer*)gKernelArgs.debug_output; if (syslogBuffer != NULL && ring_buffer_readable(syslogBuffer) > 0) { - menu->AddSeparatorItem(); + if (!currentLogItemVisible) + menu->AddSeparatorItem(); menu->AddItem(item = new(nothrow) MenuItem("Display syslog from previous session")); - item->SetTarget(&debug_menu_display_syslog); + item->SetTarget(&debug_menu_display_previous_syslog); item->SetType(MENU_ITEM_NO_CHOICE); item->SetHelpText( "Displays the syslog from the previous Haiku session."); diff --git a/src/system/boot/platform/amiga_m68k/debug.cpp b/src/system/boot/platform/amiga_m68k/debug.cpp index 3eacd95c49..beeda4371a 100644 --- a/src/system/boot/platform/amiga_m68k/debug.cpp +++ b/src/system/boot/platform/amiga_m68k/debug.cpp @@ -33,7 +33,7 @@ panic(const char *format, ...) uint8 line2; char buffer[512]; uint8 end; - + } _PACKED alert = { 10, 12, "*** PANIC ***", @@ -75,9 +75,14 @@ dprintf(const char *format, ...) vfprintf(dbgerr, format, list); //vsnprintf(buffer, sizeof(buffer), format, list); va_end(list); - + //if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) // Bconput(DEV_CONSOLE, buffer); } +char* +platform_debug_get_log_buffer(size_t* _size) +{ + return NULL; +} diff --git a/src/system/boot/platform/atari_m68k/debug.cpp b/src/system/boot/platform/atari_m68k/debug.cpp index 7aef7692d3..c47f4b4366 100644 --- a/src/system/boot/platform/atari_m68k/debug.cpp +++ b/src/system/boot/platform/atari_m68k/debug.cpp @@ -68,3 +68,8 @@ dprintf(const char *format, ...) } +char* +platform_debug_get_log_buffer(size_t* _size) +{ + return NULL; +} diff --git a/src/system/boot/platform/bios_ia32/debug.cpp b/src/system/boot/platform/bios_ia32/debug.cpp index acd56a6ff2..73d2906415 100644 --- a/src/system/boot/platform/bios_ia32/debug.cpp +++ b/src/system/boot/platform/bios_ia32/debug.cpp @@ -170,3 +170,13 @@ debug_cleanup(void) sPostCleanup = true; } + + +char* +platform_debug_get_log_buffer(size_t* _size) +{ + if (_size != NULL) + *_size = sizeof(sBuffer); + + return sBuffer; +} diff --git a/src/system/boot/platform/openfirmware/debug.cpp b/src/system/boot/platform/openfirmware/debug.cpp index e24a692924..ef31e66e64 100644 --- a/src/system/boot/platform/openfirmware/debug.cpp +++ b/src/system/boot/platform/openfirmware/debug.cpp @@ -37,3 +37,9 @@ dprintf(const char* format, ...) va_end(list); } + +char* +platform_debug_get_log_buffer(size_t* _size) +{ + return NULL; +} diff --git a/src/system/boot/platform/routerboard_mipsel/debug.c b/src/system/boot/platform/routerboard_mipsel/debug.c index 9c9163def1..091cb414a2 100644 --- a/src/system/boot/platform/routerboard_mipsel/debug.c +++ b/src/system/boot/platform/routerboard_mipsel/debug.c @@ -22,3 +22,9 @@ dprintf(const char* format, ...) #warning IMPLEMENT dprintf } + +char* +platform_debug_get_log_buffer(size_t* _size) +{ + return NULL; +} diff --git a/src/system/boot/platform/u-boot/debug.cpp b/src/system/boot/platform/u-boot/debug.cpp index bb412eccf8..5b4e0acb42 100644 --- a/src/system/boot/platform/u-boot/debug.cpp +++ b/src/system/boot/platform/u-boot/debug.cpp @@ -54,3 +54,10 @@ dprintf(const char* format, ...) if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT) fprintf(stderr, "%s", buffer); } + + +char* +platform_debug_get_log_buffer(size_t* _size) +{ + return NULL; +}