summaryrefslogtreecommitdiff
path: root/kernel/src/interrupt/isr.asm
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/interrupt/isr.asm')
-rw-r--r--kernel/src/interrupt/isr.asm99
1 files changed, 99 insertions, 0 deletions
diff --git a/kernel/src/interrupt/isr.asm b/kernel/src/interrupt/isr.asm
new file mode 100644
index 0000000..6cccdc6
--- /dev/null
+++ b/kernel/src/interrupt/isr.asm
@@ -0,0 +1,99 @@
+extern idt_exception_handler
+extern idt_pic_timer
+extern idt_pic_keyboard
+extern idt_pic_mouse
+extern idt_pic_eoi
+global isr_stub_table
+
+%macro ISRErrorStub 1
+isr_stub_%+%1:
+ push dword %1
+ call idt_exception_handler
+ pop eax
+ iret
+%endmacro
+
+%macro PICGeneric 1
+isr_stub_%+%1:
+ push dword %1
+ call idt_pic_eoi
+ pop eax
+ iret
+%endmacro
+
+%macro PICTimer 1
+isr_stub_%+%1:
+ call idt_pic_timer
+ push dword %1
+ call idt_pic_eoi
+ pop eax
+ iret
+%endmacro
+
+%macro PICKeyboard 1
+isr_stub_%+%1:
+ call idt_pic_keyboard
+ push dword %1
+ call idt_pic_eoi
+ pop eax
+ iret
+%endmacro
+
+%macro PICMouse 1
+isr_stub_%+%1:
+ call idt_pic_mouse
+ push dword %1
+ call idt_pic_eoi
+ pop eax
+ iret
+%endmacro
+
+%macro ISRSyscall 1
+isr_stub_%+%1:
+ push eax
+ push ebx
+ push ecx
+ push edx
+ call idt_syscall
+ add esp, 16
+ pop eax
+ iret
+%endmacro
+
+section .text
+align 8
+%assign i 0
+%rep 32
+ ISRErrorStub i
+%assign i i+1
+%endrep
+PICTimer 32 ; 0
+PICKeyboard 33 ; 1
+PICGeneric 34 ; 2
+PICGeneric 35 ; 3
+PICGeneric 36 ; 4
+PICGeneric 37 ; 5
+PICGeneric 38 ; 6
+PICGeneric 39 ; 7
+PICGeneric 40 ; 8
+PICGeneric 41 ; 9
+PICGeneric 42 ; 10
+PICGeneric 43 ; 11
+PICMouse 44 ; 12
+PICGeneric 45 ; 13
+PICGeneric 46 ; 14
+PICGeneric 47 ; 15
+%assign i 48
+%rep 256 - 48
+ ISRErrorStub i
+%assign i i+1
+%endrep
+
+section .rodata
+align 8
+isr_stub_table:
+%assign i 0x00
+%rep 256
+ dd isr_stub_%+i
+%assign i i+0x01
+%endrep