//! Raw `system_call` instruction wrappers for user space — one per arity. //! //! ABI: number in rax, arguments in rdi, rsi, rdx, r10, r8, r9, result in rax. //! The `system_call` instruction itself clobbers rcx (it holds the return rip) and //! r11 (the saved rflags); the kernel entry stub preserves everything else. //! Note argument #3 goes in **r10, not rcx** — rcx is unavailable across the //! instruction, so the kernel reads the 4th argument from r10. const abi = @import("abi"); const SystemCall = abi.SystemCall; pub inline fn systemCall0(n: SystemCall) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), : .{ .rcx = true, .r11 = true, .memory = true }); } pub inline fn systemCall1(n: SystemCall, a0: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), [a0] "{rdi}" (a0), : .{ .rcx = true, .r11 = true, .memory = true }); } pub inline fn systemCall2(n: SystemCall, a0: usize, a1: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), [a0] "{rdi}" (a0), [a1] "{rsi}" (a1), : .{ .rcx = true, .r11 = true, .memory = true }); } pub inline fn systemCall3(n: SystemCall, a0: usize, a1: usize, a2: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), [a0] "{rdi}" (a0), [a1] "{rsi}" (a1), [a2] "{rdx}" (a2), : .{ .rcx = true, .r11 = true, .memory = true }); } pub inline fn systemCall4(n: SystemCall, a0: usize, a1: usize, a2: usize, a3: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), [a0] "{rdi}" (a0), [a1] "{rsi}" (a1), [a2] "{rdx}" (a2), [a3] "{r10}" (a3), : .{ .rcx = true, .r11 = true, .memory = true }); } pub inline fn systemCall5(n: SystemCall, a0: usize, a1: usize, a2: usize, a3: usize, a4: usize) usize { return asm volatile ("syscall" : [ret] "={rax}" (-> usize), : [n] "{rax}" (@intFromEnum(n)), [a0] "{rdi}" (a0), [a1] "{rsi}" (a1), [a2] "{rdx}" (a2), [a3] "{r10}" (a3), [a4] "{r8}" (a4), : .{ .rcx = true, .r11 = true, .memory = true }); }