X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=3sys;a=blobdiff_plain;f=sys1%2Fkern%2Fsrc%2Fintr.asm;fp=sys1%2Fkern%2Fsrc%2Fintr.asm;h=dd35095c2aa7f7490a12df71ef419edb278135c6;hp=0000000000000000000000000000000000000000;hb=aac04321fda4094e8623a10ed39d2916ada40ccf;hpb=0d2d1730817f3ef5fc766149f2598480094cbae8 diff --git a/sys1/kern/src/intr.asm b/sys1/kern/src/intr.asm new file mode 100644 index 0000000..dd35095 --- /dev/null +++ b/sys1/kern/src/intr.asm @@ -0,0 +1,117 @@ + bits 32 + section .text + + extern intr_handler + +PIC1_CMD_PORT equ 0x20 +PIC2_CMD_PORT equ 0xa0 +OCW2_EOI equ 0x20 +OCW3_ISR equ 0x0b + + global set_idt +set_idt: + mov eax, [esp + 4] + mov [idtbase], eax + mov ax, [esp + 8] + mov [idtlim], ax + lidt [idtlim] + ret + + align 4 + dw 0 +idtlim dw 0 +idtbase dd 0 + + + ; special entry point for IRQ7 to catch and disregard spurious interrupts + global intr_entry_irq7_verify +intr_entry_irq7_verify: + push eax + mov al, OCW3_ISR + out PIC1_CMD_PORT, al + in al, PIC1_CMD_PORT + and al, 0x80 + pop eax + jnz intr_entry_irq7 + iret + + global intr_entry_irq15_verify +intr_entry_irq15_verify: + ; similarly for IRQ15 + push eax + mov al, OCW3_ISR + out PIC2_CMD_PORT, al + in al, PIC2_CMD_PORT + and al, 0x80 + jnz .valid + ; it was spurious, send EOI to master PIC and iret + mov al, OCW2_EOI + out PIC1_CMD_PORT, al + pop eax + iret +.valid: pop eax + jmp intr_entry_irq15 + + +%macro intr_entry_err 2 +intr_entry_%2: + push dword %1 ; push interrupt number + jmp intr_entry_common +%endmacro + +%macro intr_entry_noerr 2 +intr_entry_%2: + push dword 0 ; push dummy error code + push dword %1 ; push interrupt number + jmp intr_entry_common +%endmacro + +intr_entry_common: + pusha ; save general purpose registers + call intr_handler + popa ; restore general purpose registers + add esp, 8 ; remove error code and intr number from the stack + iret + + ; interrupt entry points + intr_entry_noerr 0, div + intr_entry_noerr 1, debug + intr_entry_noerr 2, nmi + intr_entry_noerr 3, bpt + intr_entry_noerr 4, ovf + intr_entry_noerr 5, bound + intr_entry_noerr 6, ill + intr_entry_noerr 7, nodev + intr_entry_err 8, dbl + intr_entry_noerr 9, copseg + intr_entry_err 10, tss + intr_entry_err 11, segpres + intr_entry_err 12, stack + intr_entry_err 13, prot + intr_entry_err 14, page + intr_entry_noerr 15, rsvd + intr_entry_noerr 16, fpu + intr_entry_err 17, align + intr_entry_noerr 18, mce + intr_entry_noerr 19, sse + ; remapped IRQs 0-15 -> 32-47 + intr_entry_noerr 32, irq0 + intr_entry_noerr 33, irq1 + intr_entry_noerr 34, irq2 + intr_entry_noerr 35, irq3 + intr_entry_noerr 36, irq4 + intr_entry_noerr 37, irq5 + intr_entry_noerr 38, irq6 + intr_entry_noerr 39, irq7 + intr_entry_noerr 40, irq8 + intr_entry_noerr 41, irq9 + intr_entry_noerr 42, irq10 + intr_entry_noerr 43, irq11 + intr_entry_noerr 44, irq12 + intr_entry_noerr 45, irq13 + intr_entry_noerr 46, irq14 + intr_entry_noerr 47, irq15 + ; default handler + intr_entry_noerr 255, default + +; vi:ft=nasm: