Split system calls x86_64/aarch64

This commit is contained in:
Mark Poliakov 2023-11-04 15:37:46 +02:00
parent 86832155ec
commit ed2cf05838
4 changed files with 124 additions and 42 deletions

View File

@ -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
View 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
}};
}

View File

@ -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
View 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
}};
}