aboutsummaryrefslogtreecommitdiff
path: root/src/cpu/interrupts.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/interrupts.s')
-rw-r--r--src/cpu/interrupts.s50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/cpu/interrupts.s b/src/cpu/interrupts.s
new file mode 100644
index 0000000..17c39e9
--- /dev/null
+++ b/src/cpu/interrupts.s
@@ -0,0 +1,50 @@
+.section .text
+.extern handle_interrupt
+
+.macro interrupt num
+.global interrupt\num
+interrupt\num:
+ movb $\num, (irq)
+ jmp interrupt_common
+.endm
+
+interrupt 0x00 # system timer
+interrupt 0x01 # keyboard controller
+interrupt 0x02 # slave pic
+interrupt 0x03 # serial port 2 and 4
+interrupt 0x04 # serial port 1 and 3
+interrupt 0x05 # parallel port 2 and 3, sound card
+interrupt 0x06 # floppy controller
+interrupt 0x07 # parallel port 1
+
+interrupt 0x08 # real-time clock
+interrupt 0x09 # acpi
+interrupt 0x0a #
+interrupt 0x0b #
+interrupt 0x0c # mouse on ps/2
+interrupt 0x0d # fpu
+interrupt 0x0e # primary ATA
+interrupt 0x0f # secondary ATA
+
+interrupt_common:
+ pusha
+ pushl %ds
+ pushl %es
+ pushl %fs
+ pushl %gs
+
+ pushl %esp
+ push (irq)
+ call handle_interrupt
+ mov %eax, %esp
+
+ popl %gs
+ popl %fs
+ popl %es
+ popl %ds
+ popa
+ iret
+
+.data
+ irq: .byte 0
+