From 09cf6b4ca8799990b9c01db04c5f4ffbef798773 Mon Sep 17 00:00:00 2001 From: Aqua-sama Date: Sun, 28 Feb 2021 14:53:13 +0200 Subject: Fix interrupts causing exception 0xd --- src/cpu/exceptions.s | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/cpu/interrupts.s | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/cpu/exceptions.s create mode 100644 src/cpu/interrupts.s (limited to 'src/cpu') 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 + -- cgit v1.2.1