summaryrefslogtreecommitdiffstats
path: root/system/interrupt.S
diff options
context:
space:
mode:
Diffstat (limited to 'system/interrupt.S')
-rw-r--r--system/interrupt.S320
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