Files
bsb2/kernel/syscall/handler.asm
2025-12-15 13:20:58 +01:00

44 lines
1006 B
NASM

; Generic high-level syscall handler
[EXTERN syscall_handler]
; Low-level interrupt based system call entry function
[GLOBAL syscall_entry]
[SECTION .text]
; The SystemV ABI for x64 uses the register `rdi`, `rsi`, `rdx`, `rcx`, `r8` and
; `r9` to pass the first six parameters of a function. Since every syscall can
; have a maximum of 5 parameters, these register will just be forwarded (without
; requiring any additional operation), having the syscall number stored in `rdi`.
; The return value will be stored in `rax`.
ALIGN 8
syscall_entry:
; Interrupt Context Pointer (7th Parameter)
push rsp
; Clear direction flag for string operations
cld
; Call the high-level (C++) system call handler
sti
call syscall_handler
cli
; Optional: Prevent kernel information leakage
; by zeroing scratch registers
mov rdi, 0
mov rsi, 0
mov rdx, 0
mov rcx, 0
mov r8, 0
mov r9, 0
mov r10, 0
mov r11, 0
; Drop 7th parameter
add rsp, 8
; Return from interrupt entry function
iretq