Skip to main content

c/
syscall.rs

1// Copyright (c) 2026 Meng Zhuo
2// SPDX-License-Identifier: BSD-3-Clause
3
4// syscall() - variadic syscall forwarding, musl-compatible.
5// Included from libc/src/lib.rs in the "syscall wrappers" section.
6// Matches musl x86_64 convention: rax=num, rdi,rsi,rdx,r10,r8,r9; rcx,r11 clobbered.
7
8#[no_mangle]
9pub unsafe extern "C" fn syscall(num: c_long, mut args: ...) -> c_long {
10    let a: c_long = args.next_arg();
11    let b: c_long = args.next_arg();
12    let c: c_long = args.next_arg();
13    let d: c_long = args.next_arg();
14    let e: c_long = args.next_arg();
15    let f: c_long = args.next_arg();
16
17    let result = <Arch as Syscalls>::syscall6(
18        num as i64, a as i64, b as i64, c as i64, d as i64, e as i64, f as i64,
19    );
20
21    if (result as u64) > (-4096i64 as u64) {
22        ERRNO!() = (-result) as c_int;
23        return -1;
24    }
25    result as c_long
26}