aboutsummaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/exceptions.s51
-rw-r--r--src/cpu/interrupts.s50
2 files changed, 101 insertions, 0 deletions
diff --git a/src/cpu/exceptions.s b/src/cpu/exceptions.s
new file mode 100644
index 0000000..9736be1
--- /dev/null
+++ b/src/cpu/exceptions.s
@@ -0,0 +1,51 @@
+.section .text
+.extern print_exception
+
+.macro exception num
+.global exception\num
+exception\num:
+ movb $\num, (exc)
+ jmp exception_common
+.endm
+
+exception 0x00
+exception 0x01
+exception 0x02
+exception 0x03
+exception 0x04
+exception 0x05
+exception 0x06
+exception 0x07
+exception 0x08
+exception 0x09
+exception 0x0a
+exception 0x0b
+exception 0x0c
+exception 0x0d
+exception 0x0e
+exception 0x0f
+exception 0x10
+exception 0x11
+exception 0x12
+exception 0x13
+
+exception_common:
+ pusha
+ pushl %ds
+ pushl %es
+ pushl %fs
+ pushl %gs
+
+ push (exc)
+ call print_exception
+
+ popl %gs
+ popl %fs
+ popl %es
+ popl %ds
+ popa
+ iret
+
+.data
+ exc: .byte 0
+
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
+