Split system calls x86_64/aarch64
This commit is contained in:
parent
86832155ec
commit
ed2cf05838
@ -27,10 +27,19 @@ pub mod io {
|
||||
|
||||
/// Type alias for a raw file descriptor
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn bcmp(p0: *const c_void, p1: *const c_void, len: usize) -> i32 {
|
||||
memcmp(p0, p1, len)
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
unsafe extern "C" fn memcmp(p0: *const c_void, p1: *const c_void, len: usize) -> i32 {
|
||||
let mut offset = 0;
|
||||
|
||||
if len == 0 {
|
||||
return 0;
|
||||
}
|
||||
|
||||
while offset < len {
|
||||
let c0 = (p0 as *const u8).add(offset).read_volatile();
|
||||
let c1 = (p1 as *const u8).add(offset).read_volatile();
|
||||
|
44
src/sys/aarch64.rs
Normal file
44
src/sys/aarch64.rs
Normal file
@ -0,0 +1,44 @@
|
||||
/// AArch64 implementation of a syscall macro
|
||||
#[macro_export]
|
||||
macro_rules! syscall {
|
||||
($num:expr) => {{
|
||||
let mut res: usize;
|
||||
core::arch::asm!("svc #0", lateout("x0") res, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x3") $a3, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x3") $a3, in("x4") $a4, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
}
|
@ -1,4 +1,5 @@
|
||||
//! System call implementations
|
||||
|
||||
use core::{mem::MaybeUninit, time::Duration};
|
||||
|
||||
use abi::{
|
||||
@ -11,48 +12,12 @@ use abi::{
|
||||
syscall::SyscallFunction,
|
||||
};
|
||||
|
||||
macro_rules! syscall {
|
||||
($num:expr) => {{
|
||||
let mut res: usize;
|
||||
core::arch::asm!("svc #0", lateout("x0") res, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x3") $a3, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{
|
||||
let mut res: usize = $a0;
|
||||
core::arch::asm!("svc #0",
|
||||
inlateout("x0") res, in("x1") $a1, in("x2") $a2,
|
||||
in("x3") $a3, in("x4") $a4, in("x8") usize::from($num));
|
||||
res
|
||||
}};
|
||||
}
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
#[macro_use]
|
||||
mod aarch64;
|
||||
#[cfg(target_arch = "x86_64")]
|
||||
#[macro_use]
|
||||
mod x86_64;
|
||||
|
||||
#[allow(unused_macros)]
|
||||
macro_rules! argn {
|
64
src/sys/x86_64.rs
Normal file
64
src/sys/x86_64.rs
Normal file
@ -0,0 +1,64 @@
|
||||
/// x86-64 implementation of a system call macro
|
||||
#[macro_export]
|
||||
macro_rules! syscall {
|
||||
($num:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!("syscall", inlateout("rax") res);
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!(
|
||||
"syscall",
|
||||
inlateout("rax") res,
|
||||
in("rdi") $a0
|
||||
);
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!(
|
||||
"syscall",
|
||||
inlateout("rax") res,
|
||||
in("rdi") $a0,
|
||||
in("rsi") $a1
|
||||
);
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!(
|
||||
"syscall",
|
||||
inlateout("rax") res,
|
||||
in("rdi") $a0,
|
||||
in("rsi") $a1,
|
||||
in("rdx") $a2
|
||||
);
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!(
|
||||
"syscall",
|
||||
inlateout("rax") res,
|
||||
in("rdi") $a0,
|
||||
in("rsi") $a1,
|
||||
in("rdx") $a2,
|
||||
in("r10") $a3
|
||||
);
|
||||
res
|
||||
}};
|
||||
($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{
|
||||
let mut res = usize::from($num);
|
||||
core::arch::asm!(
|
||||
"syscall",
|
||||
inlateout("rax") res,
|
||||
in("rdi") $a0,
|
||||
in("rsi") $a1,
|
||||
in("rdx") $a2,
|
||||
in("r10") $a3,
|
||||
in("r8") $a4
|
||||
);
|
||||
res
|
||||
}};
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user