Skip to main content

c/
syscall.rs

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