#[cfg(target_arch = "x86_64")]
core::arch::global_asm!("
.global do_syscall
.section .text
do_syscall:
mov [rsp - 0x8], rsi
mov [rsp - 0x10], rdi
mov [rsp - 0x18], r12
mov eax, ecx // eax = ssn (1st arg in rcx)
mov r12, rdx // save syscall_addr (2nd arg in rdx)
mov rcx, r8 // rcx = n_args (3rd arg in r8)
mov r10, r9 // arg1 (4th arg in r9) -> r10 (syscall ABI)
mov rdx, [rsp + 0x28] // arg2
mov r8, [rsp + 0x30] // arg3
mov r9, [rsp + 0x38] // arg4
sub rcx, 0x4 // remaining args destined for the stack
jle 2f // none -> skip the copy
lea rsi, [rsp + 0x40] // src = caller's arg5 slot
lea rdi, [rsp + 0x28] // dst = where the kernel reads arg5
rep movsq
2:
mov rcx, r12 // rcx = syscall_addr for jmp
mov rsi, [rsp - 0x8]
mov rdi, [rsp - 0x10]
mov r12, [rsp - 0x18]
jmp rcx
");
#[cfg(target_arch = "x86_64")]
unsafe extern "C" {
pub fn do_syscall(
ssn: u16,
syscall_addr: usize,
n_args: u32,
...
) -> *mut core::ffi::c_void;
}