* 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
This commit is contained in:
Ingo Weinhold 2011-06-12 23:31:57 +00:00
parent 73df2f2086
commit 5e78920c12
8 changed files with 126 additions and 29 deletions

View File

@ -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

View File

@ -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.");

View File

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

View File

@ -68,3 +68,8 @@ dprintf(const char *format, ...)
}
char*
platform_debug_get_log_buffer(size_t* _size)
{
return NULL;
}

View File

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

View File

@ -37,3 +37,9 @@ dprintf(const char* format, ...)
va_end(list);
}
char*
platform_debug_get_log_buffer(size_t* _size)
{
return NULL;
}

View File

@ -22,3 +22,9 @@ dprintf(const char* format, ...)
#warning IMPLEMENT dprintf
}
char*
platform_debug_get_log_buffer(size_t* _size)
{
return NULL;
}

View File

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