%endmacro
[section .text]
+[global Desctab_Init]
Desctab_Init:
- ; Install IRQ Handlers
+ ; Install IDT
+ mov rax, gIDTPtr
+ lidt [rax]
+
+ ; Save to make following instructions smaller
+ mov rdi, gIDT
+
+ ; Set an IDT entry to a callback
+ %macro SETIDT 2
+ mov rax, %2
+ mov WORD [rdi + %1*16], ax
+ shr rax, 16
+ mov WORD [rdi + %1*16+6], ax
+ shr rax, 16
+ mov DWORD [rdi+%1*16+8], eax
+ ; Enable
+ mov ax, WORD [rdi + %1*16 + 4]
+ or ax, 0x8000
+ mov WORD [rdi + %1*16 + 4], ax
+ %endmacro
+
+ ; Install error handlers
+ %macro SETISR 1
+ SETIDT %1, Isr%1
+ %endmacro
+
+ %assign i 0
+ %rep 32
+ SETISR i
+ %assign i i+1
+ %endrep
+
+ ; Install IRQs
+ %macro SETIRQ 2
+ SETIDT %2, Irq%1
+ %endmacro
+
+ %assign i 0
+ %rep 16
+ SETIRQ i, 0xF0+i
+ %assign i i+1
+ %endrep
+
+ ; Remap PIC
+
ret
; int IRQ_AddHandler(int IRQ, void (*Handler)(int IRQ))
.ret:
ret
-%macro DEFERR 1
+%macro ISR_NOERRNO 1
Isr%1:
push 0
push %1
jmp ErrorCommon
%endmacro
-%macro DEFERRNO 1
+%macro ISR_ERRNO 1
Isr%1:
push %1
jmp ErrorCommon
%endmacro
+ISR_NOERRNO 0; 0: Divide By Zero Exception
+ISR_NOERRNO 1; 1: Debug Exception
+ISR_NOERRNO 2; 2: Non Maskable Interrupt Exception
+ISR_NOERRNO 3; 3: Int 3 Exception
+ISR_NOERRNO 4; 4: INTO Exception
+ISR_NOERRNO 5; 5: Out of Bounds Exception
+ISR_NOERRNO 6; 6: Invalid Opcode Exception
+ISR_NOERRNO 7; 7: Coprocessor Not Available Exception
+ISR_ERRNO 8; 8: Double Fault Exception (With Error Code!)
+ISR_NOERRNO 9; 9: Coprocessor Segment Overrun Exception
+ISR_ERRNO 10; 10: Bad TSS Exception (With Error Code!)
+ISR_ERRNO 11; 11: Segment Not Present Exception (With Error Code!)
+ISR_ERRNO 12; 12: Stack Fault Exception (With Error Code!)
+ISR_ERRNO 13; 13: General Protection Fault Exception (With Error Code!)
+ISR_ERRNO 14; 14: Page Fault Exception (With Error Code!)
+ISR_NOERRNO 15; 15: Reserved Exception
+ISR_NOERRNO 16; 16: Floating Point Exception
+ISR_NOERRNO 17; 17: Alignment Check Exception
+ISR_NOERRNO 18; 18: Machine Check Exception
+ISR_NOERRNO 19; 19: Reserved
+ISR_NOERRNO 20; 20: Reserved
+ISR_NOERRNO 21; 21: Reserved
+ISR_NOERRNO 22; 22: Reserved
+ISR_NOERRNO 23; 23: Reserved
+ISR_NOERRNO 24; 24: Reserved
+ISR_NOERRNO 25; 25: Reserved
+ISR_NOERRNO 26; 26: Reserved
+ISR_NOERRNO 27; 27: Reserved
+ISR_NOERRNO 28; 28: Reserved
+ISR_NOERRNO 29; 29: Reserved
+ISR_NOERRNO 30; 30: Reserved
+ISR_NOERRNO 31; 31: Reserved
+
+ErrorCommon:
+ add rsp, 2*8
+ iret
+
%macro DEFIRQ 1
Irq%1:
push 0
jmp IrqCommon
%endmacro
+%assign i 0
+%rep 16
+DEFIRQ i
+%assign i i+1
+%endrep
+
IrqCommon:
PUSH_GPR
[section .data]
gIDT:
- times 256 dw 0x00080000, 0x00008E00, 0, 0 ; 64-bit Interrupt Gate, CS = 0x8, IST0
+ times 256 dd 0x00080000, 0x00008E00, 0, 0 ; 64-bit Interrupt Gate, CS = 0x8, IST0
+gIDTPtr:
+ dw 256*16-1
+ dq gIDT
gaIRQ_Handlers:
times 16*NUM_IRQ_CALLBACKS dq 0