From dc87afd2ac359c3bb58c4f4961ba190bd452bec4 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 13 Sep 2016 20:31:45 -0600 Subject: [PATCH] Fix userspace clone by clobbering all variables on clone --- arch/x86_64/src/lib.rs | 11 ++++++++++- bootloader/x86_64/vesa.asm | 4 ++-- kernel/syscall/process.rs | 4 ---- syscall/src/lib.rs | 2 +- syscall/src/x86.rs | 11 +++++++++++ syscall/src/x86_64.rs | 11 +++++++++++ 6 files changed, 35 insertions(+), 8 deletions(-) diff --git a/arch/x86_64/src/lib.rs b/arch/x86_64/src/lib.rs index 6d07468..9f1f7b8 100644 --- a/arch/x86_64/src/lib.rs +++ b/arch/x86_64/src/lib.rs @@ -126,7 +126,16 @@ macro_rules! interrupt_error { } // Push scratch registers - asm!("push rax + asm!("xchg bx, bx + pop rax # Error + pop rbx # RIP + pop rcx # CS + pop rdx # RFLAGS + pop rsi # RSP + pop rdi # SS + cli + hlt + push rax push rcx push rdx push rdi diff --git a/bootloader/x86_64/vesa.asm b/bootloader/x86_64/vesa.asm index cf54f61..943e4eb 100644 --- a/bootloader/x86_64/vesa.asm +++ b/bootloader/x86_64/vesa.asm @@ -115,8 +115,8 @@ vesa: .minx dw 640 .miny dw 480 .required: -.requiredx dw 0 ;1024 ;USE THESE WITH CAUTION -.requiredy dw 0 ;768 +.requiredx dw 1024 ;USE THESE WITH CAUTION +.requiredy dw 768 .requiredmode dw 0 .modeok db ": Is this OK?(y/n)",10,13,0 diff --git a/kernel/syscall/process.rs b/kernel/syscall/process.rs index c4f846b..3a511fb 100644 --- a/kernel/syscall/process.rs +++ b/kernel/syscall/process.rs @@ -82,10 +82,6 @@ pub fn clone(flags: usize, stack_base: usize) -> Result { pid = context.id; } - println!("Clone {}", pid); - - unsafe { asm!("xchg bx, bx" : : : : "intel", "volatile"); } - unsafe { context::switch(); } Ok(pid) diff --git a/syscall/src/lib.rs b/syscall/src/lib.rs index 3f3e879..98fd080 100644 --- a/syscall/src/lib.rs +++ b/syscall/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/syscall/src/x86.rs b/syscall/src/x86.rs index d4b53e9..3196189 100644 --- a/syscall/src/x86.rs +++ b/syscall/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/syscall/src/x86_64.rs b/syscall/src/x86_64.rs index 3de2d5f..84d5769 100644 --- a/syscall/src/x86_64.rs +++ b/syscall/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)