summaryrefslogtreecommitdiff
path: root/proc.c
diff options
context:
space:
mode:
authorrsc <rsc>2007-08-21 19:22:08 +0000
committerrsc <rsc>2007-08-21 19:22:08 +0000
commitf32f3638f4c34fbf2fc4398878e6304612bb3283 (patch)
treecabca9bf9ac8b1465b2c59e27e3dc8020c02e2be /proc.c
parent2d61a40b2059b9a198e7c4ff04c6ced88cb3ce65 (diff)
downloadxv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.tar.gz
xv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.tar.bz2
xv6-labs-f32f3638f4c34fbf2fc4398878e6304612bb3283.zip
Various cleanup:
- Got rid of dummy proc[0]. Now proc[0] is init. - Added initcode.S to exec /init, so that /init is just a regular binary. - Moved exec out of sysfile to exec.c - Moved code dealing with fs guts (like struct inode) from sysfile.c to fs.c. Code dealing with system call arguments stays in sysfile.c - Refactored directory routines in fs.c; should be simpler. - Changed iget to return *unlocked* inode structure. This solves the lookup-then-use race in namei without introducing deadlocks. It also enabled getting rid of the dummy proc[0].
Diffstat (limited to 'proc.c')
-rw-r--r--proc.c50
1 files changed, 23 insertions, 27 deletions
diff --git a/proc.c b/proc.c
index b09b738..c86f88f 100644
--- a/proc.c
+++ b/proc.c
@@ -109,47 +109,43 @@ copyproc(struct proc *p)
return 0;
}
np->pid = next_pid++;
- np->ppid = p->pid;
release(&proc_table_lock);
- // Copy user memory.
- np->sz = p->sz;
- np->mem = kalloc(np->sz);
- if(np->mem == 0){
- np->state = UNUSED;
- return 0;
- }
- memmove(np->mem, p->mem, np->sz);
-
// Allocate kernel stack.
- np->kstack = kalloc(KSTACKSIZE);
- if(np->kstack == 0){
- kfree(np->mem, np->sz);
- np->mem = 0;
+ if((np->kstack = kalloc(KSTACKSIZE)) == 0){
np->state = UNUSED;
return 0;
}
-
- // Copy trapframe registers from parent.
np->tf = (struct trapframe*)(np->kstack + KSTACKSIZE) - 1;
- memmove(np->tf, p->tf, sizeof(*np->tf));
- // Clear %eax so that fork system call returns 0 in child.
- np->tf->eax = 0;
+ if(p){ // Copy process state from p.
+ np->ppid = p->pid;
+ memmove(np->tf, p->tf, sizeof *np->tf);
+
+ np->sz = p->sz;
+ if((np->mem = kalloc(np->sz)) == 0){
+ kfree(np->kstack, KSTACKSIZE);
+ np->kstack = 0;
+ np->state = UNUSED;
+ return 0;
+ }
+ memmove(np->mem, p->mem, np->sz);
+
+ for(i = 0; i < NOFILE; i++){
+ np->ofile[i] = p->ofile[i];
+ if(np->ofile[i])
+ fileincref(np->ofile[i]);
+ }
+ np->cwd = iincref(p->cwd);
+ }
// Set up new jmpbuf to start executing at forkret (see below).
memset(&np->jmpbuf, 0, sizeof np->jmpbuf);
np->jmpbuf.eip = (uint)forkret;
np->jmpbuf.esp = (uint)np->tf - 4;
- // Copy file descriptors
- for(i = 0; i < NOFILE; i++){
- np->ofile[i] = p->ofile[i];
- if(np->ofile[i])
- fileincref(np->ofile[i]);
- }
-
- np->cwd = iincref(p->cwd);
+ // Clear %eax so that fork system call returns 0 in child.
+ np->tf->eax = 0;
return np;
}