61 lines
1.1 KiB
ArmAsm
61 lines
1.1 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
|
|
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
|
|
isr32:
|
|
cli
|
|
pushal
|
|
|
|
pushl %esp
|
|
call schedule_next_task
|
|
movl %eax, %esp
|
|
|
|
call send_eoi_master
|
|
|
|
popal
|
|
|
|
sti
|
|
iret
|
|
|
|
ISR_NOERRCODE 33 # IRQ1 - Keyboard
|
|
|
|
ISR_NOERRCODE 46 # IRQ14
|
|
ISR_NOERRCODE 47 # IRQ15 |