diff options
Diffstat (limited to 'system/interrupt.S')
-rw-r--r-- | system/interrupt.S | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/system/interrupt.S b/system/interrupt.S new file mode 100644 index 0000000..3791ce2 --- /dev/null +++ b/system/interrupt.S @@ -0,0 +1,320 @@ +/* interrupt.S - interrupt handlers */ + +#include <asm/interrupt.h> + +.text + +.global EXC_DIV_ERROR, EXC_DEBUG, EXC_NMI, EXC_BREAKPOINT +.global EXC_INTO_OVERFLOW, EXC_BOUND_OVERFLOW, EXC_INVAL_OPCODE, EXC_NO_COPROCESSOR +.global EXC_DOUBLE_EXCEPTION, EXC_COPROC_PROT_ERROR, EXC_INVAL_TSS, EXC_SEG_NOT_PRESENT +.global EXC_STACK_FAULT, EXC_GEN_PROT_VIOLATION, EXC_PAGE_FAULT, EXC_RESERVED +.global EXC_COPROCESSOR_ERROR, EXC_ALIGN_ERROR + +EXC_DIV_ERROR: + mov $16,%ax + mov %ax,%ds + pushl $exc_div_error_str + call print + addl $4,%esp + jmp looping + +EXC_DEBUG: + mov $16,%ax + mov %ax,%ds + pushl $exc_debug_str + call print + addl $4,%esp + jmp looping + +EXC_NMI: + mov $16,%ax + mov %ax,%ds + pushl $exc_nmi_str + call print + addl $4,%esp + jmp looping + +EXC_BREAKPOINT: + mov $16,%ax + mov %ax,%ds + pushl $exc_breakpoint_str + call print + addl $4,%esp + jmp looping + +EXC_INTO_OVERFLOW: + mov $16,%ax + mov %ax,%ds + pushl $exc_into_overflow_str + call print + addl $4,%esp + jmp looping + +EXC_BOUND_OVERFLOW: + mov $16,%ax + mov %ax,%ds + pushl $exc_bound_overflow_str + call print + addl $4,%esp + jmp looping + +EXC_INVAL_OPCODE: + mov $16,%ax + mov %ax,%ds + pushl $exc_inval_opcode_str + call print + addl $4,%esp + jmp looping + +EXC_NO_COPROCESSOR: + mov $16,%ax + mov %ax,%ds + pushl $exc_no_coprocessor_str + call print + addl $4,%esp + jmp looping + +EXC_DOUBLE_EXCEPTION: + mov $16,%ax + mov %ax,%ds + pushl $exc_double_exception_str + call print + addl $4,%esp + jmp looping + +EXC_COPROC_PROT_ERROR: + mov $16,%ax + mov %ax,%ds + pushl $exc_coproc_prot_error_str + call print + addl $4,%esp + jmp looping + +EXC_INVAL_TSS: + mov $16,%ax + mov %ax,%ds + pushl $exc_inval_tss_str + call print + addl $4,%esp + jmp looping + +EXC_SEG_NOT_PRESENT: + mov $16,%ax + mov %ax,%ds + pushl $exc_seg_not_present_str + call print + addl $4,%esp + jmp looping + +EXC_STACK_FAULT: + mov $16,%ax + mov %ax,%ds + pushl $exc_stack_fault_str + call print + addl $4,%esp + jmp looping + +EXC_GEN_PROT_VIOLATION: + mov $16,%ax + mov %ax,%ds + pushl $exc_gen_prot_violation_str + call print + addl $4,%esp + jmp looping + +EXC_PAGE_FAULT: + mov $16,%ax + mov %ax,%ds + pushl $exc_page_fault_str + call print + addl $4,%esp + jmp looping + +EXC_RESERVED: + mov $16,%ax + mov %ax,%ds + pushl $exc_reserved_str + call print + addl $4,%esp + jmp looping + +EXC_COPROCESSOR_ERROR: + mov $16,%ax + mov %ax,%ds + pushl $exc_coprocessor_error_str + call print + addl $4,%esp + jmp looping + +EXC_ALIGN_ERROR: + mov $16,%ax + mov %ax,%ds + pushl $exc_align_error_str + call print + addl $4,%esp + +looping: jmp looping + + +.data + +exc_div_error_str: .asciz "EXCEPTION: DIVIDE ERROR\r\n" +exc_debug_str: .asciz "EXCEPTION: DEBUG EXCEPTION\r\n" +exc_nmi_str: .asciz "EXCEPTION: NON-MASKABLE INTERRUPT\r\n" +exc_breakpoint_str: .asciz "EXCEPTION: BREAKPOINT\r\n" +exc_into_overflow_str: .asciz "EXCEPTION: OVERFLOW (INTO)\r\n" +exc_bound_overflow_str: .asciz "EXCEPTION: OVERFLOW (BOUND)\r\n" +exc_inval_opcode_str: .asciz "EXCEPTION: INVALID OPCODE\r\n" +exc_no_coprocessor_str: .asciz "EXCEPTION: NO COPROCESSOR\r\n" +exc_double_exception_str: .asciz "EXCEPTION: DOUBLE EXCEPTION\r\n" +exc_coproc_prot_error_str: .asciz "EXCEPTION: COPROCESSOR PROTECTION ERROR\r\n" +exc_inval_tss_str: .asciz "EXCEPTION: INVALID TSS SEGMENT\r\n" +exc_seg_not_present_str: .asciz "EXCEPTION: SEGMENT NOT PRESENT\r\n" +exc_stack_fault_str: .asciz "EXCEPTION: STACK FAULT\r\n" +exc_gen_prot_violation_str: .asciz "EXCEPTION: GENERAL PROTECTION VIOLATION\r\n" +exc_page_fault_str: .asciz "EXCEPTION: PAGE FAULT\r\n" +exc_reserved_str: .asciz "EXCEPTION: UNKNOWN ERROR\r\n" +exc_coprocessor_error_str: .asciz "EXCEPTION: COPROCESSOR ERROR\r\n" +exc_align_error_str: .asciz "EXCEPTION: ALIGNMENT ERROR\r\n" + + +.text + +.global IRQ0, IRQ1, IRQ2, IRQ3, IRQ4, IRQ5, IRQ6, IRQ7, IRQ8, IRQ9, IRQ10, IRQ11, IRQ12, IRQ13, IRQ14, IRQ15 + +IRQ0: + pusha + pushf + incb cur_blink_counter + cmpb $CUR_BLINK,cur_blink_counter + jb no_blink + subb $CUR_BLINK,cur_blink_counter + call console_cur_blink +no_blink: + cmpl $0,timers + je no_timer + decl timers +no_timer: + mov $0x20, %al + out %al, $0x20 + popf + popa + iret + +IRQ1: + push %ax + push %ds + push %edx + mov $16,%ax + mov %ax,%ds + in $0x60,%al + call kb_write_keycode + mov $0x20, %al + out %al, $0x20 + pop %edx + pop %ds + pop %ax + iret + +IRQ2: + push %ax + mov $0x20, %al + out %al, $0x20 + pop %ax + iret + +IRQ3: + push %ax + mov $0x20, %al + out %al, $0x20 + pop %ax + iret + +IRQ4: + push %ax + mov $0x20, %al + out %al, $0x20 + pop %ax + iret + +IRQ5: + push %ax + mov $0x20, %al + out %al, $0x20 + pop %ax + iret + +IRQ6: + #push %ax + pushf + pusha + call floppy_IRQ + mov $0x20, %al + out %al, $0x20 + #pop %ax + popa + popf + iret + +IRQ7: + push %ax + mov $0x20, %al + out %al, $0x20 + pop %ax + iret + +IRQ8: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ9: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ10: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ11: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ12: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ13: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ14: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret + +IRQ15: + push %ax + mov $0x20, %al + out %al, $0xA0 + pop %ax + iret |