From 15a2290a168fa9de80256bb7cefe13384ae3e58b Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Thu, 1 Jun 2017 17:17:03 +0200 Subject: interrupt handlers take the manager as context now --- src/interrupts.asm | 4 ++-- src/interrupts.c | 29 +++++++++++++++++++++-------- src/interrupts.h | 16 ++++++++++------ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/src/interrupts.asm b/src/interrupts.asm index 4f19609..e0b0707 100644 --- a/src/interrupts.asm +++ b/src/interrupts.asm @@ -3,7 +3,7 @@ global interrupts_enable global interrupts_disable global interrupts_load_idt -extern interrupts_handle_interrupt +extern interrupts_handle_static_interrupt ; void interrupts_enable( void ) interrupts_enable: @@ -72,7 +72,7 @@ int_entry: push esp mov eax, [interrupt_no] push eax - call interrupts_handle_interrupt + call interrupts_handle_static_interrupt ;add esp, 8 mov esp, eax diff --git a/src/interrupts.c b/src/interrupts.c index b522ced..07a7e55 100644 --- a/src/interrupts.c +++ b/src/interrupts.c @@ -141,7 +141,7 @@ void interrupts_register_interrupt( interrupt_t *interrupts, interrupts->interrupt_handler[interrupt_no] = handler; } -uint32_t interrupts_exception_division_by_zero( uint32_t esp ) +uint32_t interrupts_exception_division_by_zero( interrupt_t *interrupt, 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 @@ -151,36 +151,49 @@ uint32_t interrupts_exception_division_by_zero( uint32_t esp ) } static int pit_counter = 0; -uint32_t interrupts_interrupt_PIT( uint32_t esp ) +uint32_t interrupts_interrupt_PIT( interrupt_t *interrupt, uint32_t esp ) { pit_counter++; printf( "PIT PIT PIT PIT PIT PIT PIT %d", pit_counter ); return esp; } -uint32_t interrupts_interrupt_keyboard( uint32_t esp ) +uint32_t interrupts_interrupt_keyboard( interrupt_t *interrupt, uint32_t esp ) { puts( "KBD KBD KBD KBD KBD KBD KBD" ); + +int y = 0; +int x = 12 / y; +printf( "Hex number is 0x%X and string is '%s'\n", x, "abaos" ); return esp; } -uint32_t interrupts_handle_interrupt( uint8_t interrupt_no, uint32_t esp ) +uint32_t interrupts_handle_static_interrupt( uint8_t interrupt_no, uint32_t esp ) +{ + if( active_interrupt == NULL ) { + kernel_panic( "No active interrupt handler!" ); + } + + return interrupts_handle_interrupt( active_interrupt, interrupt_no, esp ); +} + +uint32_t interrupts_handle_interrupt( interrupt_t *interrupt, uint8_t interrupt_no, uint32_t esp ) { - interrupt_handler_t handler = active_interrupt->interrupt_handler[interrupt_no]; + interrupt_handler_t handler = interrupt->interrupt_handler[interrupt_no]; if( handler == NULL ) { kernel_panic( "Unhandled interrupt 0x%X with ESP 0x%X\n", interrupt_no, esp ); } - uint32_t new_esp = handler( esp ); + uint32_t new_esp = handler( interrupt, esp ); // send ACK to PIC for hardware interrups if( interrupt_no >= IRQ_BASE && interrupt_no <= IRQ_BASE + 16 ) { if( interrupt_no < IRQ_BASE + 8 ) { - port8_write( &active_interrupt->PIC_master_control, OCW2_EOI ); + port8_write( &interrupt->PIC_master_control, OCW2_EOI ); } else { - port8_write( &active_interrupt->PIC_slave_control, OCW2_EOI ); + port8_write( &interrupt->PIC_slave_control, OCW2_EOI ); } } diff --git a/src/interrupts.h b/src/interrupts.h index 547e7c2..0cdb6cc 100644 --- a/src/interrupts.h +++ b/src/interrupts.h @@ -41,9 +41,11 @@ typedef struct { #pragma pack() #endif -typedef uint32_t (*interrupt_handler_t)( uint32_t esp ); +struct interrupt_t; -typedef struct { +typedef uint32_t (*interrupt_handler_t)( struct interrupt_t *interrupt, uint32_t esp ); + +typedef struct interrupt_t { interrupt_descriptor_table_pointer_t idt_pointer; interrupt_gate_descriptor_t descriptor_table[NOF_INTERRUPTS]; interrupt_handler_t interrupt_handler[NOF_INTERRUPTS]; @@ -66,12 +68,14 @@ void interrupts_register_interrupt( interrupt_t *interrupt, interrupt_handler_t handler ); void interrupts_load_idt( interrupt_descriptor_table_pointer_t *idt_pointer ); -uint32_t interrupts_handle_interrupt( uint8_t interrupt_no, uint32_t esp ); +uint32_t interrupts_handle_interrupt( interrupt_t *interrupt, uint8_t interrupt_no, uint32_t esp ); + +uint32_t interrupts_handle_static_interrupt( uint8_t interrupt_no, uint32_t esp ); -uint32_t interrupts_exception_division_by_zero( uint32_t esp ); +uint32_t interrupts_exception_division_by_zero( interrupt_t *interrupt, uint32_t esp ); -uint32_t interrupts_interrupt_PIT( uint32_t esp ); -uint32_t interrupts_interrupt_keyboard( uint32_t esp ); +uint32_t interrupts_interrupt_PIT( interrupt_t *interrupt, uint32_t esp ); +uint32_t interrupts_interrupt_keyboard( interrupt_t *interrupt, uint32_t esp ); void interrupts_ignore_request( ); void interrupts_handle_exception_0x00( ); -- cgit v1.2.3-54-g00ecf