Files
RockOS/kernel/interrupts.S

77 lines
1.4 KiB
ArmAsm

.code32
.macro ISR_NOERRCODE num
.global isr\num
isr\num:
pushl $0
pushl $\num
jmp isr_common_stub
.endm
.macro ISR_ERRCODE num
.global isr\num
isr\num:
pushl $\num
jmp isr_common_stub
.endm
.extern common_interrupt_handler # interrupts.c
isr_common_stub:
pushal
pushl %esp
call common_interrupt_handler
addl $4, %esp
popal
addl $8, %esp
iret
.extern idtr
.global load_idt
load_idt:
lidt idtr
ret
ISR_NOERRCODE 0 # Divide by Zero
ISR_NOERRCODE 1 # Debug
ISR_ERRCODE 8 # Double Fault (Has Error Code!)
ISR_ERRCODE 13 # General Protection Fault (Has Error Code!)
ISR_ERRCODE 14 # Page Fault (Has Error Code!)
// This is a special case so we need to handle it for task switching
.global isr32
.extern switch_context # scheduler.c
.extern send_eoi_master # drivers/pic/pic.c
isr32:
cli
pushal
movw %ds, %ax
pushl %eax
movw $0x10, %ax # Load Kernel Data Segment descriptor
movw %ax, %ds
movw %ax, %es
movw %ax, %fs
movw %ax, %gs
pushl %esp
call switch_context
movl %eax, %esp
call send_eoi_master
popl %eax
movw %ax, %ds
movw %ax, %es
movw %ax, %fs
movw %ax, %gs
popal
sti
iret
ISR_NOERRCODE 33 # IRQ1 - Keyboard
ISR_NOERRCODE 46 # IRQ14
ISR_NOERRCODE 47 # IRQ15