diff --git a/src/lib.rs b/src/lib.rs index 3f3e879..98fd080 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -110,7 +110,7 @@ pub fn chdir(path: &str) -> Result { } pub unsafe fn clone(flags: usize) -> Result { - syscall1(SYS_CLONE, flags) + syscall1_clobber(SYS_CLONE, flags) } pub fn close(fd: usize) -> Result { diff --git a/src/x86.rs b/src/x86.rs index d4b53e9..3196189 100644 --- a/src/x86.rs +++ b/src/x86.rs @@ -20,6 +20,17 @@ 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 { + 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 { asm!("int 0x80" : "={eax}"(a) diff --git a/src/x86_64.rs b/src/x86_64.rs index 3de2d5f..84d5769 100644 --- a/src/x86_64.rs +++ b/src/x86_64.rs @@ -20,6 +20,17 @@ 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 { + asm!("int 0x80" + : "={rax}"(a) + : "{rax}"(a), "{rbx}"(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 { asm!("int 0x80" : "={rax}"(a)