use core::arch::asm;
pub mod eno;
pub mod nr;
#[inline(always)]
pub unsafe fn syscall0(nr: usize) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
"syscall",
inout("$2") nr => ret,
out("$7") is_err,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall1(nr: usize, a1: usize) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
out("$7") is_err,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall2(nr: usize, a1: usize, a2: usize) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
out("$7") is_err,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall3(nr: usize, a1: usize, a2: usize, a3: usize) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
out("$7") is_err,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall4(nr: usize, a1: usize, a2: usize, a3: usize, a4: usize) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inout("$7") a4 => is_err,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall5(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
".set noat",
"subu $29, 20",
"sw {}, 16($29)",
"syscall",
"addiu $29, 20",
".set at",
in(reg) a5,
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inout("$7") a4 => is_err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall6(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
a6: usize,
) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
".set noat",
"subu $29, 24",
"sw {}, 16($29)",
"sw {}, 20($29)",
"syscall",
"addiu $29, 24",
".set at",
in(reg) a5,
in(reg) a6,
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inout("$7") a4 => is_err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall7(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
a6: usize,
a7: usize,
) -> (usize, bool) {
let ret: usize;
let is_err: usize;
asm!(
".set noat",
"subu $29, 28",
"sw {}, 16($29)",
"sw {}, 20($29)",
"sw {}, 24($29)",
"syscall",
"addiu $29, 28",
".set at",
in(reg) a5,
in(reg) a6,
in(reg) a7,
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inout("$7") a4 => is_err,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
(ret, is_err != 0)
}
#[inline(always)]
pub unsafe fn syscall0_nofail(nr: usize) -> usize {
let ret: usize;
asm!(
"syscall",
inout("$2") nr => ret,
out("$7") _,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall1_nofail(nr: usize, a1: usize) -> usize {
let ret: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
out("$7") _,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall2_nofail(nr: usize, a1: usize, a2: usize) -> usize {
let ret: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
out("$7") _,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall3_nofail(nr: usize, a1: usize, a2: usize, a3: usize) -> usize {
let ret: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
out("$7") _,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall4_nofail(nr: usize, a1: usize, a2: usize, a3: usize, a4: usize) -> usize {
let ret: usize;
asm!(
"syscall",
inout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inout("$7") a4 => _,
out("$8") _,
out("$9") _,
out("$10") _,
out("$11") _,
out("$12") _,
out("$13") _,
out("$14") _,
out("$15") _,
out("$24") _,
out("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall5_nofail(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
) -> usize {
let ret: usize;
asm!(
".set noat",
"subu $29, 20",
"sw {}, 16($29)",
"syscall",
"addiu $29, 20",
".set at",
in(reg) a5,
inlateout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inlateout("$7") a4 => _,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall6_nofail(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
a6: usize,
) -> usize {
let ret: usize;
asm!(
".set noat",
"subu $29, 24",
"sw {}, 16($29)",
"sw {}, 20($29)",
"syscall",
"addiu $29, 24",
".set at",
in(reg) a5,
in(reg) a6,
inlateout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inlateout("$7") a4 => _,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
ret
}
#[inline(always)]
pub unsafe fn syscall7_nofail(
nr: usize,
a1: usize,
a2: usize,
a3: usize,
a4: usize,
a5: usize,
a6: usize,
a7: usize,
) -> usize {
let ret: usize;
asm!(
".set noat",
"subu $29, 28",
"sw {}, 16($29)",
"sw {}, 20($29)",
"sw {}, 24($29)",
"syscall",
"addiu $29, 28",
".set at",
in(reg) a5,
in(reg) a6,
in(reg) a7,
inlateout("$2") nr => ret,
in("$4") a1,
in("$5") a2,
in("$6") a3,
inlateout("$7") a4 => _,
lateout("$8") _,
lateout("$9") _,
lateout("$10") _,
lateout("$11") _,
lateout("$12") _,
lateout("$13") _,
lateout("$14") _,
lateout("$15") _,
lateout("$24") _,
lateout("$25") _,
);
ret
}