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; +}