diff options
Diffstat (limited to 'src/bits64/syscall.rs')
-rw-r--r-- | src/bits64/syscall.rs | 60 |
1 files changed, 41 insertions, 19 deletions
diff --git a/src/bits64/syscall.rs b/src/bits64/syscall.rs index 63c7c30..ca09cb5 100644 --- a/src/bits64/syscall.rs +++ b/src/bits64/syscall.rs @@ -14,6 +14,10 @@ //! * Only values of class INTEGER or class MEMORY are passed to the kernel. //! //! This code is inspired by the syscall.rs (https://github.com/kmcallister/syscall.rs/) project. + +#[cfg(target_arch = "x86_64")] +use core::arch::asm; + #[macro_export] macro_rules! syscall { ($arg0:expr) => { @@ -97,7 +101,7 @@ macro_rules! syscall { #[allow(unused_mut)] pub unsafe fn syscall0(arg0: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0) : "rcx", "r11", "memory" : "volatile"); + asm!("syscall", lateout("rax") ret, in("rax") arg0, options(att_syntax)); ret } @@ -110,8 +114,11 @@ pub unsafe fn syscall0(arg0: u64) -> u64 { #[allow(unused_mut)] pub unsafe fn syscall1(arg0: u64, arg1: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1) - : "rcx", "r11", "memory" : "volatile"); + asm!( + "syscall", + lateout("rax") ret, in("rax") arg0, in("rdi") arg1, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } @@ -124,8 +131,12 @@ pub unsafe fn syscall1(arg0: u64, arg1: u64) -> u64 { #[allow(unused_mut)] pub unsafe fn syscall2(arg0: u64, arg1: u64, arg2: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2) - : "rcx", "r11", "memory" : "volatile"); + asm!( + "syscall", + lateout("rax") ret, + in("rax") arg0, in("rdi") arg1, in("rsi") arg2, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } @@ -138,8 +149,12 @@ pub unsafe fn syscall2(arg0: u64, arg1: u64, arg2: u64) -> u64 { #[allow(unused_mut)] pub unsafe fn syscall3(arg0: u64, arg1: u64, arg2: u64, arg3: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3) - : "rcx", "r11", "memory" : "volatile"); + asm!( + "syscall", + lateout("rax") ret, + in("rax") arg0, in("rdi") arg1, in("rsi") arg2, in("rdx") arg3, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } @@ -152,9 +167,12 @@ pub unsafe fn syscall3(arg0: u64, arg1: u64, arg2: u64, arg3: u64) -> u64 { #[allow(unused_mut)] pub unsafe fn syscall4(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) - : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3), "{r10}" (arg4) - : "rcx", "r11", "memory" : "volatile"); + asm!( + "syscall", + lateout("rax") ret, + in("rax") arg0, in("rdi") arg1, in("rsi") arg2, in("rdx") arg3, in("r10") arg4, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } @@ -167,10 +185,12 @@ pub unsafe fn syscall4(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64) -> #[allow(unused_mut)] pub unsafe fn syscall5(arg0: u64, arg1: u64, arg2: u64, arg3: u64, arg4: u64, arg5: u64) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) - : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3), "{r10}" (arg4), "{r8}" (arg5) - : "rcx", "r11", "memory" - : "volatile"); + asm!( + "syscall", + lateout("rax") ret, + in("rax") arg0, in("rdi") arg1, in("rsi") arg2, in("rdx") arg3, in("r10") arg4, in("r8") arg5, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } @@ -191,10 +211,12 @@ pub unsafe fn syscall6( arg6: u64, ) -> u64 { let mut ret: u64; - llvm_asm!("syscall" : "={rax}" (ret) - : "{rax}" (arg0), "{rdi}" (arg1), "{rsi}" (arg2), "{rdx}" (arg3), - "{r10}" (arg4), "{r8}" (arg5), "{r9}" (arg6) - : "rcx", "r11", "memory" - : "volatile"); + asm!( + "syscall", + lateout("rax") ret, + in("rax") arg0, in("rdi") arg1, in("rsi") arg2, in("rdx") arg3, + in("r10") arg4, in("r8") arg5, in("r9") arg6, + out("rcx") _, out("r11") _, options(att_syntax), + ); ret } |