Files
opencoreC/kernel/asm/syscall_entry.S
T

54 lines
1.0 KiB
ArmAsm

/* opencoreC - Fast Syscall Entry Trampoline (x86_64) */
.global syscall_entry
.extern kernel_syscall_dispatcher
.section .bss
.align 16
user_scratch_rsp:
.quad 0
kernel_temp_stack:
.skip 4096
kernel_temp_stack_top:
.section .text
syscall_entry:
/* Save user stack pointer */
mov [rip + user_scratch_rsp], rsp
lea rsp, [rip + kernel_temp_stack_top]
/* Save user RIP (in RCX) and user RFLAGS (in R11) */
push rcx
push r11
/* Save argument and volatile registers to construct SyscallRegisters */
push rax
push rdi
push rsi
push rdx
push r8
push r9
push r10
/* Pass pointer to SyscallRegisters struct in RDI */
mov rdi, rsp
call kernel_syscall_dispatcher
/* Restore registers (rax, rdx, r8 may have return values from dispatcher) */
pop r10
pop r9
pop r8
pop rdx
pop rsi
pop rdi
pop rax
/* Restore user RIP and RFLAGS */
pop r11
pop rcx
/* Restore user stack */
mov rsp, [rip + user_scratch_rsp]
/* Return to Ring 3 */
sysretq