#![no_std]
#![allow(unused)]
macro_rules! unsupported_target {
($name:literal) => {
#[cfg(not(any(
all(
any(target_os = "linux", target_os = "android"),
any(
target_arch = "x86_64",
target_arch = "aarch64",
target_arch = "riscv64",
target_arch = "x86"
)
),
all(
target_os = "macos",
any(target_arch = "x86_64", target_arch = "aarch64")
),
all(
target_os = "windows",
any(target_arch = "x86_64", target_arch = "x86", target_arch = "aarch64")
)
)))]
{
compile_error!(concat!(
$name,
" is not supported on this target OS/Architecture combination."
));
unreachable!()
}
};
}
#[inline(always)]
pub unsafe fn syscall0(n: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
lateout("rax") ret,
lateout("rcx") _, lateout("r11") _, options(nostack) );
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
lateout("x0") ret,
options(nostack) );
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
lateout("a0") ret,
options(nostack) );
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"int 0x80",
in("eax") n,
lateout("eax") ret,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
lateout("x0") ret,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
lateout("r10") _,
lateout("rdx") _,
lateout("r8") _,
lateout("r9") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"int 0x2e",
in("eax") n,
lateout("eax") ret,
lateout("ecx") _,
lateout("edx") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
lateout("x0") ret,
options(nostack)
);
}
unsupported_target!("syscall0");
ret
}
#[inline(always)]
pub unsafe fn syscall1(n: usize, a1: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"int 0x80",
in("eax") n,
in("ebx") a1,
lateout("eax") ret,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
inout("r10") a1 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
lateout("rdx") _,
lateout("r8") _,
lateout("r9") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 4",
a1 = in(reg) a1,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
options(nostack)
);
}
unsupported_target!("syscall1");
ret
}
#[inline(always)]
pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
in("rsi") a2,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
in("a1") a2,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"int 0x80",
in("eax") n,
in("ebx") a1,
in("ecx") a2,
lateout("eax") ret,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
in("rsi") a2,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
in("x1") a2,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
inout("r10") a1 => _,
inout("rdx") a2 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
lateout("r8") _,
lateout("r9") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a2}",
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 8",
a1 = in(reg) a1,
a2 = in(reg) a2,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
options(nostack)
);
}
unsupported_target!("syscall2");
ret
}
#[inline(always)]
pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
in("a1") a2,
in("a2") a3,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"int 0x80",
in("eax") n,
in("ebx") a1,
in("ecx") a2,
in("edx") a3,
lateout("eax") ret,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
inout("r10") a1 => _,
inout("rdx") a2 => _,
inout("r8") a3 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
lateout("r9") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a3}",
"push {a2}",
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 12",
a1 = in(reg) a1,
a2 = in(reg) a2,
a3 = in(reg) a3,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
options(nostack)
);
}
unsupported_target!("syscall3");
ret
}
#[inline(always)]
pub unsafe fn syscall4(n: usize, a1: usize, a2: usize, a3: usize, a4: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
in("a1") a2,
in("a2") a3,
in("a3") a4,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push esi",
"mov esi, {a4}",
"int 0x80",
"pop esi",
a4 = in(reg) a4,
in("eax") n,
in("ebx") a1,
in("ecx") a2,
in("edx") a3,
lateout("eax") ret,
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
inout("r10") a1 => _,
inout("rdx") a2 => _,
inout("r8") a3 => _,
inout("r9") a4 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a4}",
"push {a3}",
"push {a2}",
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 16",
a1 = in(reg) a1,
a2 = in(reg) a2,
a3 = in(reg) a3,
a4 = in(reg) a4,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
options(nostack)
);
}
unsupported_target!("syscall4");
ret
}
#[inline(always)]
pub unsafe fn syscall5(n: usize, a1: usize, a2: usize, a3: usize, a4: usize, a5: usize) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
in("r8") a5,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
in("a1") a2,
in("a2") a3,
in("a3") a4,
in("a4") a5,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push esi",
"mov esi, {a4}",
"int 0x80",
"pop esi",
a4 = in(reg) a4,
in("eax") n,
in("ebx") a1,
in("ecx") a2,
in("edx") a3,
in("edi") a5,
lateout("eax") ret,
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
in("r8") a5,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"sub rsp, 0x30",
"mov [rsp+0x20], {a5}",
"syscall",
"add rsp, 0x30",
a5 = in(reg) a5,
in("rax") n,
inout("r10") a1 => _,
inout("rdx") a2 => _,
inout("r8") a3 => _,
inout("r9") a4 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a5}",
"push {a4}",
"push {a3}",
"push {a2}",
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 20",
a1 = in(reg) a1,
a2 = in(reg) a2,
a3 = in(reg) a3,
a4 = in(reg) a4,
a5 = in(reg) a5,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
options(nostack)
);
}
unsupported_target!("syscall5");
ret
}
#[inline(always)]
pub unsafe fn syscall6(
n: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
a6: usize,
) -> isize {
let ret: isize;
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "x86_64"
))]
unsafe {
core::arch::asm!(
"syscall",
in("rax") n,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
in("r8") a5,
in("r9") a6,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "aarch64"
))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
in("x5") a6,
options(nostack)
);
}
#[cfg(all(
any(target_os = "linux", target_os = "android"),
target_arch = "riscv64"
))]
unsafe {
core::arch::asm!(
"ecall",
in("a7") n,
inlateout("a0") a1 => ret,
in("a1") a2,
in("a2") a3,
in("a3") a4,
in("a4") a5,
in("a5") a6,
options(nostack)
);
}
#[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push ebp",
"mov ebp, {a6}",
"push esi",
"mov esi, {a4}",
"int 0x80",
"pop esi",
"pop ebp",
a6 = in(reg) a6,
a4 = in(reg) a4,
inout("eax") n => ret,
in("ebx") a1,
in("ecx") a2,
in("edx") a3,
in("edi") a5,
);
}
#[cfg(all(target_os = "macos", target_arch = "x86_64"))]
unsafe {
let sys_num = n | 0x2000000;
core::arch::asm!(
"syscall",
"jnc 1f",
"neg rax",
"1:",
in("rax") sys_num,
in("rdi") a1,
in("rsi") a2,
in("rdx") a3,
in("r10") a4,
in("r8") a5,
in("r9") a6,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
options(nostack)
);
}
#[cfg(all(target_os = "macos", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0x80",
"b.cc 1f",
"neg x0, x0",
"1:",
in("x16") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
in("x5") a6,
options(nostack)
);
}
#[cfg(all(target_os = "windows", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"sub rsp, 0x30",
"mov [rsp+0x20], {a5}",
"mov [rsp+0x28], {a6}",
"syscall",
"add rsp, 0x30",
a5 = in(reg) a5,
a6 = in(reg) a6,
in("rax") n,
inout("r10") a1 => _,
inout("rdx") a2 => _,
inout("r8") a3 => _,
inout("r9") a4 => _,
lateout("rax") ret,
lateout("rcx") _,
lateout("r11") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "x86"))]
unsafe {
core::arch::asm!(
"push {a6}",
"push {a5}",
"push {a4}",
"push {a3}",
"push {a2}",
"push {a1}",
"mov edx, esp",
"int 0x2e",
"add esp, 24",
a1 = in(reg) a1,
a2 = in(reg) a2,
a3 = in(reg) a3,
a4 = in(reg) a4,
a5 = in(reg) a5,
a6 = in(reg) a6,
inout("eax") n => ret,
lateout("ecx") _,
lateout("edx") _,
);
}
#[cfg(all(target_os = "windows", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"svc #0",
in("x8") n,
inlateout("x0") a1 => ret,
in("x1") a2,
in("x2") a3,
in("x3") a4,
in("x4") a5,
in("x5") a6,
options(nostack)
);
}
unsupported_target!("syscall6");
ret
}