summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2017-06-16 12:10:59 +0200
committerAndreas Baumann <mail@andreasbaumann.cc>2017-06-16 12:10:59 +0200
commit7b29f7c528fc647f172ed004f729da29ef7786b9 (patch)
treeb878a72663c951603e02c7dc76dbc842172f0569 /src
parent3c200891bfcffbf62ac572cd6841a09a0a69e247 (diff)
downloadabaos-7b29f7c528fc647f172ed004f729da29ef7786b9.tar.gz
abaos-7b29f7c528fc647f172ed004f729da29ef7786b9.tar.bz2
added a global kernel data structure, so we don't allocate the
basic drivers on the stack of kernel_main added commands 'clear' to clear the screen and 'mode' to switch the mode of the graphics card (for testing)
Diffstat (limited to 'src')
-rw-r--r--src/kernel/kernel.c71
1 files changed, 40 insertions, 31 deletions
diff --git a/src/kernel/kernel.c b/src/kernel/kernel.c
index 677d760..dbaa4d7 100644
--- a/src/kernel/kernel.c
+++ b/src/kernel/kernel.c
@@ -27,9 +27,13 @@ static void handle_mouse_event( mouse_event_t *event, void *context );
static bool terminate = false;
-// TODO: eliminate this, have a global kernel data structure,
-// also elimiate all the object allocated on the stack in kernel_main
-static driver_manager_t *global_driver_manager;
+typedef struct {
+ vga_text_t vga_text;
+ driver_manager_t driver_manager;
+ vga_t vga;
+} global_context_t;
+
+static global_context_t global_context;
// must be first entry in kernel.bin (0x8800) as stage 2 of
// the boot loader expects the entry point to be here!
@@ -38,15 +42,13 @@ void kernel_main( void )
serial_t serial;
serial_init( &serial );
- vga_text_t vga_text;
- vga_text_init( &vga_text );
- vga_text_set_color( &vga_text, VGA_TEXT_COLOR_LIGHT_GREY );
- vga_text_set_background_color( &vga_text, VGA_TEXT_COLOR_BLACK );
-// vga_text_clear_screen( &vga_text );
+ vga_text_init( &global_context.vga_text );
+ vga_text_set_color( &global_context.vga_text, VGA_TEXT_COLOR_LIGHT_GREY );
+ vga_text_set_background_color( &global_context.vga_text, VGA_TEXT_COLOR_BLACK );
console_t console;
console_init( &console );
- console_add_vga_text_output( &console, &vga_text );
+ console_add_vga_text_output( &console, &global_context.vga_text );
console_add_serial_output( &console, &serial );
// initialize the early console of the kernel
@@ -66,25 +68,23 @@ void kernel_main( void )
interrupts_init( &interrupt );
puts( "Initializing drivers" );
- driver_manager_t driver_manager;
- driver_manager_init( &driver_manager );
- global_driver_manager = &driver_manager;
+ driver_manager_init( &global_context.driver_manager );
// hard-wired drivers
keyboard_t keyboard;
- keyboard_init( &keyboard, &handle_keyboard_event, (void *)&vga_text );
+ keyboard_init( &keyboard, &handle_keyboard_event, (void *)&global_context );
interrupt_handler_t keyboard_interrupt_handler;
interrupt_handler_init( &keyboard_interrupt_handler, IRQ_BASE + 0x01, &interrupt, keyboard_handle_interrupt, &keyboard );
interrupts_register_interrupt_handler( keyboard_interrupt_handler );
- driver_manager_add_driver( &driver_manager, (driver_t *)&keyboard );
+ driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&keyboard );
mouse_t mouse;
- mouse_init( &mouse, &handle_mouse_event, (void *)&vga_text );
+ mouse_init( &mouse, &handle_mouse_event, (void *)&global_context );
interrupt_handler_t mouse_interrupt_handler;
interrupt_handler_init( &mouse_interrupt_handler, IRQ_BASE + 0x0C, &interrupt, mouse_handle_interrupt, &mouse );
interrupts_register_interrupt_handler( mouse_interrupt_handler );
- driver_manager_add_driver( &driver_manager, (driver_t *)&mouse );
+ driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&mouse );
// exit point in case of kernel panic, do this as soon as
// possible
@@ -96,19 +96,14 @@ void kernel_main( void )
puts( "Detecting devices via PCI.." );
pci_controller_t pci_controller;
pci_controller_init( &pci_controller );
- pci_controller_scan_and_register( &pci_controller, &driver_manager, &interrupt );
+ pci_controller_scan_and_register( &pci_controller, &global_context.driver_manager, &interrupt );
- // TODO: move away in pci.c or in a dynamic loader module later
- vga_t vga;
- vga_init( &vga, NULL );
- driver_manager_add_driver( &driver_manager, (driver_t *)&vga );
+ // TODO: merge with the text mode vga_text_t object
+ vga_init( &global_context.vga, NULL );
+ driver_manager_add_driver( &global_context.driver_manager, (driver_t *)&global_context.vga );
puts( "Activating drivers" );
- driver_manager_activate_all( &driver_manager );
-
-// if( vga_set_mode( &vga, vga_make_mode( 320, 200, 8 ) ) ) {
-// vga_clear_screen( &vga, vga_make_RGB( 0x00, 0x00, 0xA8 ) );
-// }
+ driver_manager_activate_all( &global_context.driver_manager );
// TODO: later, disable VGA text console in stdio and add the
// graphical one..
@@ -130,9 +125,9 @@ void kernel_main( void )
TERMINATE:
puts( "Deactivating drivers" );
- driver_manager_deactivate_all( &driver_manager );
+ driver_manager_deactivate_all( &global_context.driver_manager );
- driver_manager_deinit( &driver_manager );
+ driver_manager_deinit( &global_context.driver_manager );
puts( "Kernel terminated" );
}
@@ -153,7 +148,10 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
{
static int pos = 0;
static char buf[80];
- vga_text_t *vga_text = (vga_text_t *)context;
+ global_context_t *global_context = (global_context_t *)context;
+ vga_text_t *vga_text = &global_context->vga_text;
+ driver_manager_t *driver_manager = &global_context->driver_manager;
+ vga_t *vga = &global_context->vga;
vga_text_hide_mouse_cursor( vga_text );
@@ -168,6 +166,8 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
puts( "mem - show memory usage" );
puts( "driver - show status of drivers" );
puts( "proc - show process status" );
+ puts( "clear - clear screen" );
+ puts( "mode - switch between text/graphics mode" );
} else if( strcmp( buf, "halt" ) == 0 ) {
terminate = true;
} else if( strcmp( buf, "mem" ) == 0 ) {
@@ -175,7 +175,15 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
} else if( strcmp( buf, "proc" ) == 0 ) {
// TODO: print scheduler status
} else if( strcmp( buf, "driver" ) == 0 ) {
- driver_manager_print_info_all( global_driver_manager );
+ driver_manager_print_info_all( driver_manager );
+ } else if( strcmp( buf, "clear" ) == 0 ) {
+ vga_text_clear_screen( vga_text );
+ } else if( strcmp( buf, "mode" ) == 0 ) {
+ // TODO: move mode switches to and from graphics/text mode here,
+ // for now when we enter the graphics mode we remain there
+ if( vga_set_mode( vga, vga_make_mode( 320, 200, 8 ) ) ) {
+ vga_clear_screen( vga, vga_make_RGB( 0x00, 0x00, 0xA8 ) );
+ }
} else {
printf( "ERR: Unknown pre-boot command '%s'\n", buf );
}
@@ -194,7 +202,8 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context )
static void handle_mouse_event( mouse_event_t *event, void *context )
{
- vga_text_t *vga_text = (vga_text_t *)context;
+ global_context_t *global_context = (global_context_t *)context;
+ vga_text_t *vga_text = &global_context->vga_text;
switch( event->type ) {
case MOUSE_EVENT_TYPE_BUTTON_UP: