;=----------------------------------------------------------------------------=; ; GNU GPL OS/K ; ; ; ; Desc: Interrupt Descriptor Table related functions ; ; ; ; ; ; Copyright © 2018-2019 The OS/K Team ; ; ; ; This file is part of OS/K. ; ; ; ; OS/K is free software: you can redistribute it and/or modify ; ; it under the terms of the GNU General Public License as published by ; ; the Free Software Foundation, either version 3 of the License, or ; ; (at your option) any later version. ; ; ; ; OS/K is distributed in the hope that it will be useful, ; ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; ; GNU General Public License for more details. ; ; ; ; You should have received a copy of the GNU General Public License ; ; along with OS/K. If not, see . ; ;=----------------------------------------------------------------------------=; [BITS 64] %include "kaleid/kernel/cpu/cpuf.inc" global KeLoadIDT global divideByZero extern _KeIdtPtr extern _KeHandleISR ;; ;; Loads the IDT ;; KeLoadIDT: lidt [_KeIdtPtr] ret ;; ;; Bug test ;; divideByZero: ret ;; ;; ISR Exception pre-handler ;; isrPreHandler: pushAll ; Check if we are switching from user mode to supervisor mode mov rax, [rsp + 152] and rax, 0x3000 jz .SEnter swapgs ; XXX need TSS .SEnter: ; Increment mask count as we configure all interrupts to mask IF ; automatically in the IDT inc qword [gs:8] ; Call the C routine for dispatching an interrupt cld ; DF must be cleared by the caller mov rdi, rsp ; First argument points to the processor state mov rbp, 0 ; Terminate stack traces here call _KeHandleISR ; decrement mask count dec qword [gs:8] ; check if we are switching from supervisor to user mode mov rax, [rsp + 152] and rax, 0x3000 jz .SExit swapgs ; XXX need TSS .SExit: popAll ; pop the error code and interrupt id add rsp, 16 iretq ;; Divide Error Fault IsrWithoutErrCode 0 ;; Debug Exception Fault/trap IsrWithoutErrCode 1 ;; NMI Interrupt IsrWithoutErrCode 2 ;; Breakpoint Trap IsrWithoutErrCode 3 ;; Overflow Trap IsrWithoutErrCode 4 ;; Bound Range Exceeded Fault IsrWithoutErrCode 5 ;; Invalid Opcode Fault IsrWithoutErrCode 6 ;; Device Not Available or No Math Coprocessor Fault IsrWithoutErrCode 7 ;; Coprocessor Segment Overrun Fault IsrWithoutErrCode 9 ;; x87 FPU Floating Point or Math Fault IsrWithoutErrCode 16 ;; Alignment Check Fault IsrWithoutErrCode 17 ;; Machine Check Abort IsrWithoutErrCode 18 ;; SIMD Floating Point Fault IsrWithoutErrCode 19 ;; Virtualization Exception Fault IsrWithoutErrCode 20 ;; Double Fault Abort IsrWithErrCode 8 ;; Invalid TSS Fault IsrWithErrCode 10 ;; Segment Not Present Fault IsrWithErrCode 11 ;; Stack Segment Fault IsrWithErrCode 12 ;; General Protection Fault IsrWithErrCode 13 ;; Page Fault IsrWithErrCode 14 ;; Reserved IsrWithoutErrCode 15 IsrWithoutErrCode 21 IsrWithoutErrCode 22 IsrWithoutErrCode 23 IsrWithoutErrCode 24 IsrWithoutErrCode 25 IsrWithoutErrCode 26 IsrWithoutErrCode 27 IsrWithoutErrCode 28 IsrWithoutErrCode 29 IsrWithoutErrCode 30 IsrWithoutErrCode 31 ;; IRQs %assign i 32 %rep 225 IsrWithoutErrCode i %assign i i+1 %endrep