From 7f668b27cfcce883e324d599baa0ca9f685d2d3e Mon Sep 17 00:00:00 2001 From: jD91mZM2 Date: Sat, 1 Aug 2020 16:51:03 +0200 Subject: [PATCH] Replace llvm_asm in x86_64 code with asm Also removes the syscall1_clobber call, because `clone` now saves the registers in the kernel anyway. --- src/arch/aarch64.rs | 15 ------- src/arch/arm.rs | 11 ----- src/arch/nonredox.rs | 5 --- src/arch/x86.rs | 11 ----- src/arch/x86_64.rs | 105 +++++++++++++++---------------------------- src/call.rs | 2 +- src/lib.rs | 1 + 7 files changed, 39 insertions(+), 111 deletions(-) diff --git a/src/arch/aarch64.rs b/src/arch/aarch64.rs index 33715a3..23abe49 100644 --- a/src/arch/aarch64.rs +++ b/src/arch/aarch64.rs @@ -20,21 +20,6 @@ pub unsafe fn syscall1(mut a: usize, b: usize) -> Result { Error::demux(a) } -// Clobbers all registers - special for clone -pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result { - llvm_asm!("svc 0" - : "={x0}"(a) - : "{x8}"(a), "{x0}"(b) - : "memory", - "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", - "x8", "x9", "x10", "x11", "x12", "x13", "x14", "x15", - "x16", "x17","x18", "x19", "x20", "x21", "x22", "x23", - "x24", "x25", "x26", "x27", "x28", "x29", "x30" - : "volatile"); - - Error::demux(a) -} - pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result { llvm_asm!("svc 0" : "={x0}"(a) diff --git a/src/arch/arm.rs b/src/arch/arm.rs index fb852d8..cec4174 100644 --- a/src/arch/arm.rs +++ b/src/arch/arm.rs @@ -20,17 +20,6 @@ pub unsafe fn syscall1(mut a: usize, b: usize) -> Result { Error::demux(a) } -// Clobbers all registers - special for clone -pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result { - llvm_asm!("swi $$0" - : "={r0}"(a) - : "{r7}"(a), "{r0}"(b) - : "memory", "r0", "r1", "r2", "r3", "r4" - : "volatile"); - - Error::demux(a) -} - pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result { llvm_asm!("swi $$0" : "={r0}"(a) diff --git a/src/arch/nonredox.rs b/src/arch/nonredox.rs index c99d41a..f99a714 100644 --- a/src/arch/nonredox.rs +++ b/src/arch/nonredox.rs @@ -8,11 +8,6 @@ pub unsafe fn syscall1(_a: usize, _b: usize) -> Result { Err(Error::new(ENOSYS)) } -// Clobbers all registers - special for clone -pub unsafe fn syscall1_clobber(_a: usize, _b: usize) -> Result { - Err(Error::new(ENOSYS)) -} - pub unsafe fn syscall2(_a: usize, _b: usize, _c: usize) -> Result { Err(Error::new(ENOSYS)) } diff --git a/src/arch/x86.rs b/src/arch/x86.rs index 93e3e58..40a9493 100644 --- a/src/arch/x86.rs +++ b/src/arch/x86.rs @@ -20,17 +20,6 @@ pub unsafe fn syscall1(mut a: usize, b: usize) -> Result { Error::demux(a) } -// Clobbers all registers - special for clone -pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result { - llvm_asm!("int 0x80" - : "={eax}"(a) - : "{eax}"(a), "{ebx}"(b) - : "memory", "ebx", "ecx", "edx", "esi", "edi" - : "intel", "volatile"); - - Error::demux(a) -} - pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result { llvm_asm!("int 0x80" : "={eax}"(a) diff --git a/src/arch/x86_64.rs b/src/arch/x86_64.rs index 425c83c..dbf5467 100644 --- a/src/arch/x86_64.rs +++ b/src/arch/x86_64.rs @@ -1,74 +1,43 @@ use super::error::{Error, Result}; -pub unsafe fn syscall0(mut a: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a) - : "rcx", "r11", "memory" - : "intel", "volatile"); +macro_rules! syscall { + ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => { + $( + pub unsafe fn $name(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result { + asm!( + "syscall", + inout("rax") $a, + $( + in("rdi") $b, + $( + in("rsi") $c, + $( + in("rdx") $d, + $( + in("r10") $e, + $( + in("r8") $f, + )? + )? + )? + )? + )? + out("rcx") _, + out("r11") _, + options(nostack), + ); - Error::demux(a) + Error::demux($a) + } + )+ + }; } -pub unsafe fn syscall1(mut a: usize, b: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b) - : "rcx", "r11", "memory" - : "intel", "volatile"); - - Error::demux(a) -} - -// Clobbers all registers - special for clone -pub unsafe fn syscall1_clobber(mut a: usize, b: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b) - : "memory", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", - "r9", "r10", "r11", "r12", "r13", "r14", "r15" - : "intel", "volatile"); - - Error::demux(a) -} - -pub unsafe fn syscall2(mut a: usize, b: usize, c: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b), "{rsi}"(c) - : "rcx", "r11", "memory" - : "intel", "volatile"); - - Error::demux(a) -} - -pub unsafe fn syscall3(mut a: usize, b: usize, c: usize, d: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d) - : "rcx", "r11", "memory" - : "intel", "volatile"); - - Error::demux(a) -} - -pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize) -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d), "{r10}"(e) - : "rcx", "r11", "memory" - : "intel", "volatile"); - - Error::demux(a) -} - -pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize) - -> Result { - llvm_asm!("syscall" - : "={rax}"(a) - : "{rax}"(a), "{rdi}"(b), "{rsi}"(c), "{rdx}"(d), "{r10}"(e), "{r8}"(f) - : "rcx", "r11", "memory" - : "intel", "volatile"); - - Error::demux(a) +syscall! { + syscall0(a,); + syscall1(a, b,); + syscall2(a, b, c,); + syscall3(a, b, c, d,); + syscall4(a, b, c, d, e,); + syscall5(a, b, c, d, e, f,); } diff --git a/src/call.rs b/src/call.rs index 399537d..26e2a0c 100644 --- a/src/call.rs +++ b/src/call.rs @@ -54,7 +54,7 @@ pub fn chmod>(path: T, mode: usize) -> Result { /// Produce a fork of the current process, or a new process thread pub unsafe fn clone(flags: CloneFlags) -> Result { - syscall1_clobber(SYS_CLONE, flags.bits()) + syscall1(SYS_CLONE, flags.bits()) } /// Close a file diff --git a/src/lib.rs b/src/lib.rs index 607ed5f..637dc29 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +#![feature(asm)] #![feature(llvm_asm)] #![feature(const_fn)] // see https://github.com/rust-lang/rfcs/pull/2632 #![cfg_attr(not(test), no_std)]