mirror of
https://github.com/BoredDevNL/BoredOS.git
synced 2026-05-15 18:58:40 +00:00
221 lines
4.6 KiB
NASM
221 lines
4.6 KiB
NASM
; Copyright (c) 2023-2026 Chris (boreddevnl)
|
|
; This software is released under the GNU General Public License v3.0. See LICENSE file for details.
|
|
; This header needs to maintain in any file it is present in, as per the GPL license terms.
|
|
section .text
|
|
global isr0_wrapper
|
|
global isr1_wrapper
|
|
global isr8_wrapper
|
|
global isr12_wrapper
|
|
global isr14_wrapper
|
|
global isr128_wrapper
|
|
global isr_sched_ipi_wrapper
|
|
extern timer_handler
|
|
extern keyboard_handler
|
|
extern mouse_handler
|
|
extern sched_ipi_handler
|
|
extern syscall_handler_c
|
|
extern exception_handler_c
|
|
|
|
; Helper to send EOI (End of Interrupt) to PIC
|
|
send_eoi:
|
|
push rax
|
|
mov al, 0x20
|
|
out 0x20, al ; Master PIC
|
|
|
|
pop rax
|
|
ret
|
|
|
|
%macro ISR_NOERRCODE 2
|
|
isr%2_wrapper:
|
|
push 0 ; Dummy error code
|
|
push %2 ; Vector
|
|
push rax
|
|
push rbx
|
|
push rcx
|
|
push rdx
|
|
push rsi
|
|
push rdi
|
|
push rbp
|
|
push r8
|
|
push r9
|
|
push r10
|
|
push r11
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
|
|
test qword [rsp + 144], 3
|
|
jz %%skip_swap
|
|
swapgs
|
|
%%skip_swap:
|
|
|
|
sub rsp, 512
|
|
fxsave [rsp]
|
|
|
|
; Pass current RSP as 1st argument (registers_t*)
|
|
mov rdi, rsp
|
|
|
|
call %1
|
|
|
|
; Update RSP with return value (task switch)
|
|
mov rsp, rax
|
|
|
|
; Restore SSE/FPU state
|
|
fxrstor [rsp]
|
|
add rsp, 512
|
|
|
|
pop r15
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
pop r11
|
|
pop r10
|
|
pop r9
|
|
pop r8
|
|
pop rbp
|
|
pop rdi
|
|
pop rsi
|
|
pop rdx
|
|
pop rcx
|
|
pop rbx
|
|
pop rax
|
|
|
|
test qword [rsp + 24], 3
|
|
jz %%skip_swap_back
|
|
swapgs
|
|
%%skip_swap_back:
|
|
|
|
add rsp, 16 ; drop dummy vector and error code
|
|
iretq
|
|
%endmacro
|
|
|
|
isr0_wrapper:
|
|
ISR_NOERRCODE timer_handler, 32
|
|
|
|
isr1_wrapper:
|
|
ISR_NOERRCODE keyboard_handler, 33
|
|
|
|
isr12_wrapper:
|
|
ISR_NOERRCODE mouse_handler, 44
|
|
|
|
isr_sched_ipi_wrapper:
|
|
ISR_NOERRCODE sched_ipi_handler, 65
|
|
|
|
isr128_wrapper:
|
|
ISR_NOERRCODE syscall_handler_c, 128
|
|
|
|
; Common exception macro for exceptions WITHOUT error code
|
|
%macro EXCEPTION_NOERRCODE 1
|
|
global exc%1_wrapper
|
|
exc%1_wrapper:
|
|
push 0 ; Dummy error code
|
|
push %1 ; Vector
|
|
jmp exception_common
|
|
%endmacro
|
|
|
|
; Common exception macro for exceptions WITH error code
|
|
%macro EXCEPTION_ERRCODE 1
|
|
global exc%1_wrapper
|
|
exc%1_wrapper:
|
|
push %1 ; Vector
|
|
jmp exception_common
|
|
%endmacro
|
|
|
|
; Define all 32 standard exceptions
|
|
EXCEPTION_NOERRCODE 0 ; Divide Error
|
|
EXCEPTION_NOERRCODE 1 ; Debug
|
|
EXCEPTION_NOERRCODE 2 ; NMI
|
|
EXCEPTION_NOERRCODE 3 ; Breakpoint
|
|
EXCEPTION_NOERRCODE 4 ; Overflow
|
|
EXCEPTION_NOERRCODE 5 ; Bound Range Exceeded
|
|
EXCEPTION_NOERRCODE 6 ; Invalid Opcode
|
|
EXCEPTION_NOERRCODE 7 ; Device Not Available
|
|
EXCEPTION_ERRCODE 8 ; Double Fault
|
|
EXCEPTION_NOERRCODE 9 ; Coprocessor Segment Overrun
|
|
EXCEPTION_ERRCODE 10 ; Invalid TSS
|
|
EXCEPTION_ERRCODE 11 ; Segment Not Present
|
|
EXCEPTION_ERRCODE 12 ; Stack-Segment Fault
|
|
EXCEPTION_ERRCODE 13 ; General Protection Fault
|
|
EXCEPTION_ERRCODE 14 ; Page Fault
|
|
EXCEPTION_NOERRCODE 15 ; Reserved
|
|
EXCEPTION_NOERRCODE 16 ; x87 Floating-Point Exception
|
|
EXCEPTION_ERRCODE 17 ; Alignment Check
|
|
EXCEPTION_NOERRCODE 18 ; Machine Check
|
|
EXCEPTION_NOERRCODE 19 ; SIMD Floating-Point Exception
|
|
EXCEPTION_NOERRCODE 20 ; Virtualization Exception
|
|
EXCEPTION_ERRCODE 21 ; Control Protection Exception
|
|
EXCEPTION_NOERRCODE 22 ; Reserved
|
|
EXCEPTION_NOERRCODE 23 ; Reserved
|
|
EXCEPTION_NOERRCODE 24 ; Reserved
|
|
EXCEPTION_NOERRCODE 25 ; Reserved
|
|
EXCEPTION_NOERRCODE 26 ; Reserved
|
|
EXCEPTION_NOERRCODE 27 ; Reserved
|
|
EXCEPTION_NOERRCODE 28 ; Hypervisor Injection Exception
|
|
EXCEPTION_ERRCODE 29 ; VMM Communication Exception
|
|
EXCEPTION_ERRCODE 30 ; Security Exception
|
|
EXCEPTION_NOERRCODE 31 ; Reserved
|
|
|
|
exception_common:
|
|
; Save registers (registers_t structure)
|
|
push rax
|
|
push rbx
|
|
push rcx
|
|
push rdx
|
|
push rsi
|
|
push rdi
|
|
push rbp
|
|
push r8
|
|
push r9
|
|
push r10
|
|
push r11
|
|
push r12
|
|
push r13
|
|
push r14
|
|
push r15
|
|
|
|
test qword [rsp + 144], 3
|
|
jz .skip_swap_exc
|
|
swapgs
|
|
.skip_swap_exc:
|
|
|
|
sub rsp, 512
|
|
fxsave [rsp]
|
|
|
|
; Pass current RSP as 1st argument (registers_t*)
|
|
mov rdi, rsp
|
|
|
|
call exception_handler_c
|
|
|
|
; Switch stack if needed (for process termination)
|
|
mov rsp, rax
|
|
|
|
; Restore SSE/FPU state
|
|
fxrstor [rsp]
|
|
add rsp, 512
|
|
|
|
; Restore registers
|
|
pop r15
|
|
pop r14
|
|
pop r13
|
|
pop r12
|
|
pop r11
|
|
pop r10
|
|
pop r9
|
|
pop r8
|
|
pop rbp
|
|
pop rdi
|
|
pop rsi
|
|
pop rdx
|
|
pop rcx
|
|
pop rbx
|
|
pop rax
|
|
|
|
test qword [rsp + 24], 3
|
|
jz .skip_swap_back_exc
|
|
swapgs
|
|
.skip_swap_back_exc:
|
|
|
|
add rsp, 16 ; drop vector and error code
|
|
iretq
|
|
|