mirror of
https://review.haiku-os.org/haiku
synced 2024-11-23 15:28:58 +01:00
kernel/debug: Initialize the frame buffer console much earlier, if possible.
Previously it was not initialized until "post-VM", but there are a number of ways VM initialization can go wrong that it would be nice to know about without needing a serial port. On arches which map the whole physical memory into the kernel address space (x86_64, at least), we can get the bluescreen facility initialized using KERNEL_PMAP_BASE. On other architectures, we just fail to init then, and do the usual setup later on. A slight bit of extra code cleanup in blue_screen_init_early: we now just call module->info.std_ops() rather than a frame-buffer-console specific method.
This commit is contained in:
parent
4550b3c025
commit
f72d1684e5
@ -34,6 +34,7 @@ bool frame_buffer_console_available(void);
|
|||||||
status_t frame_buffer_update(addr_t baseAddress, int32 width, int32 height,
|
status_t frame_buffer_update(addr_t baseAddress, int32 width, int32 height,
|
||||||
int32 depth, int32 bytesPerRow);
|
int32 depth, int32 bytesPerRow);
|
||||||
status_t frame_buffer_console_init(struct kernel_args* args);
|
status_t frame_buffer_console_init(struct kernel_args* args);
|
||||||
|
status_t frame_buffer_console_init_post_vm(struct kernel_args* args);
|
||||||
status_t frame_buffer_console_init_post_modules(struct kernel_args* args);
|
status_t frame_buffer_console_init_post_modules(struct kernel_args* args);
|
||||||
|
|
||||||
status_t _user_frame_buffer_update(addr_t baseAddress, int32 width,
|
status_t _user_frame_buffer_update(addr_t baseAddress, int32 width,
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#include "blue_screen.h"
|
#include "blue_screen.h"
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <frame_buffer_console.h>
|
|
||||||
#include <console.h>
|
#include <console.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
#include <arch/debug_console.h>
|
#include <arch/debug_console.h>
|
||||||
@ -63,7 +62,7 @@ struct screen_info {
|
|||||||
int32 args[MAX_ARGS];
|
int32 args[MAX_ARGS];
|
||||||
} sScreen;
|
} sScreen;
|
||||||
|
|
||||||
console_module_info *sModule;
|
console_module_info *sModule = NULL;
|
||||||
|
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
@ -594,16 +593,31 @@ set_paging(int argc, char **argv)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
blue_screen_init(void)
|
blue_screen_init_early()
|
||||||
{
|
{
|
||||||
extern console_module_info gFrameBufferConsoleModule;
|
|
||||||
|
|
||||||
// we can't use get_module() here, since it's too early in the boot process
|
// we can't use get_module() here, since it's too early in the boot process
|
||||||
|
extern console_module_info gFrameBufferConsoleModule;
|
||||||
if (!frame_buffer_console_available())
|
|
||||||
return B_ERROR;
|
|
||||||
|
|
||||||
sModule = &gFrameBufferConsoleModule;
|
sModule = &gFrameBufferConsoleModule;
|
||||||
|
|
||||||
|
if (sModule->info.std_ops(B_MODULE_INIT) != B_OK) {
|
||||||
|
sModule = NULL;
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
sScreen.paging = sScreen.paging_timeout = false;
|
||||||
|
return B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
blue_screen_init()
|
||||||
|
{
|
||||||
|
if (sModule == NULL) {
|
||||||
|
// Early initialization must have previously failed, or never run.
|
||||||
|
if (blue_screen_init_early() != B_OK)
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
sScreen.paging = !get_safemode_boolean(
|
sScreen.paging = !get_safemode_boolean(
|
||||||
"disable_onscreen_paging", false);
|
"disable_onscreen_paging", false);
|
||||||
sScreen.paging_timeout = false;
|
sScreen.paging_timeout = false;
|
||||||
|
@ -13,7 +13,8 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
status_t blue_screen_init(void);
|
status_t blue_screen_init_early();
|
||||||
|
status_t blue_screen_init();
|
||||||
status_t blue_screen_enter(bool debugOutput);
|
status_t blue_screen_enter(bool debugOutput);
|
||||||
|
|
||||||
bool blue_screen_paging_enabled(void);
|
bool blue_screen_paging_enabled(void);
|
||||||
|
@ -1689,6 +1689,9 @@ debug_init(kernel_args* args)
|
|||||||
|
|
||||||
debug_paranoia_init();
|
debug_paranoia_init();
|
||||||
arch_debug_console_init(args);
|
arch_debug_console_init(args);
|
||||||
|
|
||||||
|
if (frame_buffer_console_init(args) == B_OK && blue_screen_init_early() == B_OK)
|
||||||
|
sBlueScreenOutput = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1715,7 +1718,7 @@ debug_init_post_vm(kernel_args* args)
|
|||||||
|
|
||||||
debug_heap_init();
|
debug_heap_init();
|
||||||
debug_variables_init();
|
debug_variables_init();
|
||||||
frame_buffer_console_init(args);
|
frame_buffer_console_init_post_vm(args);
|
||||||
tracing_init();
|
tracing_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1735,7 +1738,7 @@ debug_init_post_settings(struct kernel_args* args)
|
|||||||
sDebugScreenEnabled = get_safemode_boolean("debug_screen", false);
|
sDebugScreenEnabled = get_safemode_boolean("debug_screen", false);
|
||||||
|
|
||||||
if ((sBlueScreenOutput || sDebugScreenEnabled)
|
if ((sBlueScreenOutput || sDebugScreenEnabled)
|
||||||
&& blue_screen_init() != B_OK)
|
&& blue_screen_init() != B_OK)
|
||||||
sBlueScreenOutput = sDebugScreenEnabled = false;
|
sBlueScreenOutput = sDebugScreenEnabled = false;
|
||||||
|
|
||||||
if (sDebugScreenEnabled)
|
if (sDebugScreenEnabled)
|
||||||
|
@ -455,8 +455,27 @@ frame_buffer_console_init(kernel_args* args)
|
|||||||
if (!args->frame_buffer.enabled)
|
if (!args->frame_buffer.enabled)
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
|
||||||
|
#if KERNEL_PMAP_BASE
|
||||||
|
const addr_t frameBuffer = (KERNEL_PMAP_BASE
|
||||||
|
+ args->frame_buffer.physical_buffer.start);
|
||||||
|
frame_buffer_update((addr_t)frameBuffer, args->frame_buffer.width,
|
||||||
|
args->frame_buffer.height, args->frame_buffer.depth,
|
||||||
|
args->frame_buffer.bytes_per_row);
|
||||||
|
return B_OK;
|
||||||
|
#else
|
||||||
|
return B_NO_INIT;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
frame_buffer_console_init_post_vm(kernel_args* args)
|
||||||
|
{
|
||||||
|
if (!args->frame_buffer.enabled)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
void* frameBuffer;
|
void* frameBuffer;
|
||||||
sConsole.area = map_physical_memory("vesa frame buffer",
|
sConsole.area = map_physical_memory("frame buffer",
|
||||||
args->frame_buffer.physical_buffer.start,
|
args->frame_buffer.physical_buffer.start,
|
||||||
args->frame_buffer.physical_buffer.size, B_ANY_KERNEL_ADDRESS,
|
args->frame_buffer.physical_buffer.size, B_ANY_KERNEL_ADDRESS,
|
||||||
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA | B_CLONEABLE_AREA,
|
B_KERNEL_READ_AREA | B_KERNEL_WRITE_AREA | B_CLONEABLE_AREA,
|
||||||
|
Loading…
Reference in New Issue
Block a user