diff options
-rw-r--r-- | src/interrupts.c | 13 | ||||
-rw-r--r-- | src/interrupts.h | 12 | ||||
-rw-r--r-- | src/kernel.c | 2 | ||||
-rw-r--r-- | src/keyboard.c | 6 | ||||
-rw-r--r-- | src/keyboard.h | 2 |
5 files changed, 18 insertions, 17 deletions
diff --git a/src/interrupts.c b/src/interrupts.c index 81fcfb1..9d4caf7 100644 --- a/src/interrupts.c +++ b/src/interrupts.c @@ -61,13 +61,14 @@ void interrupt_handler_init_void( interrupt_handler_t *handler ) memset( handler, 0, sizeof( interrupt_handler_t ) ); } -void interrupt_handler_init( interrupt_handler_t *handler, uint8_t interrupt_no, struct interrupt_t *interrupt, interrupt_handler_func_t handle ) +void interrupt_handler_init( interrupt_handler_t *handler, uint8_t interrupt_no, struct interrupt_t *interrupt, interrupt_handler_func_t handle, void *driver ) { memset( handler, 0, sizeof( interrupt_handler_t ) ); handler->interrupt_no = interrupt_no; handler->interrupt = interrupt; handler->handle = handle; + handler->driver = driver; } // must be global: when called via assembly code we loose the context @@ -89,7 +90,7 @@ void interrupts_init( interrupt_t *interrupt ) // divide-by-zero exception 0x00 interrupt_handler_t divide_by_zero_interrupt_handler; - interrupt_handler_init( ÷_by_zero_interrupt_handler, 0x00, interrupt, interrupts_exception_division_by_zero ); + interrupt_handler_init( ÷_by_zero_interrupt_handler, 0x00, interrupt, interrupts_exception_division_by_zero, NULL ); interrupts_register_interrupt_gate( interrupt, 0x00, GDT_CODE_SEGMENT_SELECTOR, &interrupts_handle_exception_0x00, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); @@ -97,7 +98,7 @@ void interrupts_init( interrupt_t *interrupt ) // IRQ 0 - PIT - programmable interrupt timer interrupt_handler_t pit_interrupt_handler; - interrupt_handler_init( &pit_interrupt_handler, IRQ_BASE + 0x00, interrupt, interrupts_interrupt_PIT ); + interrupt_handler_init( &pit_interrupt_handler, IRQ_BASE + 0x00, interrupt, interrupts_interrupt_PIT, NULL ); interrupts_register_interrupt_gate( interrupt, IRQ_BASE + 0x00, GDT_CODE_SEGMENT_SELECTOR, &interrupts_handle_irq_0x00, KERNEL_RING, IDT_TYPE_INTERRUPT_GATE ); @@ -164,7 +165,7 @@ void interrupts_register_interrupt_handler( interrupt_handler_t handler ) handler.interrupt->interrupt_handler[handler.interrupt_no] = handler; } -uint32_t interrupts_exception_division_by_zero( interrupt_t *interrupt, uint32_t esp ) +uint32_t interrupts_exception_division_by_zero( interrupt_handler_t *handler, uint32_t esp ) { // TODO: caused by kernel code or user land code? or a task we can kill? // For now, the kernel has no task management, so we panic @@ -174,7 +175,7 @@ uint32_t interrupts_exception_division_by_zero( interrupt_t *interrupt, uint32_t } static int pit_counter = 0; -uint32_t interrupts_interrupt_PIT( interrupt_t *interrupt, uint32_t esp ) +uint32_t interrupts_interrupt_PIT( interrupt_handler_t *handler, uint32_t esp ) { pit_counter++; printf( "PIT PIT PIT PIT PIT PIT PIT %d", pit_counter ); @@ -198,7 +199,7 @@ uint32_t interrupts_handle_interrupt( interrupt_t *interrupt, uint8_t interrupt_ kernel_panic( "Unhandled interrupt 0x%X with ESP 0x%X\n", interrupt_no, esp ); } - uint32_t new_esp = handler.handle( interrupt, esp ); + uint32_t new_esp = handler.handle( &handler, esp ); // send ACK to PIC for hardware interrups if( interrupt_no >= IRQ_BASE && interrupt_no <= IRQ_BASE + 16 ) { diff --git a/src/interrupts.h b/src/interrupts.h index 7903057..4e4dd2d 100644 --- a/src/interrupts.h +++ b/src/interrupts.h @@ -46,8 +46,9 @@ typedef struct { #endif struct interrupt_t; +struct interrupt_handler_t; -typedef uint32_t (*interrupt_handler_func_t)( struct interrupt_t *interrupt, uint32_t esp ); +typedef uint32_t (*interrupt_handler_func_t)( struct interrupt_handler_t *handler, uint32_t esp ); typedef struct interrupt_handler_t { uint8_t interrupt_no; @@ -57,7 +58,7 @@ typedef struct interrupt_handler_t { } interrupt_handler_t; void interrupt_handler_init_void( interrupt_handler_t *handler ); -void interrupt_handler_init( interrupt_handler_t *handler, uint8_t interrupt_no, struct interrupt_t *interrupt, interrupt_handler_func_t handle ); +void interrupt_handler_init( interrupt_handler_t *handler, uint8_t interrupt_no, struct interrupt_t *interrupt, interrupt_handler_func_t handle, void *driver ); typedef struct interrupt_t { interrupt_descriptor_table_pointer_t idt_pointer; @@ -87,18 +88,15 @@ uint32_t interrupts_handle_interrupt( interrupt_t *interrupt, uint8_t interrupt_ uint32_t interrupts_handle_static_interrupt( uint8_t interrupt_no, uint32_t esp ); -uint32_t interrupts_exception_division_by_zero( interrupt_t *interrupt, uint32_t esp ); +uint32_t interrupts_exception_division_by_zero( interrupt_handler_t *handler, uint32_t esp ); -uint32_t interrupts_interrupt_PIT( interrupt_t *interrupt, uint32_t esp ); +uint32_t interrupts_interrupt_PIT( interrupt_handler_t *handler, uint32_t esp ); void interrupts_ignore_request( ); void interrupts_handle_exception_0x00( ); void interrupts_handle_irq_0x00( ); void interrupts_handle_irq_0x01( ); -// initialize IDT -// handle gates -// assembly trampolines calling C (static) functions // later: tasks and stacks, queues #endif // INTERRUPTS_H diff --git a/src/kernel.c b/src/kernel.c index cd15484..ccaf911 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -39,7 +39,7 @@ void entry( void ) keyboard_t keyboard; keyboard_init( &keyboard ); interrupt_handler_t keyboard_interrupt_handler; - interrupt_handler_init( &keyboard_interrupt_handler, IRQ_BASE + 0x01, &interrupt, keyboard_handle_interrupt ); + interrupt_handler_init( &keyboard_interrupt_handler, IRQ_BASE + 0x01, &interrupt, keyboard_handle_interrupt, &keyboard ); interrupts_register_interrupt_handler( keyboard_interrupt_handler ); // exit point in case of kernel panic, do this as soon as diff --git a/src/keyboard.c b/src/keyboard.c index 672d85c..d06d594 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -7,9 +7,11 @@ void keyboard_init( keyboard_t *keyboard ) memset( keyboard, 0, sizeof( keyboard_t ) ); } -uint32_t keyboard_handle_interrupt( interrupt_t *interrupt, uint32_t esp ) +uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp ) { - puts( "KBD KBD KBD KBD KBD KBD KBD" ); + keyboard_t *keyboard = (keyboard_t *)handler->driver; + + printf( "KBD KBD KBD KBD KBD KBD KBD 0x%X\n", keyboard ); int y = 0; int x = 12 / y; diff --git a/src/keyboard.h b/src/keyboard.h index b0d87f5..ddd6bfa 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -14,6 +14,6 @@ typedef struct { void keyboard_init( keyboard_t *keyboard ); -uint32_t keyboard_handle_interrupt( interrupt_t *interrupt, uint32_t esp ); +uint32_t keyboard_handle_interrupt( interrupt_handler_t *handler, uint32_t esp ); #endif // KEYBOARD_H |