summaryrefslogtreecommitdiff
path: root/src/kernel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel.c')
-rw-r--r--src/kernel.c40
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