diff options
Diffstat (limited to 'src/kernel.c')
-rw-r--r-- | src/kernel.c | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/src/kernel.c b/src/kernel.c index 9f4fae5..c5f03e5 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -9,6 +9,7 @@ #include "string.h" #include "stdio.h" #include "interrupts.h" +#include "driver.h" #include "keyboard.h" #include "mouse.h" #include "pci.h" @@ -45,38 +46,54 @@ void kernel_main( void ) puts( "Started early kernel console" ); printf( "Kernel code and data is at 0x%X, kernel stack at 0x%X\n", 0x8400, 0x90000 ); + // exit point in case of kernel panic, do this as soon as + // possible, as soon we have an early console we can croak on + if( setjmp( panic_jmp_buf ) > 0 ) { + goto TERMINATE; + } + puts( "Initializing interrupts" ); interrupt_t interrupt; interrupts_init( &interrupt ); - - puts( "Initializing PS/2 keyboard" ); + + puts( "Initializing drivers" ); + driver_manager_t driver_manager; + driver_manager_init( &driver_manager ); + + // hard-wired drivers + keyboard_t keyboard; keyboard_init( &keyboard, &handle_keyboard_event, (void *)&vga ); 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 ); - puts( "Initializing PS/2 mouse" ); mouse_t mouse; mouse_init( &mouse, &handle_mouse_event, (void *)&vga ); 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 ); // exit point in case of kernel panic, do this as soon as // possible if( setjmp( panic_jmp_buf ) > 0 ) { goto TERMINATE; } - - puts( "Enabling interrupt handing now.." ); - interrupts_enable( ); + // dynamically detected and registered drivers puts( "Detecting devices via PCI.." ); pci_controller_t pci_controller; pci_controller_init( &pci_controller ); pci_controller_scan( &pci_controller ); + puts( "Activating drivers" ); + driver_manager_activate_all( &driver_manager ); + + puts( "Enabling interrupt handing now.." ); + interrupts_enable( ); + puts( "Running.." ); // endless loop doing nothing, later we have to get events @@ -90,11 +107,14 @@ void kernel_main( void ) } TERMINATE: + puts( "Deactivating drivers" ); + driver_manager_deactivate_all( &driver_manager ); + puts( "Deinitializing PS/2 mouse.." ); mouse_deinit( &mouse ); - puts( "Deinitializing PS/2 keyboard.." ); - keyboard_deinit( &keyboard ); +// puts( "Deinitializing PS/2 keyboard.." ); +// keyboard_deinit( &keyboard ); puts( "Terminating" ); } @@ -126,11 +146,11 @@ static void handle_keyboard_event( keyboard_event_t *event, void *context ) pos = 0; puts( "" ); if( strcmp( buf, "help" ) == 0 ) { - puts( "quit - terminate os" ); + puts( "halt - terminate os" ); puts( "mem - show memory usage" ); puts( "driver - show status of drivers" ); puts( "proc - show process status" ); - } else if( strcmp( buf, "quit" ) == 0 ) { + } else if( strcmp( buf, "halt" ) == 0 ) { terminate = true; } else if( strcmp( buf, "mem" ) == 0 ) { // TODO: print memory usage |