os-k/kaleid/kernel/ke/isr.asm

202 lines
4.6 KiB
NASM

;=----------------------------------------------------------------------------=;
; OS on Kaleid ;
; ;
; Desc: Interrupt Descriptor Table related functions ;
; ;
; ;
; Copyright © 2018-2021 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 <https://www.gnu.org/licenses/>. ;
;=----------------------------------------------------------------------------=;
[BITS 64]
%include "kaleid/kernel/ke/cpuf.inc"
global KeLoadIDT
extern _KeIdtPtr
extern _KeHandleISR
extern _KeSyscallHandler
;;
;; 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
; Call the C routine to dispatch interrupts
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
; pop the control registers
add rsp, 48
; pop registers
popAll
; pop the error code and interrupt id
add rsp, 16
iretq
Die:
hlt
jmp Die
;;
;; System call pre-handler
;;
syscallPreHandler:
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
; Call the C routine to dispatch interrupts
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 _KeSyscallHandler
; pop the control registers
add rsp, 48
; pop registers
popAll
; pop the error code and interrupt id
add rsp, 16
Die2:
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 16
IsrWithoutErrCode i
%assign i i+1
%endrep
;; Syscall Vector
SyscallHandler 128