Update libstd. Add CWD and associated syscalls. Remove debugging
This commit is contained in:
		
							parent
							
								
									7561839cfc
								
							
						
					
					
						commit
						57f5699664
					
				
					 12 changed files with 113 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
///! Process syscalls
 | 
			
		||||
 | 
			
		||||
use alloc::arc::Arc;
 | 
			
		||||
use collections::Vec;
 | 
			
		||||
use core::mem;
 | 
			
		||||
use core::str;
 | 
			
		||||
use spin::Mutex;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +54,9 @@ pub const CLONE_FILES: usize = 0x400;
 | 
			
		|||
pub const CLONE_VFORK: usize = 0x4000;
 | 
			
		||||
pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 | 
			
		||||
    //TODO: Copy on write?
 | 
			
		||||
    println!("Clone {:X}: {:X}", flags, stack_base);
 | 
			
		||||
 | 
			
		||||
    // vfork not supported
 | 
			
		||||
    assert!(flags & CLONE_VFORK == 0);
 | 
			
		||||
 | 
			
		||||
    let ppid;
 | 
			
		||||
    let pid;
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +67,8 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 | 
			
		|||
        let mut image = vec![];
 | 
			
		||||
        let mut heap_option = None;
 | 
			
		||||
        let mut stack_option = None;
 | 
			
		||||
        let mut files = Arc::new(Mutex::new(vec![]));
 | 
			
		||||
        let cwd;
 | 
			
		||||
        let files;
 | 
			
		||||
 | 
			
		||||
        // Copy from old process
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -159,9 +163,16 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 | 
			
		|||
                stack_option = Some(new_stack);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if flags & CLONE_FS == CLONE_FS {
 | 
			
		||||
                cwd = context.cwd.clone();
 | 
			
		||||
            } else {
 | 
			
		||||
                cwd = Arc::new(Mutex::new(context.cwd.lock().clone()));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if flags & CLONE_FILES == CLONE_FILES {
 | 
			
		||||
                files = context.files.clone();
 | 
			
		||||
            } else {
 | 
			
		||||
                let mut files_vec = Vec::new();
 | 
			
		||||
                for (fd, file_option) in context.files.lock().iter().enumerate() {
 | 
			
		||||
                    if let Some(file) = *file_option {
 | 
			
		||||
                        let result = {
 | 
			
		||||
| 
						 | 
				
			
			@ -172,16 +183,17 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 | 
			
		|||
                        };
 | 
			
		||||
                        match result {
 | 
			
		||||
                            Ok(new_number) => {
 | 
			
		||||
                                files.lock().push(Some(context::file::File { scheme: file.scheme, number: new_number }));
 | 
			
		||||
                                files_vec.push(Some(context::file::File { scheme: file.scheme, number: new_number }));
 | 
			
		||||
                            },
 | 
			
		||||
                            Err(err) => {
 | 
			
		||||
                                println!("clone: failed to dup {}: {:?}", fd, err);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        files.lock().push(None);
 | 
			
		||||
                        files_vec.push(None);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                files = Arc::new(Mutex::new(files_vec));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -289,6 +301,8 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
 | 
			
		|||
                context.stack = Some(stack);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            context.cwd = cwd;
 | 
			
		||||
 | 
			
		||||
            context.files = files;
 | 
			
		||||
 | 
			
		||||
            context.arch.set_page_table(unsafe { new_table.address() });
 | 
			
		||||
| 
						 | 
				
			
			@ -322,7 +336,6 @@ pub fn exec(path: &[u8], _args: &[[usize; 2]]) -> Result<usize> {
 | 
			
		|||
    //TODO: Use args
 | 
			
		||||
    //TODO: Unmap previous mappings
 | 
			
		||||
    //TODO: Drop data vec
 | 
			
		||||
    println!("Exec {}", unsafe { str::from_utf8_unchecked(path) });
 | 
			
		||||
 | 
			
		||||
    let file = syscall::open(path, 0)?;
 | 
			
		||||
    let mut data = vec![];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue