;=----------------------------------------------------------------------------=; ; OS on Kaleid ; ; ; ; Desc: Interrupt Descriptor Table related functions ; ; ; ; ; ; Copyright © 2018-2020 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/ke/cpuf.inc" global KeLoadIDT extern _KeIdtPtr extern _KeHandleISR ;; ;; Loads the IDT ;; KeLoadIDT: lidt [_KeIdtPtr] ret ;; ;; ISR Exception pre-handler ;; isrPreHandler: pushAll mov rax, cr8 push rax mov rax, cr4 push rax mov rax, cr3 push rax mov rax, cr2 push rax mov rax, cr0 push rax mov rcx, 0xC0000080 rdmsr push rax ; 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: ; pop the control registers add rsp, 48 popAll ; pop the error code and interrupt id add rsp, 16 iretq Die: hlt jmp Die ;; 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