* 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:
@@ -70,6 +70,7 @@ extern void platform_update_menu_item(Menu *menu, MenuItem *item);
|
|||||||
extern void platform_run_menu(Menu *menu);
|
extern void platform_run_menu(Menu *menu);
|
||||||
extern size_t platform_get_user_input_text(Menu *menu, MenuItem *item,
|
extern size_t platform_get_user_input_text(Menu *menu, MenuItem *item,
|
||||||
char *buffer, size_t bufferSize);
|
char *buffer, size_t bufferSize);
|
||||||
|
extern char* platform_debug_get_log_buffer(size_t* _size);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,52 @@ user_menu_boot_volume(Menu* menu, MenuItem* item)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
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;
|
ring_buffer* buffer = (ring_buffer*)gKernelArgs.debug_output;
|
||||||
if (buffer == NULL)
|
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
|
static status_t
|
||||||
save_syslog_to_volume(Directory* directory)
|
save_previous_syslog_to_volume(Directory* directory)
|
||||||
{
|
{
|
||||||
// find an unused name
|
// find an unused name
|
||||||
char name[16];
|
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
|
static bool
|
||||||
debug_menu_toggle_debug_syslog(Menu* menu, MenuItem* item)
|
debug_menu_toggle_debug_syslog(Menu* menu, MenuItem* item)
|
||||||
{
|
{
|
||||||
@@ -601,13 +646,13 @@ debug_menu_toggle_debug_syslog(Menu* menu, MenuItem* item)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
debug_menu_save_syslog(Menu* menu, MenuItem* item)
|
debug_menu_save_previous_syslog(Menu* menu, MenuItem* item)
|
||||||
{
|
{
|
||||||
Directory* volume = (Directory*)item->Data();
|
Directory* volume = (Directory*)item->Data();
|
||||||
|
|
||||||
console_clear_screen();
|
console_clear_screen();
|
||||||
|
|
||||||
save_syslog_to_volume(volume);
|
save_previous_syslog_to_volume(volume);
|
||||||
|
|
||||||
printf("\nPress any key to continue\n");
|
printf("\nPress any key to continue\n");
|
||||||
console_wait_for_key();
|
console_wait_for_key();
|
||||||
@@ -773,7 +818,7 @@ add_save_debug_syslog_menu()
|
|||||||
|
|
||||||
item = new(nothrow) MenuItem(name);
|
item = new(nothrow) MenuItem(name);
|
||||||
item->SetData(volume);
|
item->SetData(volume);
|
||||||
item->SetTarget(&debug_menu_save_syslog);
|
item->SetTarget(&debug_menu_save_previous_syslog);
|
||||||
item->SetType(MENU_ITEM_NO_CHOICE);
|
item->SetType(MENU_ITEM_NO_CHOICE);
|
||||||
item->SetHelpText(kHelpText);
|
item->SetHelpText(kHelpText);
|
||||||
menu->AddItem(item);
|
menu->AddItem(item);
|
||||||
@@ -843,13 +888,25 @@ add_debug_menu()
|
|||||||
item->SetHelpText("Enables a special in-memory syslog buffer for this "
|
item->SetHelpText("Enables a special in-memory syslog buffer for this "
|
||||||
"session that the boot loader will be able to access after rebooting.");
|
"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;
|
ring_buffer* syslogBuffer = (ring_buffer*)gKernelArgs.debug_output;
|
||||||
if (syslogBuffer != NULL && ring_buffer_readable(syslogBuffer) > 0) {
|
if (syslogBuffer != NULL && ring_buffer_readable(syslogBuffer) > 0) {
|
||||||
menu->AddSeparatorItem();
|
if (!currentLogItemVisible)
|
||||||
|
menu->AddSeparatorItem();
|
||||||
|
|
||||||
menu->AddItem(item
|
menu->AddItem(item
|
||||||
= new(nothrow) MenuItem("Display syslog from previous session"));
|
= 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->SetType(MENU_ITEM_NO_CHOICE);
|
||||||
item->SetHelpText(
|
item->SetHelpText(
|
||||||
"Displays the syslog from the previous Haiku session.");
|
"Displays the syslog from the previous Haiku session.");
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ panic(const char *format, ...)
|
|||||||
uint8 line2;
|
uint8 line2;
|
||||||
char buffer[512];
|
char buffer[512];
|
||||||
uint8 end;
|
uint8 end;
|
||||||
|
|
||||||
} _PACKED alert = {
|
} _PACKED alert = {
|
||||||
10, 12,
|
10, 12,
|
||||||
"*** PANIC ***",
|
"*** PANIC ***",
|
||||||
@@ -75,9 +75,14 @@ dprintf(const char *format, ...)
|
|||||||
vfprintf(dbgerr, format, list);
|
vfprintf(dbgerr, format, list);
|
||||||
//vsnprintf(buffer, sizeof(buffer), format, list);
|
//vsnprintf(buffer, sizeof(buffer), format, list);
|
||||||
va_end(list);
|
va_end(list);
|
||||||
|
|
||||||
//if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
//if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
||||||
// Bconput(DEV_CONSOLE, buffer);
|
// Bconput(DEV_CONSOLE, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -68,3 +68,8 @@ dprintf(const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -170,3 +170,13 @@ debug_cleanup(void)
|
|||||||
|
|
||||||
sPostCleanup = true;
|
sPostCleanup = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
if (_size != NULL)
|
||||||
|
*_size = sizeof(sBuffer);
|
||||||
|
|
||||||
|
return sBuffer;
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,3 +37,9 @@ dprintf(const char* format, ...)
|
|||||||
va_end(list);
|
va_end(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,3 +22,9 @@ dprintf(const char* format, ...)
|
|||||||
#warning IMPLEMENT dprintf
|
#warning IMPLEMENT dprintf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -54,3 +54,10 @@ dprintf(const char* format, ...)
|
|||||||
if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
if (platform_boot_options() & BOOT_OPTION_DEBUG_OUTPUT)
|
||||||
fprintf(stderr, "%s", buffer);
|
fprintf(stderr, "%s", buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char*
|
||||||
|
platform_debug_get_log_buffer(size_t* _size)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user