diff --git a/src/header/signal/linux.rs b/src/header/signal/linux.rs index 7405d0175752f6eb5972a331910c11c0035f82c5..0313827aa3147265e5c0470d339c50e8180bf51e 100644 --- a/src/header/signal/linux.rs +++ b/src/header/signal/linux.rs @@ -1,3 +1,5 @@ +use core::arch::global_asm; + // Needs to be defined in assembly because it can't have a function prologue // rax is register, 15 is RT_SIGRETURN #[cfg(target_arch = "x86_64")] diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 3c94ef972e65dc156450077c6a44fc50f0151824..88c40179db52ba4f5fe22e45031a498367531a84 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -1,4 +1,4 @@ -use core::ptr; +use core::{arch::asm, ptr}; use core_io::Write; use super::{errno, types::*, Pal}; @@ -280,7 +280,7 @@ impl Pal for Sys { } fn lchown(path: &CStr, owner: uid_t, group: gid_t) -> c_int { - e(unsafe { syscall!(LCHOWN, path.as_ptr(), owner, group) }) + e(unsafe { syscall!(LCHOWN, path.as_ptr(), owner, group) }) as c_int } fn link(path1: &CStr, path2: &CStr) -> c_int { @@ -363,13 +363,13 @@ impl Pal for Sys { unsafe fn pte_clone(stack: *mut usize) -> pid_t { let flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD; let pid; - llvm_asm!(" + asm!(" # Call clone syscall syscall # Check if child or parent test rax, rax - jnz .parent + jnz 1f # Load registers pop rax @@ -392,13 +392,22 @@ impl Pal for Sys { ud2 # Return PID if parent - .parent: - " - : "={rax}"(pid) - : "{rax}"(SYS_CLONE), "{rdi}"(flags), "{rsi}"(stack), "{rdx}"(0), "{r10}"(0), "{r8}"(0) - : "memory", "rbx", "rcx", "rdx", "rsi", "rdi", "r8", - "r9", "r10", "r11", "r12", "r13", "r14", "r15" - : "intel", "volatile" + 1: + ", + inout("rax") SYS_CLONE => pid, + inout("rdi") flags => _, + inout("rsi") stack => _, + inout("rdx") 0 => _, + inout("r10") 0 => _, + inout("r8") 0 => _, + //TODO: out("rbx") _, + out("rcx") _, + out("r9") _, + out("r11") _, + out("r12") _, + out("r13") _, + out("r14") _, + out("r15") _, ); e(pid) as pid_t } diff --git a/src/start.rs b/src/start.rs index 33d9d7e23fbdedafef7f7fbf7d5dcf214a53a47a..0b9c13a68bf182eb08382775b380a01493d3a387 100644 --- a/src/start.rs +++ b/src/start.rs @@ -127,6 +127,8 @@ fn io_init() { stdio::stderr = stdio::default_stderr.get(); } } + +#[cfg(target_os = "redox")] fn setup_sigstack() { use syscall::{Map, MapFlags}; const SIGSTACK_SIZE: usize = 1024 * 256; @@ -185,6 +187,7 @@ pub unsafe extern "C" fn relibc_start(sp: &'static Stack) -> ! { } // Setup signal stack, otherwise we cannot handle any signals besides SIG_IGN/SIG_DFL behavior. + #[cfg(target_os = "redox")] setup_sigstack(); init_array();