use ::core::{
hint::unreachable_unchecked,
result::Result::{
self,
Err,
Ok,
},
};
#[inline(always)]
pub unsafe fn syscall(r7: usize, a: &[usize]) -> Result<usize, usize> {
match a.len() {
0 => syscall_0(r7),
1 => syscall_1(r7, a[0]),
2 => syscall_2(r7, a[0], a[1]),
3 => syscall_3(r7, a[0], a[1], a[2]),
4 => syscall_4(r7, a[0], a[1], a[2], a[3]),
5 => syscall_5(r7, a[0], a[1], a[2], a[3], a[4]),
6 => syscall_6(r7, a[0], a[1], a[2], a[3], a[4], a[5]),
_ => unreachable_unchecked(),
}
}
#[inline(always)]
pub unsafe fn syscall_nr(r7: usize, a: &[usize]) -> ! {
match a.len() {
0 => syscall_0_nr(r7),
1 => syscall_1_nr(r7, a[0]),
2 => syscall_2_nr(r7, a[0], a[1]),
3 => syscall_3_nr(r7, a[0], a[1], a[2]),
4 => syscall_4_nr(r7, a[0], a[1], a[2], a[3]),
5 => syscall_5_nr(r7, a[0], a[1], a[2], a[3], a[4]),
6 => syscall_6_nr(r7, a[0], a[1], a[2], a[3], a[4], a[5]),
_ => unreachable_unchecked(),
}
}
#[inline(always)]
pub unsafe fn syscall_0(r7: usize) -> Result<usize, usize> {
let r0: usize;
asm!(
"svc $$0"
: "={r0}"(r0)
: "{r7}"(r7)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_0_nr(r7: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_1(r7: usize, mut r0: usize) -> Result<usize, usize> {
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_1_nr(r7: usize, r0: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_2(r7: usize, mut r0: usize, r1: usize) -> Result<usize, usize> {
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7), "{r1}"(r1)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_2_nr(r7: usize, r0: usize, r1: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0), "{r1}"(r1)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_3(r7: usize, mut r0: usize, r1: usize, r2: usize) -> Result<usize, usize> {
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7), "{r1}"(r1), "{r2}"(r2)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_3_nr(r7: usize, r0: usize, r1: usize, r2: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0), "{r1}"(r1), "{r2}"(r2)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_4(r7: usize, mut r0: usize, r1: usize, r2: usize, r3: usize) -> Result<usize, usize> {
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_4_nr(r7: usize, r0: usize, r1: usize, r2: usize, r3: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_5(r7: usize, mut r0: usize, r1: usize, r2: usize, r3: usize, r4: usize) -> Result<usize, usize> {
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3), "{r4}"(r4)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_5_nr(r7: usize, r0: usize, r1: usize, r2: usize, r3: usize, r4: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3), "{r4}"(r4)
: "cc"
: "volatile"
);
unreachable_unchecked()
}
#[inline(always)]
pub unsafe fn syscall_6(
r7: usize,
mut r0: usize,
r1: usize,
r2: usize,
r3: usize,
r4: usize,
r5: usize,
) -> Result<usize, usize>
{
asm!(
"svc $$0"
: "+{r0}"(r0)
: "{r7}"(r7), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3), "{r4}"(r4), "{r5}"(r5)
: "cc", "memory"
: "volatile"
);
if r0 < 0xffff_f000 {
Ok(r0)
} else {
Err(r0)
}
}
#[inline(always)]
pub unsafe fn syscall_6_nr(r7: usize, r0: usize, r1: usize, r2: usize, r3: usize, r4: usize, r5: usize) -> ! {
asm!(
"svc $$0"
:
: "{r7}"(r7), "{r0}"(r0), "{r1}"(r1), "{r2}"(r2), "{r3}"(r3), "{r4}"(r4), "{r5}"(r5)
: "cc"
: "volatile"
);
unreachable_unchecked()
}