summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/interrupts.c13
-rw-r--r--src/interrupts.h12
-rw-r--r--src/kernel.c2
-rw-r--r--src/keyboard.c6
-rw-r--r--src/keyboard.h2
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( &divide_by_zero_interrupt_handler, 0x00, interrupt, interrupts_exception_division_by_zero );
+ interrupt_handler_init( &divide_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