; UNRELATED [GLOBAL gdt_flush] [GLOBAL tss_flush] gdt_flush: mov eax, [esp+4] lgdt [eax] mov ax, 0x10 mov ds, ax mov es, ax mov fs, ax mov gs, ax mov ss, ax jmp 0x08:.flush .flush: ret tss_flush: mov ax, 0x2B ltr ax ret ; RELATED [GLOBAL idt_flush] idt_flush: mov eax, [esp+4] ; Get the pointer to the IDT, passed as a parameter. lidt [eax] ; Load the IDT pointer. ret ;************************************************************************************ %macro COMMONSTUB 1 [EXTERN idt_%1Handler] %1_common_stub: pusha ; Pushes edi,esi,ebp,esp,ebx,edx,ecx,eax mov ax, ds ; Lower 16-bits of eax = ds. push eax ; save the data segment descriptor mov ax, 0x10 ; load the kernel data segment descriptor mov ds, ax mov es, ax mov fs, ax mov gs, ax call idt_%1Handler pop eax ; reload the original data segment descriptor mov ds, ax mov es, ax mov fs, ax mov gs, ax popa ; Pops edi,esi,ebp... add esp, 8 ; Cleans up the pushed error code and pushed ISR number sti iret %endmacro COMMONSTUB isr COMMONSTUB irq COMMONSTUB syscall ;************************************************************************************ %macro ISR_NOERRCODE 1 ; define a macro, taking one parameter [GLOBAL isr%1] ; %1 accesses the first parameter. isr%1: cli push byte 0 push byte %1 jmp isr_common_stub %endmacro %macro ISR_ERRCODE 1 [GLOBAL isr%1] isr%1: cli push byte %1 jmp isr_common_stub %endmacro %macro IRQ 2 [GLOBAL irq%1] irq%1: cli push byte %1 ;push irq number push byte %2 ;push int number jmp irq_common_stub %endmacro %macro SYSCALL 1 [GLOBAL syscall%1] syscall%1: cli push byte 0 push byte %1 jmp syscall_common_stub %endmacro ISR_NOERRCODE 0 ISR_NOERRCODE 1 ISR_NOERRCODE 2 ISR_NOERRCODE 3 ISR_NOERRCODE 4 ISR_NOERRCODE 5 ISR_NOERRCODE 6 ISR_NOERRCODE 7 ISR_ERRCODE 8 ISR_NOERRCODE 9 ISR_ERRCODE 10 ISR_ERRCODE 11 ISR_ERRCODE 12 ISR_ERRCODE 13 ISR_ERRCODE 14 ISR_NOERRCODE 15 ISR_NOERRCODE 16 ISR_NOERRCODE 17 ISR_NOERRCODE 18 ISR_NOERRCODE 19 ISR_NOERRCODE 20 ISR_NOERRCODE 21 ISR_NOERRCODE 22 ISR_NOERRCODE 23 ISR_NOERRCODE 24 ISR_NOERRCODE 25 ISR_NOERRCODE 26 ISR_NOERRCODE 27 ISR_NOERRCODE 28 ISR_NOERRCODE 29 ISR_NOERRCODE 30 ISR_NOERRCODE 31 IRQ 0, 32 IRQ 1, 33 IRQ 2, 34 IRQ 3, 35 IRQ 4, 36 IRQ 5, 37 IRQ 6, 38 IRQ 7, 39 IRQ 8, 40 IRQ 9, 41 IRQ 10, 42 IRQ 11, 43 IRQ 12, 44 IRQ 13, 45 IRQ 14, 46 IRQ 15, 47 SYSCALL 64