/* This file is part of Fennix Kernel. Fennix Kernel 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. Fennix Kernel 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 Fennix Kernel. If not, see . */ [BITS 64] %macro PushAllSC 0 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 %endmacro %macro PopAllSC 0 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 %endmacro ALIGN 4096 extern SystemCallsHandler global SystemCallHandlerStub SystemCallHandlerStub: swapgs ; Swap gs and kernelgs mov [gs:0x8], rsp ; CPUData->TempStack mov rsp, [gs:0x0] ; CPUData->SystemCallStack push qword 0x1b ; User data segment push qword [gs:0x8] ; Saved stack push r11 ; Saved rflags push qword 0x23 ; User code segment push rcx ; Current instruction pointer cld ; Clear direction flag PushAllSC ; Push all registers mov rdi, rsp ; Pass pointer to registers mov rbp, 0 ; Pass 0 as return address call SystemCallsHandler ; Call system call handler PopAllSC ; Pop all registers except rax mov rsp, [gs:0x8] ; Restore stack swapgs ; Swap back gs and kernelgs sti ; Enable interrupts o64 sysret ; Return to user mode