54 lines
1.0 KiB
ArmAsm
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
|