diff --git a/Cargo.toml b/Cargo.toml index 47ed143..6e70007 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,4 +7,4 @@ license = "MIT/Apache-2.0" name = "sc" readme = "README.md" repository = "https://github.com/japaric/syscall.rs" -version = "0.2.2" +version = "0.2.3" diff --git a/src/lib.rs b/src/lib.rs index bfbf73b..2f28024 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,7 +12,7 @@ // Reference http://man7.org/linux/man-pages/man2/syscall.2.html #![deny(warnings)] -#![feature(asm)] +#![feature(llvm_asm)] #![no_std] #[cfg(test)] diff --git a/src/platform/freebsd-x86_64/mod.rs b/src/platform/freebsd-x86_64/mod.rs index 9c568d5..82d1c4d 100644 --- a/src/platform/freebsd-x86_64/mod.rs +++ b/src/platform/freebsd-x86_64/mod.rs @@ -14,7 +14,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(n: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n) : "rcx", "r11", "memory" : "volatile"); @@ -24,7 +24,7 @@ pub unsafe fn syscall0(n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(n: usize, a1: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1) : "rcx", "r11", "memory" : "volatile"); @@ -34,7 +34,7 @@ pub unsafe fn syscall1(n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2) : "rcx", "r11", "memory" : "volatile"); @@ -44,7 +44,7 @@ pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3) : "rcx", "r11", "memory" : "volatile"); @@ -59,7 +59,7 @@ pub unsafe fn syscall4(n: usize, a4: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4) : "rcx", "r11", "memory" @@ -76,7 +76,7 @@ pub unsafe fn syscall5(n: usize, a5: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5) : "rcx", "r11", "memory" @@ -94,7 +94,7 @@ pub unsafe fn syscall6(n: usize, a6: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) + llvm_asm!("syscall" : "={rax}"(ret) : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5), "{r9}"(a6) : "rcx", "r11", "memory" diff --git a/src/platform/linux-aarch64/mod.rs b/src/platform/linux-aarch64/mod.rs index 7a9906c..ec74163 100644 --- a/src/platform/linux-aarch64/mod.rs +++ b/src/platform/linux-aarch64/mod.rs @@ -14,7 +14,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(n: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) : "memory" "cc" @@ -25,7 +25,7 @@ pub unsafe fn syscall0(n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(n: usize, a1: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) : "memory" "cc" @@ -36,7 +36,7 @@ pub unsafe fn syscall1(n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) "{x1}"(a2) : "memory" "cc" @@ -47,7 +47,7 @@ pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) "{x1}"(a2) "{x2}"(a3) : "memory" "cc" @@ -63,7 +63,7 @@ pub unsafe fn syscall4(n: usize, a4: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) "{x1}"(a2) "{x2}"(a3) "{x3}"(a4) : "memory" "cc" @@ -80,7 +80,7 @@ pub unsafe fn syscall5(n: usize, a5: usize) -> usize { let ret: usize; - asm!("svc 0" : "={x0}"(ret) + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) "{x1}"(a2) "{x2}"(a3) "{x3}"(a4) "{x4}"(a5) : "memory" "cc" : "volatile"); @@ -97,7 +97,7 @@ pub unsafe fn syscall6(n: usize, a6: usize) -> usize { let ret: usize; - asm!("svc 0" + llvm_asm!("svc 0" : "={x0}"(ret) : "{x8}"(n) "{x0}"(a1) "{x1}"(a2) "{x2}"(a3) "{x3}"(a4) "{x4}"(a5) "{x5}"(a6) diff --git a/src/platform/linux-armeabi/mod.rs b/src/platform/linux-armeabi/mod.rs index ac9f2bf..7ea3f6b 100644 --- a/src/platform/linux-armeabi/mod.rs +++ b/src/platform/linux-armeabi/mod.rs @@ -14,7 +14,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(n: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) : "memory" "cc" @@ -25,7 +25,7 @@ pub unsafe fn syscall0(n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(n: usize, a1: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) : "memory" "cc" @@ -36,7 +36,7 @@ pub unsafe fn syscall1(n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) : "memory" "cc" @@ -47,7 +47,7 @@ pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) "{r2}"(a3) : "memory" "cc" @@ -63,7 +63,7 @@ pub unsafe fn syscall4(n: usize, a4: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) "{r2}"(a3) "{r3}"(a4) : "memory" "cc" @@ -80,7 +80,7 @@ pub unsafe fn syscall5(n: usize, a5: usize) -> usize { let ret: usize; - asm!("swi $$0" : "={r0}"(ret) + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) "{r2}"(a3) "{r3}"(a4) "{r4}"(a5) : "memory" "cc" : "volatile"); @@ -97,7 +97,7 @@ pub unsafe fn syscall6(n: usize, a6: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) "{r2}"(a3) "{r3}"(a4) "{r4}"(a5) "{r5}"(a6) @@ -117,7 +117,7 @@ pub unsafe fn syscall7(n: usize, a7: usize) -> usize { let ret: usize; - asm!("swi $$0" + llvm_asm!("swi $$0" : "={r0}"(ret) : "{r7}"(n) "{r0}"(a1) "{r1}"(a2) "{r2}"(a3) "{r3}"(a4) "{r4}"(a5) "{r5}"(a6) "{r6}"(a7) diff --git a/src/platform/linux-mips/mod.rs b/src/platform/linux-mips/mod.rs index b8c5466..2726e7d 100644 --- a/src/platform/linux-mips/mod.rs +++ b/src/platform/linux-mips/mod.rs @@ -20,7 +20,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut nr: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -35,7 +35,7 @@ pub unsafe fn syscall0(mut nr: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut nr: usize, a1: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -50,7 +50,7 @@ pub unsafe fn syscall1(mut nr: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut nr: usize, a1: usize, a2: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) "{$5}"(a2) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -69,7 +69,7 @@ pub unsafe fn syscall3(mut nr: usize, a3: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -88,7 +88,7 @@ pub unsafe fn syscall4(mut nr: usize, a3: usize, mut a4: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "+{$7}"(a4) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -104,7 +104,7 @@ pub unsafe fn syscall5(mut nr: usize, mut a4: usize, a5: usize) -> usize { - asm!(".set noat + llvm_asm!(".set noat subu $$29,20 sw $5, 16($$29) syscall @@ -126,7 +126,7 @@ pub unsafe fn syscall6(mut nr: usize, a5: usize, a6: usize) -> usize { - asm!(".set noat + llvm_asm!(".set noat subu $$29,24 sw $5, 16($$29) sw $6, 20($$29) diff --git a/src/platform/linux-mips64/mod.rs b/src/platform/linux-mips64/mod.rs index 9e19dbf..97321e9 100644 --- a/src/platform/linux-mips64/mod.rs +++ b/src/platform/linux-mips64/mod.rs @@ -16,7 +16,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut nr: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -31,7 +31,7 @@ pub unsafe fn syscall0(mut nr: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut nr: usize, a1: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -46,7 +46,7 @@ pub unsafe fn syscall1(mut nr: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut nr: usize, a1: usize, a2: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) "{$5}"(a2) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -65,7 +65,7 @@ pub unsafe fn syscall3(mut nr: usize, a3: usize) -> usize { let success: usize; - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "={$7}"(success) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -84,7 +84,7 @@ pub unsafe fn syscall4(mut nr: usize, a3: usize, mut a4: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "+{$7}"(a4) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) : "$8" "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -100,7 +100,7 @@ pub unsafe fn syscall5(mut nr: usize, mut a4: usize, a5: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "+{$7}"(a4) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) "{$8}"(a5) : "$9" "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" @@ -117,7 +117,7 @@ pub unsafe fn syscall6(mut nr: usize, a5: usize, a6: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{$2}"(nr) "+{$7}"(a4) : "{$4}"(a1) "{$5}"(a2) "{$6}"(a3) "{$8}"(a5) "{$9}"(a6) : "$10" "$11" "$12" "$13" "$14" "$15" "$24" "$25" "memory" diff --git a/src/platform/linux-powerpc/mod.rs b/src/platform/linux-powerpc/mod.rs index d7a7312..024e748 100644 --- a/src/platform/linux-powerpc/mod.rs +++ b/src/platform/linux-powerpc/mod.rs @@ -22,7 +22,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut n: usize) -> usize { let ret: usize; - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -35,7 +35,7 @@ pub unsafe fn syscall0(mut n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut n: usize, mut a1: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -48,7 +48,7 @@ pub unsafe fn syscall1(mut n: usize, mut a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut n: usize, mut a1: usize, mut a2: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -65,7 +65,7 @@ pub unsafe fn syscall3(mut n: usize, mut a2: usize, mut a3: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -83,7 +83,7 @@ pub unsafe fn syscall4(mut n: usize, mut a3: usize, mut a4: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -102,7 +102,7 @@ pub unsafe fn syscall5(mut n: usize, mut a4: usize, mut a5: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -123,7 +123,7 @@ pub unsafe fn syscall6(mut n: usize, mut a5: usize, mut a6: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" diff --git a/src/platform/linux-powerpc64/mod.rs b/src/platform/linux-powerpc64/mod.rs index 7c311df..cc0f55a 100644 --- a/src/platform/linux-powerpc64/mod.rs +++ b/src/platform/linux-powerpc64/mod.rs @@ -19,7 +19,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut n: usize) -> usize { let ret: usize; - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -32,7 +32,7 @@ pub unsafe fn syscall0(mut n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut n: usize, mut a1: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -45,7 +45,7 @@ pub unsafe fn syscall1(mut n: usize, mut a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut n: usize, mut a1: usize, mut a2: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -62,7 +62,7 @@ pub unsafe fn syscall3(mut n: usize, mut a2: usize, mut a3: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -80,7 +80,7 @@ pub unsafe fn syscall4(mut n: usize, mut a3: usize, mut a4: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -99,7 +99,7 @@ pub unsafe fn syscall5(mut n: usize, mut a4: usize, mut a5: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" @@ -120,7 +120,7 @@ pub unsafe fn syscall6(mut n: usize, mut a5: usize, mut a6: usize) -> usize { - asm!("sc + llvm_asm!("sc bns+ 1f neg $1, $1 1:" diff --git a/src/platform/linux-sparc64/mod.rs b/src/platform/linux-sparc64/mod.rs index b7acf34..3733943 100644 --- a/src/platform/linux-sparc64/mod.rs +++ b/src/platform/linux-sparc64/mod.rs @@ -17,7 +17,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(nr: usize) -> usize { let ret; - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -30,7 +30,7 @@ pub unsafe fn syscall0(nr: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(nr: usize, mut a1: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -43,7 +43,7 @@ pub unsafe fn syscall1(nr: usize, mut a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(nr: usize, mut a1: usize, a2: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -60,7 +60,7 @@ pub unsafe fn syscall3(nr: usize, a2: usize, a3: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -78,7 +78,7 @@ pub unsafe fn syscall4(nr: usize, a3: usize, a4: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -97,7 +97,7 @@ pub unsafe fn syscall5(nr: usize, a4: usize, a5: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" @@ -117,7 +117,7 @@ pub unsafe fn syscall6(nr: usize, a5: usize, a6: usize) -> usize { - asm!("t 109 + llvm_asm!("t 109 bcc,pt %xcc, 1f sub %g0, %o0, %o0 1:" diff --git a/src/platform/linux-x86/mod.rs b/src/platform/linux-x86/mod.rs index 66da147..561441e 100644 --- a/src/platform/linux-x86/mod.rs +++ b/src/platform/linux-x86/mod.rs @@ -13,7 +13,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut n: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : : "memory" "cc" @@ -23,7 +23,7 @@ pub unsafe fn syscall0(mut n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut n: usize, a1: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : "{ebx}"(a1) : "memory" "cc" @@ -33,7 +33,7 @@ pub unsafe fn syscall1(mut n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut n: usize, a1: usize, a2: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : "{ebx}"(a1) "{ecx}"(a2) : "memory" "cc" @@ -43,7 +43,7 @@ pub unsafe fn syscall2(mut n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(mut n: usize, a1: usize, a2: usize, a3: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : "{ebx}"(a1) "{ecx}"(a2) "{edx}"(a3) : "memory" "cc" @@ -58,7 +58,7 @@ pub unsafe fn syscall4(mut n: usize, a3: usize, a4: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : "{ebx}"(a1) "{ecx}"(a2) "{edx}"(a3) "{esi}"(a4) : "memory" "cc" @@ -74,7 +74,7 @@ pub unsafe fn syscall5(mut n: usize, a4: usize, a5: usize) -> usize { - asm!("int $$0x80" + llvm_asm!("int $$0x80" : "+{eax}"(n) : "{ebx}"(a1) "{ecx}"(a2) "{edx}"(a3) "{esi}"(a4) "{edi}"(a5) : "memory" "cc" @@ -95,7 +95,7 @@ pub unsafe fn syscall6(n: usize, // XXX: this fails when building without optimizations: // - // asm!("int $$0x80" : "={eax}"(ret) + // llvm_asm!("int $$0x80" : "={eax}"(ret) // : "{eax}"(n), "{ebx}"(a1), "{ecx}"(a2), "{edx}"(a3), // "{esi}"(a4), "{edi}"(a5), "{ebp}"(a6) // : "memory" "cc" @@ -106,7 +106,7 @@ pub unsafe fn syscall6(n: usize, // XXX: this fails when building with optimizations as the "m"(a6) gets // translated to [esp+offset] but the push ebp moved esp. // - // asm!("push %ebp + // llvm_asm!("push %ebp // mov $7, %ebp // int $$0x80 // pop %ebp" @@ -123,7 +123,7 @@ pub unsafe fn syscall6(n: usize, // and manually save restore ebp. let args = [n, a1, a2, a3, a4, a5, a6]; - asm!("push %ebp + llvm_asm!("push %ebp movl 24(%eax), %ebp movl 20(%eax), %edi movl 16(%eax), %esi diff --git a/src/platform/linux-x86_64/mod.rs b/src/platform/linux-x86_64/mod.rs index c13abdb..ac6342b 100644 --- a/src/platform/linux-x86_64/mod.rs +++ b/src/platform/linux-x86_64/mod.rs @@ -13,7 +13,7 @@ pub mod nr; #[inline(always)] pub unsafe fn syscall0(mut n: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : : "rcx", "r11", "memory" @@ -23,7 +23,7 @@ pub unsafe fn syscall0(mut n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(mut n: usize, a1: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) : "rcx", "r11", "memory" @@ -33,7 +33,7 @@ pub unsafe fn syscall1(mut n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(mut n: usize, a1: usize, a2: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) "{rsi}"(a2) : "rcx", "r11", "memory" @@ -43,7 +43,7 @@ pub unsafe fn syscall2(mut n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(mut n: usize, a1: usize, a2: usize, a3: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) "{rsi}"(a2) "{rdx}"(a3) : "rcx", "r11", "memory" @@ -58,7 +58,7 @@ pub unsafe fn syscall4(mut n: usize, a3: usize, a4: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) "{rsi}"(a2) "{rdx}"(a3) "{r10}"(a4) : "rcx", "r11", "memory" @@ -74,7 +74,7 @@ pub unsafe fn syscall5(mut n: usize, a4: usize, a5: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) "{rsi}"(a2) "{rdx}"(a3) "{r10}"(a4) "{r8}"(a5) : "rcx", "r11", "memory" @@ -91,7 +91,7 @@ pub unsafe fn syscall6(mut n: usize, a5: usize, a6: usize) -> usize { - asm!("syscall" + llvm_asm!("syscall" : "+{rax}"(n) : "{rdi}"(a1) "{rsi}"(a2) "{rdx}"(a3) "{r10}"(a4) "{r8}"(a5)"{r9}"(a6) : "rcx", "r11", "memory" diff --git a/src/platform/macos-x86_64/mod.rs b/src/platform/macos-x86_64/mod.rs index e12e0d5..0d058e6 100644 --- a/src/platform/macos-x86_64/mod.rs +++ b/src/platform/macos-x86_64/mod.rs @@ -11,11 +11,13 @@ pub mod nr; +const MACOS_SYSCALL_PREFIX: usize = 33554432; + #[inline(always)] pub unsafe fn syscall0(n: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n) + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX) : "rcx", "r11", "memory" : "volatile"); ret @@ -24,8 +26,8 @@ pub unsafe fn syscall0(n: usize) -> usize { #[inline(always)] pub unsafe fn syscall1(n: usize, a1: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1) + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1) : "rcx", "r11", "memory" : "volatile"); ret @@ -34,8 +36,8 @@ pub unsafe fn syscall1(n: usize, a1: usize) -> usize { #[inline(always)] pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2) + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1), "{rsi}"(a2) : "rcx", "r11", "memory" : "volatile"); ret @@ -44,8 +46,8 @@ pub unsafe fn syscall2(n: usize, a1: usize, a2: usize) -> usize { #[inline(always)] pub unsafe fn syscall3(n: usize, a1: usize, a2: usize, a3: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3) + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3) : "rcx", "r11", "memory" : "volatile"); ret @@ -59,8 +61,8 @@ pub unsafe fn syscall4(n: usize, a4: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4) : "rcx", "r11", "memory" : "volatile"); @@ -76,8 +78,8 @@ pub unsafe fn syscall5(n: usize, a5: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5) : "rcx", "r11", "memory" : "volatile"); @@ -94,8 +96,8 @@ pub unsafe fn syscall6(n: usize, a6: usize) -> usize { let ret: usize; - asm!("syscall" : "={rax}"(ret) - : "{rax}"(n), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), + llvm_asm!("syscall" : "={rax}"(ret) + : "{rax}"(n + MACOS_SYSCALL_PREFIX), "{rdi}"(a1), "{rsi}"(a2), "{rdx}"(a3), "{r10}"(a4), "{r8}"(a5), "{r9}"(a6) : "rcx", "r11", "memory" : "volatile");