diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-16 12:10:59 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2017-06-16 12:10:59 +0200 |
commit | 7b29f7c528fc647f172ed004f729da29ef7786b9 (patch) | |
tree | b878a72663c951603e02c7dc76dbc842172f0569 /src | |
parent | 3c200891bfcffbf62ac572cd6841a09a0a69e247 (diff) | |
download | abaos-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.c | 71 |
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: |