2019-04-22 20:15:48 +02:00
|
|
|
;=----------------------------------------------------------------------------=;
|
2020-09-27 17:33:48 +02:00
|
|
|
; OS on Kaleid ;
|
2019-04-22 20:15:48 +02:00
|
|
|
; ;
|
|
|
|
; Desc: Interrupt Descriptor Table related functions ;
|
|
|
|
; ;
|
|
|
|
; ;
|
2021-02-18 19:54:35 +01:00
|
|
|
; Copyright © 2018-2021 The OS/K Team ;
|
2019-04-22 20:15:48 +02:00
|
|
|
; ;
|
|
|
|
; 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/>. ;
|
|
|
|
;=----------------------------------------------------------------------------=;
|
|
|
|
|
2019-05-13 18:07:45 +02:00
|
|
|
[BITS 64]
|
|
|
|
|
2019-05-14 13:17:24 +02:00
|
|
|
%include "kaleid/kernel/ke/cpuf.inc"
|
2019-04-22 20:15:48 +02:00
|
|
|
|
2019-05-14 11:48:07 +02:00
|
|
|
global KeLoadIDT
|
|
|
|
|
|
|
|
extern _KeIdtPtr
|
|
|
|
extern _KeHandleISR
|
2019-04-22 20:15:48 +02:00
|
|
|
|
|
|
|
;;
|
|
|
|
;; Loads the IDT
|
|
|
|
;;
|
2019-05-14 11:48:07 +02:00
|
|
|
KeLoadIDT:
|
|
|
|
lidt [_KeIdtPtr]
|
2019-04-22 20:15:48 +02:00
|
|
|
ret
|
|
|
|
|
|
|
|
;;
|
2019-04-27 00:04:27 +02:00
|
|
|
;; ISR Exception pre-handler
|
2019-04-22 20:15:48 +02:00
|
|
|
;;
|
2019-04-22 22:32:21 +02:00
|
|
|
isrPreHandler:
|
2019-04-26 20:11:08 +02:00
|
|
|
pushAll
|
2019-05-18 00:03:35 +02:00
|
|
|
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
|
2019-05-18 20:31:02 +02:00
|
|
|
mov rcx, 0xC0000080
|
|
|
|
rdmsr
|
|
|
|
push rax
|
2019-04-26 20:11:08 +02:00
|
|
|
|
|
|
|
; Check if we are switching from user mode to supervisor mode
|
2020-01-08 00:28:10 +01:00
|
|
|
mov rax, [rsp + 152]
|
|
|
|
and rax, 0x3000
|
|
|
|
jz .SEnter
|
|
|
|
|
|
|
|
swapgs ; XXX need TSS
|
2019-04-22 20:15:48 +02:00
|
|
|
|
2019-04-26 20:11:08 +02:00
|
|
|
.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
|
2019-04-25 23:09:04 +02:00
|
|
|
|
2019-05-14 11:48:07 +02:00
|
|
|
call _KeHandleISR
|
2019-04-22 20:15:48 +02:00
|
|
|
|
2019-04-26 20:11:08 +02:00
|
|
|
; decrement mask count
|
|
|
|
dec qword [gs:8]
|
2019-04-22 20:15:48 +02:00
|
|
|
|
2019-04-26 20:11:08 +02:00
|
|
|
; check if we are switching from supervisor to user mode
|
|
|
|
mov rax, [rsp + 152]
|
|
|
|
and rax, 0x3000
|
|
|
|
jz .SExit
|
|
|
|
|
2019-04-27 00:04:27 +02:00
|
|
|
swapgs ; XXX need TSS
|
2019-04-26 20:11:08 +02:00
|
|
|
|
|
|
|
.SExit:
|
2019-05-18 00:03:35 +02:00
|
|
|
; pop the control registers
|
2019-05-18 20:31:02 +02:00
|
|
|
add rsp, 48
|
2019-04-22 20:15:48 +02:00
|
|
|
popAll
|
2019-05-18 00:03:35 +02:00
|
|
|
|
2019-04-26 20:11:08 +02:00
|
|
|
; pop the error code and interrupt id
|
|
|
|
add rsp, 16
|
|
|
|
|
2019-04-22 20:15:48 +02:00
|
|
|
iretq
|
|
|
|
|
2020-01-05 20:13:53 +01:00
|
|
|
Die:
|
|
|
|
hlt
|
|
|
|
jmp Die
|
|
|
|
|
2019-04-22 20:15:48 +02:00
|
|
|
;; 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
|
2019-04-23 17:06:03 +02:00
|
|
|
|
|
|
|
;; 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
|
2019-04-24 00:05:03 +02:00
|
|
|
|
2019-04-27 00:04:27 +02:00
|
|
|
|
|
|
|
;; IRQs
|
|
|
|
%assign i 32
|
|
|
|
%rep 225
|
|
|
|
IsrWithoutErrCode i
|
|
|
|
%assign i i+1
|
|
|
|
%endrep
|
|
|
|
|