use core::arch::asm;
pub type SyscallWord = u32;
#[inline]
pub unsafe fn syscall0(n: SyscallWord) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"int 0x80",
inlateout("eax") n => ret,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall1(n: SyscallWord, arg1: SyscallWord) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"int 0x80",
inlateout("eax") n => ret,
in("ebx") arg1,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall2(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"int 0x80",
inlateout("eax") n => ret,
in("ebx") arg1,
in("ecx") arg2,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall3(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"int 0x80",
inlateout("eax") n => ret,
in("ebx") arg1,
in("ecx") arg2,
in("edx") arg3,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall4(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"xchg esi, {arg4}",
"int 0x80",
"xchg esi, {arg4}",
arg4 = in(reg) arg4,
inlateout("eax") n => ret,
in("ebx") arg1,
in("ecx") arg2,
in("edx") arg3,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall5(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"xchg esi, {arg4}",
"int 0x80",
"xchg esi, {arg4}",
arg4 = in(reg) arg4,
inlateout("eax") n => ret,
in("ebx") arg1,
in("ecx") arg2,
in("edx") arg3,
in("edi") arg5,
options(nostack, preserves_flags)
);
}
ret
}
#[inline]
pub unsafe fn syscall6(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
arg6: SyscallWord,
) -> SyscallWord {
let mut ret: SyscallWord;
unsafe {
asm!(
"push ebp",
"push esi",
"mov esi, DWORD PTR [eax + 0]", "mov ebp, DWORD PTR [eax + 4]", "mov eax, DWORD PTR [eax + 8]", "int 0x80",
"pop esi",
"pop ebp",
inout("eax") &[arg4, arg6, n] => ret,
in("ebx") arg1,
in("ecx") arg2,
in("edx") arg3,
in("edi") arg5,
options(preserves_flags)
);
}
ret
}