use super::syscalls::SysNo;
#[cfg(feature = "syscallobf")]
use const_random::const_random;
use core::arch::asm;
#[cfg(not(feature = "syscallobf"))]
#[inline(always)]
pub unsafe fn syscall1(n: SysNo, arg1: usize) -> usize {
let mut ret: usize;
asm!(
"syscall",
inlateout("rax") n as usize => ret,
in("rdi") arg1,
out("rcx") _, out("r11") _, options(nostack, preserves_flags)
);
ret
}
#[cfg(not(feature = "syscallobf"))]
#[inline(always)]
pub unsafe fn syscall4(n: SysNo, arg1: usize, arg2: usize, arg3: usize, arg4: usize) -> usize {
let mut ret: usize;
asm!(
"syscall",
inlateout("rax") n as usize => ret,
in("rdi") arg1,
in("rsi") arg2,
in("rdx") arg3,
in("r10") arg4,
out("rcx") _, out("r11") _, options(nostack, preserves_flags)
);
ret
}
#[cfg(feature = "syscallobf")]
#[inline(always)]
pub unsafe fn syscall1(n: SysNo, arg1: usize) -> usize {
let mut ret: usize;
let key: usize = const_random!(usize);
asm!(
"xor r11, rcx",
"mov rax, r11",
"and rcx, 0xFF",
"add rax, rcx",
"2:",
"sub rax, 1",
"sub rcx, 1",
"cmp rcx, 0",
"jg 2b",
"syscall",
inout("rcx") ((key as u16) as usize) => _, inout("r11") ((key as u16) as usize) ^ (n as usize) => _, out("rax") ret,
in("rdi") arg1,
options(nostack, preserves_flags)
);
ret
}
#[cfg(feature = "syscallobf")]
#[inline(always)]
pub unsafe fn syscall4(n: SysNo, arg1: usize, arg2: usize, arg3: usize, arg4: usize) -> usize {
let mut ret: usize;
let key: usize = const_random!(usize);
asm!(
"xor r11, rcx",
"mov rax, r11",
"and rcx, 0xFF",
"add rax, rcx",
"2:",
"sub rax, 1",
"sub rcx, 1",
"cmp rcx, 0",
"jg 2b",
"syscall",
inout("rcx") ((key as u16) as usize) => _, inout("r11") ((key as u16) as usize) ^ (n as usize) => _, out("rax") ret,
in("rdi") arg1,
in("rsi") arg2,
in("rdx") arg3,
in("r10") arg4,
options(nostack, preserves_flags)
);
ret
}