aboutsummaryrefslogtreecommitdiff
path: root/src/bits64/syscall.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/bits64/syscall.rs')
-rw-r--r--src/bits64/syscall.rs60
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
}