From da9991cd558c326f3a77ce6b0c020c8b18e23cc5 Mon Sep 17 00:00:00 2001 From: Mark Poliakov Date: Wed, 23 Mar 2022 12:26:51 +0200 Subject: [PATCH] refactor: split syscall modules --- libusr/src/arch/aarch64.rs | 43 ++++++++++++++++ libusr/src/arch/mod.rs | 7 +++ libusr/src/arch/x86_64.rs | 45 +++++++++++++++++ libusr/src/lib.rs | 3 ++ libusr/src/sys/calls.rs | 100 ------------------------------------- 5 files changed, 98 insertions(+), 100 deletions(-) create mode 100644 libusr/src/arch/aarch64.rs create mode 100644 libusr/src/arch/mod.rs create mode 100644 libusr/src/arch/x86_64.rs diff --git a/libusr/src/arch/aarch64.rs b/libusr/src/arch/aarch64.rs new file mode 100644 index 0000000..a0062f3 --- /dev/null +++ b/libusr/src/arch/aarch64.rs @@ -0,0 +1,43 @@ +#[macro_export] +macro_rules! syscall { + ($num:expr) => {{ + let mut res: usize; + asm!("svc #0", out("x0") res, in("x8") $num.repr(), options(nostack)); + res + }}; + ($num:expr, $a0:expr) => {{ + let mut res: usize = $a0; + asm!("svc #0", + inout("x0") res, + in("x8") $num.repr(), options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr) => {{ + let mut res: usize = $a0; + asm!("svc #0", + inout("x0") res, in("x1") $a1, + in("x8") $num.repr(), options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{ + let mut res: usize = $a0; + asm!("svc #0", + inout("x0") res, in("x1") $a1, in("x2") $a2, + in("x8") $num.repr(), options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{ + let mut res: usize = $a0; + asm!("svc #0", + inout("x0") res, in("x1") $a1, in("x2") $a2, + in("x3") $a3, in("x8") $num.repr(), options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{ + let mut res: usize = $a0; + asm!("svc #0", + inout("x0") res, in("x1") $a1, in("x2") $a2, + in("x3") $a3, in("x4") $a4, in("x8") $num.repr(), options(nostack)); + res + }}; +} diff --git a/libusr/src/arch/mod.rs b/libusr/src/arch/mod.rs new file mode 100644 index 0000000..f065f81 --- /dev/null +++ b/libusr/src/arch/mod.rs @@ -0,0 +1,7 @@ +#[cfg(target_arch = "aarch64")] +#[macro_use] +pub mod aarch64; + +#[cfg(target_arch = "x86_64")] +#[macro_use] +pub mod x86_64; diff --git a/libusr/src/arch/x86_64.rs b/libusr/src/arch/x86_64.rs new file mode 100644 index 0000000..e8596b7 --- /dev/null +++ b/libusr/src/arch/x86_64.rs @@ -0,0 +1,45 @@ +#[macro_export] +macro_rules! syscall { + ($num:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, + options(nostack)); + res + }}; + ($num:expr, $a0:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, in("rdi") $a0, + options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, in("rdi") $a0, in("rsi") $a1, + options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, in("rdi") $a0, in("rsi") $a1, + in("rdx") $a2, options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, in("rdi") $a0, in("rsi") $a1, + in("rdx") $a2, in("r10") $a3, options(nostack)); + res + }}; + ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{ + let mut res: usize = $num.repr(); + asm!("syscall", + inout("rax") res, in("rdi") $a0, in("rsi") $a1, + in("rdx") $a2, in("r10") $a3, in("r8") $a4, options(nostack)); + res + }}; +} diff --git a/libusr/src/lib.rs b/libusr/src/lib.rs index ea1256e..2c8d249 100644 --- a/libusr/src/lib.rs +++ b/libusr/src/lib.rs @@ -9,6 +9,9 @@ extern crate alloc; use core::panic::PanicInfo; use libsys::{debug::TraceLevel, proc::ExitCode, ProgramArgs}; +#[macro_use] +pub mod arch; + mod allocator; pub mod env; pub mod file; diff --git a/libusr/src/sys/calls.rs b/libusr/src/sys/calls.rs index 4cfc7d7..931cd07 100644 --- a/libusr/src/sys/calls.rs +++ b/libusr/src/sys/calls.rs @@ -15,106 +15,6 @@ use core::time::Duration; // TODO document the syscall ABI -// rax -// -// rdi -// rsi -// rdx -// r10 -// r8 -// r9 - -// TODO move this to libusr -#[cfg(target_arch = "x86_64")] -macro_rules! syscall { - ($num:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, - options(nostack)); - res - }}; - ($num:expr, $a0:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, in("rdi") $a0, - options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, in("rdi") $a0, in("rsi") $a1, - options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, in("rdi") $a0, in("rsi") $a1, - in("rdx") $a2, options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, in("rdi") $a0, in("rsi") $a1, - in("rdx") $a2, in("r10") $a3, options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{ - let mut res: usize = $num.repr(); - asm!("syscall", - inout("rax") res, in("rdi") $a0, in("rsi") $a1, - in("rdx") $a2, in("r10") $a3, in("r8") $a4, options(nostack)); - res - }}; -} - -#[cfg(target_arch = "aarch64")] -macro_rules! syscall { - ($num:expr) => {{ - let mut res: usize; - asm!("svc #0", out("x0") res, in("x8") $num.repr(), options(nostack)); - res - }}; - ($num:expr, $a0:expr) => {{ - let mut res: usize = $a0; - asm!("svc #0", - inout("x0") res, - in("x8") $num.repr(), options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr) => {{ - let mut res: usize = $a0; - asm!("svc #0", - inout("x0") res, in("x1") $a1, - in("x8") $num.repr(), options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr) => {{ - let mut res: usize = $a0; - asm!("svc #0", - inout("x0") res, in("x1") $a1, in("x2") $a2, - in("x8") $num.repr(), options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr) => {{ - let mut res: usize = $a0; - asm!("svc #0", - inout("x0") res, in("x1") $a1, in("x2") $a2, - in("x3") $a3, in("x8") $num.repr(), options(nostack)); - res - }}; - ($num:expr, $a0:expr, $a1:expr, $a2:expr, $a3:expr, $a4:expr) => {{ - let mut res: usize = $a0; - asm!("svc #0", - inout("x0") res, in("x1") $a1, in("x2") $a2, - in("x3") $a3, in("x4") $a4, in("x8") $num.repr(), options(nostack)); - res - }}; -} - /// Integer/size argument macro_rules! argn { ($a:expr) => {