use core::arch::asm;
pub type SyscallWord = u32;
#[inline]
pub unsafe fn syscall0(n: SyscallWord) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
"syscall",
inlateout("$2") n => ret,
lateout("$7") err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall1(n: SyscallWord, arg1: SyscallWord) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
"syscall",
inlateout("$2") n => ret,
lateout("$7") err,
in("$4") arg1,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall2(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
"syscall",
inlateout("$2") n => ret,
lateout("$7") err,
in("$4") arg1,
in("$5") arg2,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall3(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
"syscall",
inlateout("$2") n => ret,
lateout("$7") err,
in("$4") arg1,
in("$5") arg2,
in("$6") arg3,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall4(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
"syscall",
inlateout("$2") n => ret,
in("$4") arg1,
in("$5") arg2,
in("$6") arg3,
inlateout("$7") arg4 => err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(nostack, preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall5(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
".set noat",
"subu $sp, 32", "sw {arg5}, 16($sp)", "syscall",
"addu $sp, 32", ".set at",
arg5 = in(reg) arg5,
inlateout("$2") n => ret,
in("$4") arg1,
in("$5") arg2,
in("$6") arg3,
inlateout("$7") arg4 => err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[inline]
pub unsafe fn syscall6(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
arg6: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
".set noat",
"subu $sp, 32", "sw {arg5}, 16($sp)", "sw {arg6}, 20($sp)", "syscall",
"addu $sp, 32", ".set at",
arg5 = in(reg) arg5,
arg6 = in(reg) arg6,
inlateout("$2") n => ret,
in("$4") arg1,
in("$5") arg2,
in("$6") arg3,
inlateout("$7") arg4 => err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}
#[allow(unused)]
#[inline]
pub unsafe fn syscall7(
n: SyscallWord,
arg1: SyscallWord,
arg2: SyscallWord,
arg3: SyscallWord,
arg4: SyscallWord,
arg5: SyscallWord,
arg6: SyscallWord,
arg7: SyscallWord,
) -> SyscallWord {
let mut err: SyscallWord;
let mut ret: SyscallWord;
unsafe {
asm!(
".set noat",
"subu $sp, 32", "sw {arg5}, 16($sp)", "sw {arg6}, 20($sp)", "sw {arg7}, 24($sp)", "syscall",
"addu $sp, 32", ".set at",
arg5 = in(reg) arg5,
arg6 = in(reg) arg6,
arg7 = in(reg) arg7,
inlateout("$2") n => ret,
in("$4") arg1,
in("$5") arg2,
in("$6") arg3,
inlateout("$7") arg4 => err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
options(preserves_flags)
);
}
if err == 0 { ret } else { ret.wrapping_neg() }
}